Martes 21 de febrero de 2017

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

¿Qué son y cómo utilizar direcciones IP flotantes en DigitalOcean? [Vídeo]

Un problema que teníamos los que utilizamos los servicios de Digital Ocean es que cuando paras una máquina para realizar una actualización, la dirección IP de la misma es inaccesible y dejas a todos tus visitantes en la estacada y mi humilde blog sin visitas ni nada que le diga a mis visitantes que sigo vivo.

Al menos sucedía así hasta hace un tiempo, cuando lanzaron las IP flotantes o Floating IPs.

Te lo cuento

Si prefieres leerlo todo, puedes saltarte el vídeo. Aunque son 3 minutos.

Para más información, sigue leyendo…

El problema

En DigitalOcean la asignación de direcciones IP públicas va por cada uno de los servidores que reservas. Eso por un lado quiere decir que todos VPS que pides están conectados a Internet (¿Quién puede querer que un VPS no esté conectado? Lo veremos pronto). Y por otra parte, podemos comprobar cómo las direcciones pueden cambiar. Es decir, nadie nos garantiza que cuando sacamos una máquina de nuestro sistema, cuando metamos otra, ésta vuelva a tener la misma dirección IP. Es verdad que en muchos casos es así, pero es que Digital Ocean no es capaz de saber si vamos a crear una máquina tras destruir una antigua.
Por otro lado es muy común que en un servidor hagamos tareas de mantenimiento y, durante ese tiempo, no deberíamos tener ninguna entrada de visitantes. Se pueden encontrar con cosas que no deben, fallos, de esos que asustan a los visitantes y podemos exponer información del sistema de esa que hace que a un atacante se le iluminen los ojos.
Otro caso, que es muy es cuando tenemos que rehacer el sistema (hay veces que una reinstalación sale más barato que actualizar), reservemos una máquina nueva y empecemos a trabajar en ella. Mientras tanto, todos los visitantes estarán accediendo a nuestra web alojada en nuestro servidor antiguo. Pero, cuando hayamos terminado de montar la nueva máquina, después de hacer pruebas y todo, cuando esté a punto, hacer un cambio de IP del servidor viejo al nuevo…

La solución de DigitalOcean

En este caso, DigitalOcean nos presenta las IPs flotantes. Esto son direcciones IP que podemos “enchufar” a un servidor. De modo que nuestros visitantes y usuarios accederán siempre a la IP flotante. Dejando la IP del servidor para un uso privado e interno, todavía no podemos eliminar dicha IP para que no sea accesible, aunque sí podríamos filtrarla por IPtables por ejemplo.

Ya que estas IP son “enchufables”, pueden estar conectadas a nuestro servidor web, y nuestros visitantes acceder a dicha IP. La ventaja es que esta dirección la podemos desenchufar de un servidor y enchufar en otro sin problema y de forma instantánea. Anteriormente podíamos actualizar la DNS del dominio para cambiar la IP, aunque la propagación DNS ha mejorado mucho los últimos años, puede tardar varios minutos o incluso horas en el peor de los casos, y dependiendo de nuestro proveedor.

Enchufando y desenchufando

Ya que podemos hacer lo que queramos, practiquemos un poco. Y es que si vamos a realizar tareas de mantenimiento en el servidor que requieran desconectar el servicio, en lugar de dejar a nuestros visitantes con la dirección IP de nuestra web sin respuesta podemos crear un pequeño VPS con un servidor web y que dirija a una página estática que diga: “Lo sentimos, estamos de mantenimiento”. Seguro que encontráis por Internet plantillas muy buenas con páginas que hagan que nuestros usuarios no quieran matarnos, sino que nos den su apoyo por querer mejorar el servicio. Una vez creado el VPS que sirve páginas estáticas (muy importante, porque si son dinámicas seguramente necesitemos más servidor), vinculamos la IP flotante que apunta al servidor que tenemos que parar a nuestro nuevo servidor de páginas estáticas. En este momento, nuestros usuarios comenzarán a entrar al servidor de “vuelva más tarde”. Así no perderemos desesperaremos a nuestras visitas o clientes mientras mejoramos nuestro servidor. Incluso podríamos dejar algunos servicios mínimos activos.

Como decíamos antes, también podemos empezar a trabajar en una actualización de nuestros servicios poco a poco, reinstalar una nueva máquina y luego cuando esté todo hecho cambiar la IP flotante de nuestro servidor al nuevo, seguidamente destruir el antiguo servidor, que ya no nos importa.

Como vemos, son muchas las posibilidades que nos da tener IPs flotantes cuando contratamos el servicio. Y, a partir de ahora es una buena práctica cuando trabajamos con esta empresa. Aunque para otros servicios en la nube suele haber conceptos parecidos, esto de enchufar y desenchufar direcciones IP no es nuevo y podemos ponerlo en práctica en otros proveedores.

Jugando con la API

DigitalOcean, tiene una ventaja añadida, desde el primer día, y es su API. Desde ahí nos dejan tocar muchas y, sobre todo, automatizar acciones. Podemos crear y destruir droplets, administrar DNS, imágenes, e IPs flotantes, tamaños de servidores, etc… pero hoy vamos a hablar de la API de metadatos de DigitalOcean. Esta API hace que desde una misma instancia se pueda acceder a información sobre la misma. Es decir, que una misma instancia pueda preguntar su dirección IP pública, o privada, o la IP flotante, conocer su ID, etc.

Aunque ya que utilizamos GNU/Linux sabemos que podemos utilizar ifconfig para sacar direcciones IP locales, combinandolo con grep, cortando la cadena resultante, etc, las llamadas a la API de DigitalOcean suelen ser más directas. Además, nadie nos dice que en el futuro este proveedor no cambie la forma en la que asigna las direcciones IP a nuestra máquina (Amazon lo hizo hace unos años), haciendo que nuestra antigua forma de hacerlo no sea efectiva ya. Además, con estas llamadas a la API de metadatos podremos crear scripts generales que podremos subir en varias máquinas y cada uno averigüe información de la máquina por sí mismo.

Todas estas llamadas se hacen haciendo una petición GET a http://169.254.169.254/ , al ser una conexión interna y directa no necesita protocolo SSL (y es tan rápida que el servicio estará alojado en la misma máquina física). Esta llamada la podemos hacer con cURL, o desde cualquier lenguaje de programación. Tenemos algunas llamadas interesantes, como por ejemplo:

  • Extraer hostname de la máquina:
    curl -s http://169.254.169.254/metadata/v1/hostname
  • Extraer IP pública:
    curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address
  • Extraer IP privada:
    curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address
  • Extraer información del usuario (esta información con algún script de inicialización para la máquina):
    curl -s http://169.254.169.254/metadata/v1/user-data
  • Extraer región geográfica:
    curl -s http://169.254.169.254/metadata/v1/region
  • Extraer etiquetas:
    curl -s http://169.254.169.254/metadata/v1/tags
  • ¿Tenemos IP flotante? (true/false)
    curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/active
  • Extraer IP flotante:
    curl -s http://169.254.169.254/metadata/v1/floating_ip/ipv4/ip_address

Y con esta información podremos hacer muchas cosas.

¿Quieres un servidor en Digital Ocean?

Este post no es patrocinado. Sólo quería compartir esta utilidad de este servicio que utilizo. Aunque aprovechando esto, ya que estamos, si quieres contratar el servicio con este proveedor, si te registras de mi parte te darán $10 para gastar en hospedaje. Aunque sea en dólares puedes contratarlo con independencia de tu país.
Para contratar el servicio de mi parte, sigue este enlace: https://m.do.co/c/fa10e4099dbc.
Y yo también me llevaré algo por recomendarte.

The post ¿Qué son y cómo utilizar direcciones IP flotantes en DigitalOcean? [Vídeo] appeared first on Poesía Binaria.

Asociación LiGNUx: Tutorial para instalar la versión final del kernel Linux 4.10

Lunes 20 de febrero de 2017

Asociación LiGNUx: Ya viene el LibrePlanet 2017

Domingo 19 de febrero de 2017

Marcelo Fortino

Marcelo Fortino
Fortinux

Tutorial Instalar PHP Server Monitor en Ubuntu GNU/Linux

En este tutorial vamos a instalar PHP Server Monitor en un servidor Ubuntu 14.04. PHP Server Monitor es una aplicación web open source que sirve para monitorear servidores web y/o sitios web.
Asociación LiGNUx: Tutorial para instalar la versión de mantenimiento del kernel Linux 4.9.11

Sábado 18 de febrero de 2017

Liher Sanchez

Liher Sanchez
El blog de Liher

Usar el icono del Launcher de Ubuntu para maximizar una ventana

El otro día os hable de como podemos minimizar todas las ventanas que tenemos abiertas de nuestro Ubuntu de una vez con una combinación de teclas para así poder ver nuestro escritorio. También os mostré como podéis añadir el botón de Mostrar escritorio al Launcher. Quizás esa opción debería venir por defecto, quizás no, pero la que os voy a comentar en este post me parece mas útil y si que debería venir activada, por lo menos esa es mi opinión. Se trata de que cuando tenemos una aplicación abierta, al hacer click en su icono en el Launcher, la ventana de dicha aplicación se minimice. Por defecto no viene activado, pero es muy fácil hacerlo.

Muchos dirán que las cosas que tienen que venir por defecto activadas o no en Ubuntu dependen de nuestra forma de movernos con el ordenador y que Cannonical no puede atender todas las peticiones o bien hacer un Ubuntu que sea del agrado de todos con estas pequeñas cositas, pero en fin, cada uno tiene su opinión 😀 Por suerte estas coas tienen muy fácil y rápida solución.

Personalmente, me parece que es muy útil que podamos minimizar las ventanas de los programas haciendo click en su icono, ademas de si esta minimizada poder ponerla en primer plano al hacer click también en su correspondiente icono. Digamos que es un comportamiento tipo dock que yo usaba mucho cuando tenia instalado el Cairo dock.

Si queréis que cuando una aplicación este abierta la podamos minimizar al hacer click en su icono en el Launcher de Ubuntu lo único que tenéis que hacer es abrir una Terminal y escribir el siguiente comando en ella:

gsettings set org.compiz.unityshell:/org/compiz/profiles/unity/plugins/unityshell/ launcher-minimize-window true

Solo hace falta teclear ese comando y pulsar Enter para poder disfrutar de esa posibilidad. Si, por alguna razón, queréis volver al estado inicial y no tener esa opción activada lo único que tenéis que hacer es teclear el mismo comando pero con “false” en vez de “true” al final, quedando el comando de la siguiente forma:

gsettings set org.compiz.unityshell:/org/compiz/profiles/unity/plugins/unityshell/ launcher-minimize-window false

Como podéis es bastante sencillo. Ahora solo queda que lo probéis y toméis la decisión de usarlo o no.

Un saludo a todos.

David González

David González
Blog Bitix

Ejemplo de RabbitMQ con Java para enviar y recibir mensajes

Entre las ventajas de integrar dos aplicaciones mediante el envío de mensajes están que evita que estén acopladas y la comunicación es asíncrona. Con RabbitMQ también podremos implementar cada uno de ellas con el lenguaje de programación que prefiramos de entre las varias posibilidades para las que ofrece clientes y por esto último podemos preferir usarlo en vez de las especificación JMS propia de Java EE que nos obligaría a usar un servidor de aplicaciones que lo implemente, posiblemente JBoss/Wildfly o Weblogic en vez de Tomcat o Jetty. En el artículo incluyo un ejemplo para el lenguaje Java mostrando el envío y recepción de mensajes junto con la aplicación de administración que nos proporcionará información útil.

RabbitMQ
Java

Las aplicaciones que se integran mediante el envío y recepción de mensajes evitan el acoplamiento y sincronía junto con la posibilidad de implementar cada una de ellas con diferentes lenguajes o plataformas. Entre las especificaciones que componen Java EE está JMS pero tanto la aplicación que envía como la que recibe mensajes deben estar programadas en el lenguaje Java, a menos que incluyamos un adaptador que permita a la aplicación no Java interactuar con JMS.

RabbitMQ es un software que proporciona una funcionalidad similar a JMS pero con la ventaja que ofrece soporte para los lenguajes más populares como Java y JVM, Ruby, Python, .NET, PHP, Node.js, Go y varias más. Usa varios conceptos similares a los presentes en JMS como que el emisor envía los mensajes a una cola y el receptor los lee de ella de modo que ni el emisor ni receptor se conocen consiguiendo de este modo el desacoplamiento entre ellos. Los mensajes son leídos de las colas con la posibilidad de que cada mensaje sea recibido por un único receptor o por cada uno de ellos.

Realmente en RabbitMQ los mensajes no son enviados directamente por el emisor a las colas sino que se envían a un exchange que finalmente lo enruta y encola en la cola destino. Los exchanges pueden ser directos basando su lógica de encolado según el valor del binding key enviada junto con el mensaje y un routing key asociada con la cola o basados en temas en los que se usa una cadena formada por una lista de palabras separada por puntos, la lógica de enrutado se toma según si el binding key cumple el patrón del routing key que puede contener sustituidores de palabras, siendo un * una palabra exacta y # varias palabras contiguas.

En la documentación de RabbitMQ hay 6 tutoriales en diferentes lenguajes para el envío y recepción de mensajes.

Basándome en estos ejemplos he creado un proyecto uno muy similar al Tutorial 1, ejecutable más fácilmente con Docker y Gradle.

Tanto en el emisor como en el receptor deberemos declarar las colas que van a usar (si una no existe se creará y si existe se usará), a la cola se le asigna un nombre y el receptor define un manejador para recibir los mensajes según se envían.

Para ejecutar el ejemplo usaré el contenedor de Docker para RabbitMQ iniciándolo con Docker Compose y el siguiente archivo descriptor. Puedes consultar la serie de artículos sobre Docker que escribí para conocer cómo usarlo.

Una vez iniciado el contenedor y con el código fuente del ejemplo, iniciamos en cualquier orden la parte receptora de los mensajes y la parte emisora de mensajes con los comandos ./gradlew receive y ./gradlew send respectivamente, momento en el cual veremos que en la consola salen las notificaciones de recepción y envío.

En la comunicación con RabbitMQ se puede usar TLS/SSL así como mecanismos de autenticación y autorización para mayor seguridad. Usando confirmaciones si el receptor falla en el procesado el mensaje no se pierde ya que no se habrá declarado como acknowledge aún así si RabbitMQ falla los mensajes se perderán a menos que las colas se declaren como persistentes las cuales se guardarán en disco perdurando a una catástrofe.

RabbitMQ posee un plugin para la administración con el que podemos administrar permisos, tener una vista global, ver ratios de mensajes, estadísticas, colas, exchanges y más información, nos da información muy interesante sobre el estado del procesamiento de mensajes. Es accesible mediante el navegador y la URL http://localhost:15672/. En la captura del estado de la cola hello hay 10 mensajes encolados pendientes de entregar a algún receptor.

Para profundizar más en las aplicaciones basadas en mensajes con RabbitMQ dos buenos libros son Learning RabbitMQ y Matering RabbitMQ cubriendo temas más avanzados como clustering, alta disponibilidad, arquitectura, patrones de diseño, seguridad y rendimiento.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando docker-compose up && ./gradlew receive && ./gradle send.

Jueves 16 de febrero de 2017

La fuente tipográfica Eau de Garamond

Este artículo es parte de la serie Recomendando fuentes tipográficas Combinar tipografías en forma armoniosa es un difícil arte. Algunos diseñadores tipográficos nos facilitan las cosas ofreciendo «familias» de fuentes como Libertinus, Source pro, PT, Alegreya, etcétera. ¿Pero qué fuente «sans» tenemos que se lleve bien con una «garamond»? De la gente que produce Cormorant […]
Miguel Parada

Miguel Parada
Ubuntizando.com

Si es de Apple no lo toques. Apple declara la guerra a las reparaciones domésticas en EEUU

Este podría ser como el guión de una película que podría comenzar así: “Vaya, mi iPod ha dejado de funcionar. La entrada Si es de Apple no lo toques. Apple declara la guerra a las reparaciones domésticas en EEUU aparece primero en Ubuntizando.com.

Para leer completa esta publicación haz click sobre el título

Ukui entorno de escritorio Windows en Linux

Como hemos hablado ya muchas veces en el blog, dar el salto desde un sistema operativo de windows a cualquiera de las distribuciones de Linux, siempre da un poco de vértigo, sobretodo a usuarios que se califican a ellos mismos como no muy calificados para temas informáticos, sin saber, que si lo son.  Si alguna vez has intentado cambiar y pasarte a Linux, pero lo peor que llevabas era

Miércoles 15 de febrero de 2017

Miguel Parada

Miguel Parada
Ubuntizando.com

Concurso VANT miniMOOVE

“We love Linux, We love Vant!” Bajo este lema queremos presentar el concurso en el que con la colaboración de VANT hemos La entrada Concurso VANT miniMOOVE aparece primero en Ubuntizando.com.

Para leer completa esta publicación haz click sobre el título
Miguel Parada

Miguel Parada
Ubuntizando.com

Anuncio ganador del Concurso VANT miniMOOVE

Ya tenemos ganador del concurso que gracias a la colaboración de VANT anunciamos en el blog la semana pasada. Primeramente La entrada Anuncio ganador del Concurso VANT miniMOOVE aparece primero en Ubuntizando.com.

Para leer completa esta publicación haz click sobre el título
José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Configurar compresión gzip en nginx

nginx La compresión de lo que el servidor web envía al cliente es una de las técnicas más sencillas para mejorar la respuesta de nuestras webs. En nginx lo habilitamos facilmente a través de las directivas adecuadas del archivo nginx.conf en el directorio /etc/nginx. Por defecto suelen aparecer pero comentadas. Una configuración típica podría ser esta:

 ##
# Gzip Settings
##

gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/vnd.ms-fontobject application/x-font-ttf font/opentype image/svg+xml image/x-icon;

La información de que hace cada línea la tienes aquí. Y no olvides que una vez hechos los cambios debes reiniciar el servidor web para que tomen efecto.

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Configurar compresión gzip en nginx || Hospedado en un Cloud VPS de Gigas.

Lunes 13 de febrero de 2017

Liher Sanchez

Liher Sanchez
El blog de Liher

Los juegos que me gustan

Siempre me han gustado los videojuegos. Muchos de los que usamos ordenador hemos tenido épocas en las que los hemos usado, en mayor o menor medida. En mi caso ha habido muchos juegos que me han gustado y me gustan y quiero hablaros un poco de ellos, ademas de recordaros algunos que seguro conocéis.

Mi primer ordenador lo tuve con 14 años, era un 386 con 2 MB de RAM y 43 MB de disco duro. Por aquel entonces los juegos venían en uno o varios disketes de 3 ½. Seguramente algunos de vosotros no hayáis usado este medio, os dejo una imagen para que los podáis conocer:

 

disketes

 

Tenia una capacidad de 1,44 MB, algunos juegos ocupaban varios disketes y otros entraban de sobra en ellos. De aquella época guardo buenos recuerdos de varios juegos en especial de 3. El primero es The secret of Monkey island era un juego de tipo aventura gráfica en el cual tenias que ir saliendo airoso de varias situaciones gracias a tu ingenio, era un juego gracioso y entretenido del que seguro que muchos de mi generación guardan un buen recuerdo.

 

the secret of monkey island

 

Otro juego fue Prince of persia, era un juego de plataformas y lucha en el cual tenias que ir por diferentes niveles para rescatar a un princesa. Estaba muy entretenido y me gustó mucho.

 

prince of persia

 

El tercero es Warcraft, un juego de estrategia de guerra en el cual tenías que crear una aldea, recolectar recursos, prosperar y conquistar otras aldeas, muy parecido a Clash of clans.

 

 

Por supuesto que jugué a muchos mas juegos, pero esos tres son los que más me gustaron de aquella época.
Posteriormente, al ir cambiando de ordenador y tener una máquina más potente puede ir accediendo a juegos mas actuales como el FIFA o el Quake. Uno que me gustó mucho también fue el Age of Empires, en la linea del Warcaft, siempre me gustaron ese tipo de juegos de estrategia y guerra.

Con 22 años, mas o menos, tuve mi primera consola de videojuegos, la PS One, con ella tuve una enganchada importante al Gran Turismo 2, de hecho conseguí pasarme el juego entero. Prácticamente solo jugaba a ese juego, aunque el Driver y el FIFA me ocuparon muchas horas también.

También tuve una época en la que usaba un emulador llamado MAME con el cual se podían usar juegos de casi todas las videoconsolas y las máquinas recreativas, en un DVD podías tener el emulador en sí mismo y miles de juegos, desde los de Atari de los años 80 hasta juegos como el Tekken.

Hace tiempo que no tengo videojuegos en el ordenador, a día de hoy no tengo ninguno, ya que como se que soy de fácil enganche lo mejor es no tener ningún instalado, conócete a ti mismo ;D

También tuve una temporada en la que jugaba a algún juego online. Uno de ellos era un juego de poker. Al principio estaba bastante perdido con las reglas y el valor de las posibles combinaciones pero en Internet siempre podemos encontrar ayuda como en esta página, en la cual podemos aprender todo lo necesario gracias a un glosario del juego, y así podemos mejorar nuestra habilidad y aumentar nuestros conocimientos sobre un juego del que mucha gente piensa que es cuestión de azar y no es así, necesitamos de destreza e ingenio para jugar bien.

A día de hoy el único juego que uso es el Clash of Clans, siempre me han gustado los juegos de estrategia y con el tengo el entretenimiento que necesito. Aun a pesar de ser un juego sencillo, tiene un sinfín de posibilidades. Atacar una aldea y ganar el ataque, a la vez que tener una buena defensa en tu aldea es como una partida de ajedrez donde cada elemento tiene un propósito y hay que averiguar la mejor forma de usarlo. De echo tengo en mente crear una web sobre el juego con consejos, diseños de aldea y demás, aunque voy poco a poco.

 

clash of clans

 

Y bueno, eso es un poco todo, la verdad es que me encantaría que compartieseis los juegos que usáis, aquellos que más os gustan o los que recordáis con nostalgia. Un saludo a todos.

Domingo 12 de febrero de 2017

Liher Sanchez

Liher Sanchez
El blog de Liher

Las ventajas de Internet para los negocios

Hace poco mi actual pareja ha abierto una tienda de ropa en la localidad en la que vivimos. He intentado ayudarla en todo lo que estaba en mi mano y la verdad es que han sido un par de meses de auténtica locura. Entre obras, permisos, papeleos, bancos, asesores y todas las pequeñas cosas que tiene el abrir un negocio y que van surgiendo día a día. Y todo ha sido mucho mas fácil teniendo en cuenta que es una franquicia y que te facilitan mucho las cosas, además el equipo de trabajo que ha venido nos ha hecho todo muy bien y estamos muy contentos con su labor, han sido muy profesionales y competentes.

Entre todo lo que hemos tenido que hacer ha habido una cosa, de la que os voy a hablar a continuación, que ha sido la culpable de este artículo, la publicidad. La localidad en la que vivimos, Galdakano, tiene unos casi 30.000 habitantes y es muy importante darse a conocer, para que así todos sepan que se ha abierto la nueva tienda. Para ello, aparte de otras cosas, hemos hecho un folleto o flyer para repartir por las viviendas del pueblo. El diseño lo hemos hecho nosotros y ahora nos toca imprimirlo y repartirlo. Necesitamos alrededor de unas 10.000 copias para llegar a todo el pueblo. Entonces nos pusimos a buscar una imprenta en la que imprimirlas y miramos una de nuestra localidad para pedirles presupuesto. Bien, pues para hacer esas 10.000 copias nos pedían unos 250 euros.

Entonces se nos ocurrió mirar por Internet para ver que encontrábamos y nos llevamos una gran sorpresa. Encontramos una empresa en Castellón que tiene unos precios muy atractivos y les llamé. No pensaba que contratar una imprenta online fuese lo adecuado, mas que nada por el posible precio del envío ya que lo que quería encargar pesaría bastante, pero no es así. Siento decir que no recuerdo el nombre de la mujer con la que hablé, pero me atendió muy bien y después de unas cuantas preguntas todo el proceso quedó muy claro, sólo tenía que mandarles por email el diseño siguiendo unas pautas y, por mucho menos dinero que la empresa de mi localidad, me envían las 10.000 copias a casa, ¿que más se puede pedir? Pues bien, dicha empresa se llama Marcaprint y esta misma semana les enviare el diseño de la publicidad para que me impriman las copias que necesitamos.

 

 

Muchas veces no nos paramos a pensar en que Internet nos puede facilitar mucho las cosas y a día de hoy hay que tenerlo muy en cuenta para todo y, como no, para los negocios. Es mas, si lo pienso bien, debería acudir mas a Internet, con la de años que llevo usándolo para muchas cosas y a veces pienso que algunas cosas es mejor hacerlas en persona, pero no es así, a los hechos me remito.

Cuando hayamos hecho todo os contare como ha ido la experiencia con ellos, de momento el trato con ellos ha sido genial.

Un saludo a todos.

José María Morales Vázquez

José María Morales Vázquez
tecnología – Un lugar en el mundo…

Status Cake,una alternativa gratuita a pingdom

herramientas Seguro que conoces Pingdom, la popular herramienta web de monitorización que dispone de 14 días de prueba gratis, pero lo mas probable es que no conozcas Status Cake, una alternativa totalmente gratuita en su opción básica (perfectamente funcional) con una alternativa comercial más avanzada.

panel principal de status cake

Status Cake dispone de monitores http, dns, smtp, ssh, ping y tcp genéricos. En su opción gratuita realiza tests de entre 5 minutos y 24 horas y elige aleatoriamente el servidor desde el que se realiza la prueba (aunque puedes indicarle si quieres confirmación del estado desde diferentes lugares) y te alerta por correo de cualquier incidencia. En la opción de pago admite que elijas manualmente desde donde se harán las pruebas, granularidad de hasta 1 minuto en los tests y alertas por SMS.

Además, disponemos de completos paneles informativos de las incidencias y tiempos de respuesta de los diferentes monitores como puedes ver en los siguientes pantallazos:

status cake key details

status cake status periods and downtime root causes

status cake latest tests

Y informes más “ejecutivos” que pueden enviarse directamente por email para informar al jefe de nuestro buen trabajo 🙂

status cake email reports

Otra alternativa más también gratuita es Uptime Robot pero después de evaluarlas ambas me quedo con Status Cake. Ahí te dejo también el enlace por si quieres echarle un vistazo 😉

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Status Cake,una alternativa gratuita a pingdom || Hospedado en un Cloud VPS de Gigas.

Sábado 11 de febrero de 2017

David González

David González
Blog Bitix

Cómo crear un servicio de systemd para una aplicación con Spring Boot

La mayoría de distribuciones Linux ya usan systemd como gestor y supervisor de los servicios del sistema. Creando un descriptor podremos gestionar un servicio propio con los mismos comandos de systemd que usamos para cualquier otro servicio del sistema.

Linux
Java

Habiendo creado una aplicación o microservicio, por ejemplo con Spring Boot, necesitaremos que se inicie con el sistema y una forma de gestionarlo para detenerlo, reiniciarlo y que se reinicie en caso de salida abrupta.

systemd es el gestor de servicios que han adoptado la mayoría de distribuciones importantes como Debian, CentOS, RHEL, openSUSE, incluso Ubuntu después de abandonar su propio gestor de servicios Upstart. Podemos usar systemd para que gestione como servicio una aplicación propia. Para ello deberemos crear un archivo unit que describa el servicio y sus dependencias con otros servicios para que se inicie correctamente, él y sus dependencias.

Los servicios se definen en archivos de texto denominados unit que tienen un formato similar a los archivos .desktop que a su vez están inspirados en los archivos .ini de Windows. En la documentación de los archivos unit de systemd se detalla con amplitud los archivos unit de systemd, tienen tres secciones:

  • [Unit]: contiene información genérica independiente del tipo de servicio como descripción, requerimientos, deseos o orden de inicio.
  • [Service]: define el tipo de servicio, los comandos de preinicio, inicio, postinicio, parada, postparada, condiciones reinicio y más parámetros comentados en la documentación de los sevicios de systemd.
  • [Install]: esta sección es usada al habilitar o deshabilitar un servicio en el sistema con el comando systemctl, pudiendo por ejemplo que se inicie este servicio cuando otro se inicie siendo otra forma de declarar dependencias. De este modo se puede indicar que un servicio tiene otros como dependencia pero también se puede indicar que un servicio se inicie cuando otro lo haga.

Usando la aplicación del Ejemplo de API REST en Java con JAX-RS y Spring Boot, crearé un archivo unit de systemd para que se inicie con el sistema y se reinicie en caso de fallo. Primeramente deberemos crear los archivos que definen el servicio para systemd y sus dependencias si las tienen. En los siguientes ejemplos spring-boot-jaxrs.service es una aplicación de Spring Boot con una interfaz REST que simplemente devuelve el mensaje indicado por parámetro con la fecha en la dirección http://localhost:8080/message?message=Hola. spring-boot-jaxrs-postgres.service es el mismo servicio pero que tiene una dependencia sobre un contenedor de Docker con una base PostgreSQL, aunque la aplicación Spring Boot no hace uso de la base de datos PostgreSQL sirve para observar que si se inicia el servicio de la aplicación Java también se inicia el servicio de la base de datos si no estuviera ya en ejecución. postgres.service es el servicio de la base de datos PostgreSQL en un contenedor de Docker y que tiene como dependencia el servicio de Docker.

<noscript><a href="https://asciinema.org/a/102785" target="_blank"><img src="https://asciinema.org/a/102785.png" width="734" /></a></noscript> Servicio de systemd para una aplicación con Spring Boot

La instalación de la aplicación y de los servicios de systemd en el sistema se realizan copiando archivos, cambiando algunos permisos y usando los comandos de systemd para gestionar los servicios. Los mensajes de salida que emite el servicio se obtienen con el comando journalctl -u spring-boot-jaxrs.service.

Los archivos unit propios deben ser ubicados en el directorio /etc/systemd/system/, siendo el directorio /usr/lib/systemd/system/ donde se ubican los instalados por los paquetes del sistema. Iniciado el servicio con el comando sudo systemctl start spring-boot-jaxrs.service, si queremos habilitarlo con el inicio del sistema usamos el comando sudo systemctl enable spring-boot-jaxrs.service. Para ver el estado del servicio usamos el comando sudo systemctl status spring-boot-jaxrs.service.

En los enlaces de referencia hay documentación más detallada tanto para gestionar los servicios con systemd como también documentación de sus archivos unit.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando sudo systemctl start spring-boot-jaxrs.service.

Miércoles 08 de febrero de 2017

David González

David González
Blog Bitix

Conferencia BilboStack 2017

Cuando me inscribí en la BilboStack para reservar entrada no me llamaron mucho la atención las presentaciones del programa pero ya a una semana de decidir a cuales iba a ir definitivamente he tenido dificultades para elegir y en varios casos me hubiese gustado ir a las de los dos tracks. Como años anteriores la BilboStack se ha celebrado en Bilbao en el mismo emplazamiento de la Universidad de Deusto pero volviendo como en años precedentes al edificio de las ingenierías. Otro cambio ha sido que este año fueron cuatro presentaciones por track cuando en años anteriores fueron cinco.

El número de asistentes ha sido numeroso quedando algo de sitio libre en el track 2 que era un aula pero en la sala de conferencias del track 1 aunque tiene cómodas butacas salvo por su estrechez el sitio libre era inexsitente de modo que en algunas presentaciones ha habido algunos asistentes que han debido estar de pie.

BilboStack 2017
Universidad de Deusto

Este era el programa completo con su horario, temas muy distintos y variados como Xamarin, internet of things, el siempre presente JavaScript con Angular y Node, Lean Analytics y DDD entre algunos otros de la siguiente agenda:

Hora Track 1
09:30-10:20 Xamarin.Forms en el mundo real™ : Verdades y Mitos por Josué Yeray
10:30-11:20 Una visión de Angular 2 y TypeScript por Hugo Biarge
11:20-11:50 Café
11:50-12:40 Lights, Camera, Node! por Catalina Oyaneder
12:50-13:40 Domain-Driven Design, uniendo negocio con el software por Gorka Laucirica y Beñat Espiña
Hora Track 2
09:30-10:20 Invisible o desaparece... por Isabel Cabezas y Juliet Moreiro
10:30-11:20 Érase una vez... el Design System por Naiara Abaroa
11:20-11:50 Café
11:50-12:40 Agile for scrummies por Jorge Uriarte
12:50-13:40 Lean Analytics, mi faro de cabecera por Carlos Iglesias
Agenda

Al igual que en ediciones previas hago un pequeño resumen de las presentaciones a las que asistí. Los resúmenes no le hace justicia a las grandes ponencias que fueron en realidad pero espero haber captado y transmitir aquí escuetamente las ideas básicas que se expusieron. Y con este es el tercer resumen consecutivo que escribo de la BilboStack, los anteriores (y posteriores que si tengo oportunidad espero escribir) de esta serie de artículos están al final de este artículo.

Invisible o desaparece… por Isabel Cabezas y Juliet Moreiro

El IoT o esos pequeños dispositivos que tienen conexión a internet están surgiendo como una forma de ayudarnos en algunas situaciones cotidianas como cambiar la ruta cuando hay un accidente para no llegar a un atasco o encender la calefacción antes de llegar a casa o antes de levantarnos, espejos que proporcionan información como notificaciones o el tiempo o un centro comercial que te posiciona y ofrece ofertas según la localización en la que estas y tus hábitos de consumo. Aparatos como Amazon Echo son asistentes a través de los cuales mediante comandos de voz podemos realizar acciones como pedir comida a domicilio.

Estos aparatos conectados a internet nos ofrecen una nuevo área posibilidades. Muestra de ellos es la demostración presentada que consistía en base a los mensajes escritos en Twitter iluminar una lámpara PLAYBULB con color verde si eran positivos, rojo si eran negativos y azul si eran neutros haciendo uso de Microsoft Cognitive Services y de algunas de sus APIs para evaluar el sentido de los mensajes. Por ejemplo el mensaje BilboStak is an awesome event! se evaluará como positivo y sumará a la media para que la lampara cambie a color verde.

El hardware era la propia lámpara y una placa de computación Intel Edison junto con un servicio en la nube de Azure pero perfectamente podría ser una Raspberry Pi u otra de las numerosas pequeñas placas que están surgiendo en este nuevo mercado. El código fuente del ejemplo está compartido en un repositorio de GitHub.

Referencia:

Érase una vez… el Design System por Naiara Abaroa

El diseño de una página es una parte importante de la misma, no considerarlo así seguramente nos encontremos con problemas.

  1. Requiere de un conocimiento específico para hacerlo bien y esta es la habilidad que posee un front-designer.
  2. Falta de arquitectura de CSS a pesar de que existen herramientas como Sass o less se sigue produciendo código espagueti.
  3. Hay duplicidades y está poco estructurado.
  4. Falta de coherencia en la tipografía, color, …
  5. Problemas de especifidad al no considerar la evaluación en cascada y el orden de precedencia de inline, id, clases y elementos con lo que se ha de usar el denostado !important como último recurso.
  6. Mezcla de varias convenciones, en el nombrado de elementos.

La solución es el Design System consiguiendo primero claridad, segundo eficiencia y finalmente «belleza». Siguiendo el Atomic Design se consigue una mayor reutilización y facilidad de mantenimiento combinándolo con herramientas como Sketch para el desarrollo de mockups.

Algunos recursos de diseño e implementaciones conocidas de Design Systems son:

Referencia:

Agile for scrummies por Jorge Uriarte

La situación respecto a las metodologías de desarrollo ha cambiado, hace 10 años había resistencia al cambio ahora se aplica pero tampoco resuelve mágicamente los problemas del desarrollo de todos los casos donde se usa.

Algunas esencias de scrum que permanecerán son:

  • En el producto: no detallar en exceso el backlog ya que cambiará.
  • En las historias: siendo completas, entregables individualmente y según el valor que aportan.
  • En los equipos: siendo estos autoorganizados, multidisciplinares, alineados, dueños del proceso y autónomos.
  • En las entregas: serán incrementales y continuas.
  • En el proceso: no estará sacralizado y cambiará con el fin de mejorar al igual que tratan de conseguir las retrospectivas.

Un sistema ágil es una aproximación a la incertidumbre. Incertidumbre que siempre está presente en los desarrollos de software al tratar de responder preguntas como ¿que hay que hacer? ¿cuanto tiempo se tardará? ¿que tecnología se usará?. Para evitar los problemas que genera la incertidumbre un work in progress o WIP pequeño es un buen arma. Lo terminado elimina incertidumbres, se considera que es lo menos que se puede hacer ahora que de el máximo valor. Una consecuencia es que en el flujo de desarrollo habrá menos cosas pero pasando más rápido. Esto se resume en título del libro Stop Starting, Start Finishing! y que tiene la siguiente reseña.

This booklet tells the story of Justin - a project manager who achieved remarkable results with his team by doing very simple things! This guide covers the core concepts of Kanban for knowledge work, and shows how limiting your amount of work-in-progress can lead to getting things done better and faster.

La combinación de un WIP pequeño junto con un sistema pull en el que no se construye lo no necesario, no se prueba lo que no se puede entregar, no se desarrolla lo que no se puede probar y no se especifica lo no se puede desarrollar produce una reducción de tiempos de entrega, hay mayor predictibilidad y elimina rehacer trabajo.

Referencia:

Domain-Driven Design, uniendo negocio con el software por Gorka Laucirica y Beñat Espiña

El Domain-Driven Design o DDD se centra en el dominio de la aplicación, la lógica de negocio y lo que quiere el negocio de la aplicación.

Los modelos anémicos con getters y setters se consideran un antipatrón y hace que la lógica esté dispersa. En el patrón MVC los controladores pueden contener múltiples responsabilidades generando duplicidad de código. Aplicar los principios SOLID generan código limpio y una arquitectura hexagonal ayuda a no crear en la aplicación una dependencia con el framework posibilitando usar por ejemplo Symfony como herramienta y no como base.

DDD se divide en patrones estratégicos (bounded context) que no tienen código y tácticos (entities, agregados, eventos de dominio, factorías, repositorios) que si tienen código. Hay un servicio para cada caso de uso de la aplicación. Para cosas simples junto con su curva de aprendizaje esto seguramente será demasiado complejo pero en los casos en los que haya lógica de negocio, equipos medianos/grandes si será útil.

Un ejemplo de aplicación donde han aplicado DDD es Kreta.

Referencia:

Nuevamente gracias la dedicación de los organizadores por crear otra edición de este gran pequeño evento anual, los ponentes que altruistamente colaboran compartiendo su conocimiento y a la Universidad de Deusto por acoger un año más uno de los mejores eventos para desarrolladores de Bilbao y alrededores.

Darling, instala aplicaciones MacOS en Linux

¿Alguna vez has soñado con poder instalar alguna de las aplicaciones que sólo están disponibles para mac en tu sistema operativo Linux? pues estás de suerte, puede que tus sueños muy pronto se hagan realidad, sigue leyendo este artículo. Todos sabemos que podemos usar medianamente bien aplicaciones del archiconocido Windows en cualquier distribución de Linux, haciendo uso de Wine,

Martes 07 de febrero de 2017

Ramón Miranda

Ramón Miranda
Ramon Miranda

TRUN videogame cover for VGsource


Talking about TRON is talking about a classic science fiction film and one of the best tributes to creativity and imagination in the world of cinema. Somewhat misunderstood film at first, but time makes justice and put TRON in its place. And if we talk about mythical elements of the film, we have to talk about bikelight racings ...

TRUN is a videogame created in Z80 assembler based on  original TRON.
The creators of the game are Vgsource, an indie development group that codes for MSX.
A few months ago, I was contacted to design their videogame cover and thus give it a greater visual impact.
It was an interesting work because from the first moment we looked for a 80's look"  immitating the style of covers of the era of Dinamic or Topo (spanish companies), where Azpiri was king illustrating those beautiful casettes and the less important was the result on screen (at least for people like me)
The first thing I did was to take references, and as it was not going to be otherwise the TRON movie itself was the main source of inspiration. I had several keys in mind while painting this illustration:
  •     blue
  •     Light
  •     No Fx overlay.
  •     Speed
  •     80's smell
Do you want to see how development was? Then we analyze the different phases briefly.

Sketches Phase

After analyzing what I want to emphasize in the image I start working on the sketches.
These are not very detailed drawings, but you can see the main elements of the design.


I decide for the first by movement feeling.



As we know the diagonals add movement to the composition and as I want to transmit speed I choose the design with that scheme and the broad to be able to study where to place each thing. Something that in the end I will change are the bikes. Finally will be even more "homage" to the original light bikes designed by Syd Mead.

References Phase

Being the game a "clone" of the game of TRON does not seem crazy to me to take references of the film. Since we are going to make a copy of a classic we will do well. Let it be noticed! That's why I create a composition with multiple references to then paint over what I need and get the result I want, not so photo but 2d. There is still a lot of work left. This system is not the only one I use for my illustrations.
This is the result of collage done inside Krita. All images have their corresponding copyright. We only use this as an idea. At the end, 100% of the illustration is repainted.



From this point we will work the Backgrounds. For the backgrounds, brushes that are quick for "covering big areas" are usually used. I use a brush that has the characteristic that diffuses the paint when low pressure is used and is adding more paint as the pressure increases. This is what I show you in the capture.




It has a Knive effect and belongs to the set I made for the DVD of the krita foundation #muses. If you are interested you can download it here totally free.

PACK bundle muses

Note: If for some reason you see that this brush produces somekind of "Lag", a very useful thing that speed up this brush and many of Krita's brushes is to use the "precision" parameter inside the brush editor and lower it from 5 to 1 If you also use large sizes you can increase the brush spacing to 0.5 or 0.7. It can be further optimized to gain speed in very large sizes.




Beyond it you will see that it is very fluid but loses a little of quality. These brushes require important computation operations for the CPU but give very interesting results.
What I want is to blur the photo effect but respecting the colors that are underneath while still being spots and at the same time giving me more freedom to paint over. You will see that the result is very pictorial. Handcrafted within the digital.

 
Now it's time to start defining all the elements of the image.
The face in the photo does not show an emotion according to what I look for, come on man! You're playing with your life in a race! :)
I have created this Gif for those who like to follow the evolution of the steps to follow.


You can see how the lighting changes as I work the metal. The gif was done with Gimp. It explains much more than a page of text. Among other things it is seen how the light is affecting the face of the character and his helmet.

The same thing happens in the background. When I go detailing the bikes and the kind of hangar where they come from.

When completing the image we run the risk of adding too many details. So beware of the Glow and the additive or color dodge modes that hook.
Making lines or curves accurately is complicated with freehand so one way to avoid headaches is to use paint assistants.

For example a use would be in the curve that defines the motorcycle panel of the character.


LightBykes

A main element of this image are the light bikes. Let's do something simple so we do not separate too much from what will be seen on the screen.


 

The problem as I see it is that the bikes need some lines of movement. This will convey more sense of career. In the end I choose lines not on the whole bike but in part. The result is something more shocking.


Logotype design for the cover

All we have left to do is create a logo for the cover design. For that task I better use an image editor like Gimp and a vector design program like Inkscape.

In Gimp I select the text tool with the previously downloaded typography that is very similar to TRON.


To vary slightly the layout i adjust and complete the contour of the word "TRUN" That way I have a good basis for editing in Inkscape and that can be adapted to any size without loss of quality.


Now we can add the text to our image.
And the end result is what we expected. Did you like it?

** If you liked the article and learned something to help you, you can support me by sharing the news with your friends. See you in the next article.

If you want to know more about the video game these links may seem interesting.


Some photos

Asociación de amigos del MSX




https://www.msx.org/es/news/software/es/trun-nuevo-juego-de-msx
 



Ramón Miranda

Ramón Miranda
Ramon Miranda

Portada para videojuego TRUN de VGsource


Hablar de TRON es hablar de un clásico de la ciencia ficción y de uno de los mejores tributos a la creatividad e imaginación en el mundo del cine. Película un tanto incomprendida al inicio, pero el tiempo le dio la razón y la puso en su lugar. Y si hablamos de elementos míticos de la película, tenemos que hablar de las carreras de motos de luz...

TRUN es un videojuego creado en ensamblador Z80 basado en TRON.
Los creadores del Juego son Vgsource, un grupo indie de desarrollo que programa para MSX.
Hace unos meses, me contactaron para diseñar su portada y así darle un impacto visual mayor.
Fue un trabajo interesante porque desde el primer momento se buscaba un "look" ochentero imitando el estilo de portadas de la época de Dinamic o Topo, donde Azpiri era el rey ilustrando esos bellos casettes y lo de menos era el resultado en pantalla ( al menos para personas como yo)
Lo primero que hice fue coger referencias, y como no iba a ser de otra forma la propia película de TRON fue la principal fuente de inspiración. Tenía varias claves en mente mientras pintaba esta ilustración:
  • Azul
  • Luz
  • No Fx overlay.
  • Velocidad
  • Espíritu 80's
¿Os apetece ver como fue el desarrollo? Pues analizamos las diferentes fases brevemente.

    Fase de Bocetos

    Después de analizar qué quiero destacar en la imagen empiezo a trabajar en los bocetos.
    Estos son dibujos no muy detallados en los que se pueden ver los elementos principales del diseño.



    Me decido por la primera por la sensación de movimiento.



    Como ya sabemos las diagonales añaden movimiento a la composición y como quiero transmitir velocidad elijo el diseño con ese esquema y lo amplio para poder estudiar dónde colocar cada cosa. Algo que al final voy a cambiar son las motos. Finalmente serán aun más “homenaje” a las originales motos de luz diseñadas por Syd Mead.

    Fase de referencias

    Siendo el juego un calco del juego de TRON no me parece una locura coger referencias de la película. Ya que vamos a hacer una copia de un clásico vamos a hacerlo bien. ¡Que se note! Por eso creo una composición con las múltiples referencias para luego pintar por encima lo que necesite y llegar al resultado que quiero, no tan foto sino más 2d. Queda aun mucho trabajo.Este sistema no es el único que uso para mis ilustraciones.

    Este es el resultado del collage realizado dentro de Krita. Todas las imágenes tienen sus derechos de autor correspondientes. Esto solo lo usamos como idea. Al final se repinta el 100% de la ilustración.



    A partir de este punto vamos a trabajar los fondos. Para los fondos normalmente se usan pinceles que sean rápidos que "cubran" Utilizo un pincel que tiene la característica que difumina la pintura cuando se ejerce poca presión y va añadiendo más pintura según aumenta la presión. Es este que os muestro en la captura.



    Tiene un efecto como de espátula y pertenece al set que hice para el DVD de la krita foundation #muses. Si os interesa os lo podéis descargar aquí totalmente gratis.

    PACK bundle muses

    Nota: Si por alguna razón veis que este pincel produce algo de "Lag", una cosa muy útil que acelera tanto este pincel como muchos de los de Krita es utilizar el parámetro "precisión" dentro del editor de pinceles y bajarlo de 5 a 1. Si además utilizas tamaños grandes puedes aumentar el espaciado del pincel hasta 0.5 o 0.7. Se puede optimizar aun más para ganar velocidad en tamaños muy grandes.




    Más allá verás que va muy fluido pero pierde un poco de calidad. Estos pinceles exigen operaciones de cómputo importantes para la CPU pero dan resultados muyyy interesantes.  

    Lo que quiero es desdibujar el efecto foto pero respetando los colores que hay debajo aun siendo manchas  y a la vez darme más libertad para pintar por encima. Veréis que el resultado es muy pictórico. Artesanal dentro de lo digital.


     

    Ahora es tiempo de empezar a definir todos los elementos de la imagen.

    La cara en la foto no muestra una emoción acorde a lo que busco, vamos hombre! ¡Que te estás jugando la vida en una carrera! :)

    He creado este Gif para los que les gusta seguir una evolución de los pasos a seguir.

    Se puede apreciar como va cambiando la iluminación según voy trabajando el metal. El gif lo hice con Gimp. Explica mucho más que una página de texto. Entre otras cosas se ve cómo la luz va afectandola cara del personaje y su casco.
    Lo mismo sucede en el fondo. Cuando voy detallando las motos y la especie de hangar de donde salen.


    Al ir completando la imagen corremos el riesgo de añadir demasiados detalles. Así que cuidado con el Glow y los modos aditivos o color dodge que enganchan.
    Hacer lineas o curvas con precisión es complicado a mano alzada por eso una forma de evitarnos quebraderos de cabeza es utilizar los asistentes de pintura.



    Por ejemplo un uso sería en la curva que define el panel de la moto del personaje.


    Motos de Luz.

    Un elemento principal de esta imagen son las motos de Luz. Vamos a hacer algo sencillo para no separarnos demasiado de lo que se verá en pantalla.

     

    El problema según veo es que las motos necesitan unas lineas de movimiento. Esto va a transmitir más sensación de carrera. Al final opto por lineas no en toda la moto sino en parte. El resultado es algo más impactante.


    Diseño de Logo para la portada

    Ya solo nos queda realizar un logotipo para el diseño de la portada. Para esa tarea mejor utilizo un editor de imágenes como Gimp y un programa de diseño vectorial como Inkscape.

    En Gimp selecciono la herramienta texto con la tipografía previamente descargada que es muy parecida a la de TRON.



    Para variar un poco el diseño ajusto y completo el contorno de la palabra TRUN De esa forma ya tengo una buena base para editarlo en Inkscape y que se pueda adaptar a cualquier tamaño sin perdida de calidad.

    Ahora ya podemos añadir el texto a nuestra imagen.
    Y el resultado final es lo que esperábamos . ¿Os ha gustado?
    **Si te ha gustado el artículo y has aprendido algo que te ayude, puedes apoyarme compartiendo la noticia con tus amigos. Nos vemos en el próximo artículo.
    Si quieres saber más del video juego estos enlaces te pueden parecer interesantes.

    Algunas fotos

    Asociación de amigos del MSX


    https://www.msx.org/es/news/software/es/trun-nuevo-juego-de-msx
     




    Viernes 03 de febrero de 2017

    Flatpak te ayuda a instalar una aplicación en Linux fácil.

    ¿Estas harto de probar miles de distribuciones de Linux, porque ningún sistema de instalación de paquetes te convence?, ¿usas ubuntu sólo porque estás acostumbrado al sistema de paquetes de Debian?. Si has respondido a alguna de estas preguntas que sí, este es tu artículo.  Desde hace algún tiempo, en el amplio panorama de las distribuciones de Linux, está apareciendo un nuevo sistema o

    Martes 31 de enero de 2017

    Tutorial de Maud, motor de plantillas HTML para Rust

    Seguimos aprendiendo en el blog sobre interesantes proyectos hechos para Rust. Ya hemos visto Iron, Piston y Neon. Hoy veremos Maud, un potente motor de plantillas que se centra en la eficiencia. Maud se compara a otras soluciones como Razor, ERB, Liquid,  Handlebars o Jade pero esta vez escribiremos nuestro HTML en Rust. ¿Locura? No, y de hecho funciona de forma bastante transparente. Vamos a verlo en acción

    Comparativa de velocidad de diferentes motores. Maud es el más rápido (menos es mejor)

    Instalando Maud

    Maud usa plugins del compilador, una característica que a día de hoy no está activado ni en el canal estable ni el canal beta, solamente en el canal nightly. Para obtener una copia de Rust nightly lo ideal es usar Rustup.

    Una vez hecho eso, creamos un nuevo proyecto y añadimos las dependencias de Maud al fichero Cargo.toml.

    maud = "*"
    maud_macros = "*"
    

    Una simple plantilla

    Ahora abrimos el archivo src/main.rs y vamos a empezar a usar Maud.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let name = "Adrián";
            let markup = html!{
                p { "Hola, soy " (name) " y estoy usando Maud"}
            };
            println!("{}", markup.into_string());
    }
    
    

    La potencia de Maud se ve en la mega-macro html!. En esta macro escribiremos la plantilla que será compilada de forma nativa a Rust, lo que nos asegura una velocidad de ejecución excepcional. En este caso la salida será una etiqueta P de párrafo con la variable interpolada.

    Simple, ¿no?

    PreEscaped y otros elementos básicos

    Por defecto en Maud todos el texto se convierte a HTML seguro. Es decir, no se pueden introducir etiquetas nuevas en el texto. Si por alguna razón necesitásemos añadir etiquetas nuevas podemos usar PreEscaped, que no realiza esta transformación de seguridad. Veamos el siguiente código:

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    use maud::PreEscaped;
    
    fn main(){
            let name = "Adrián";
            let markup = html!{
                    p { "Hola, soy " (name) " y estoy usando Maud" }
                    p { "<h5>Esto no funcionará</h5>" }
                    p { (PreEscaped("<h5>Esto sí funcionará</h5>")) }
            };
            println!("{}", markup.into_string());
    }
    
    

    El primer H5 se convertirá a código HTML seguro, es decir, no añadirá la etiqueta, en cambio se verá h5 en la web. Por contra con PreEscaped se añadirá la etiqueta h5 tal cual.

    Los elementos son muy fáciles de añadir en Maud y por lo general no deberías usar PreEscaped salvo contadas ocasiones. Veamos como añadir más etiquetas.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let name = "Adrián";
            let markup = html!{
                    p { "Hola, soy " (name) " y estoy usando Maud" }
                    p {
                            "Si la montaña no viene a Mahoma"
                            br /
                            "Mahoma va la montaña"
                            small em "Atribuido a Francis Bacon"
                    }
            };
            println!("{}", markup.into_string());
    }
    
    

    En este ejemplo vemos como las etiquetas que no llevan texto como BR o INPUT debemos cerrarlas con una barra. Por otro lado es posible aglutinar varios niveles de etiquetas en una sola línea ( SMALL->EM->Texto).

    Atributos, clases e IDs

    En Maud es posible asignar atributos también, usando literales o variables. Para los atributos de texto la sintaxis es muy parecida a HTML.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let name = "Adrián";
            let amazon = "http://www.amazon.com";
            let markup = html!{
                    p { "Hola, soy " (name) " y estoy usando Maud" }
                    p {
                            "Este texto contiene enlaces a "
                            a href="http://www.google.com" "Google"
                            " y a "
                            a href=(amazon) "Amazon"
                    }
            };
            println!("{}", markup.into_string());
    }
    

    Además existen en HTML atributos vacíos. Es decir, atributos que con su sola presencia basta y normalmente no llevan valor asignado.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let name = "Adrián";
            let allow_editing = true;
            let markup = html!{
                    p { "Hola, soy " (name) " y estoy usando Maud" }
                    p contenteditable?[allow_editing] {
                    }
            };
            println!("{}", markup.into_string());
    }
    

    En este caso el atributo contenteditable se añade si la variable allow_editing es true. Si queremos añadir atributos vacíos en cualquier circunstancia podemos simplemente quitar [allow_editing] y dejar p contenteditable? {}.

    Los IDs y las clases se añaden usando la sintaxis esperable, puntos y almohadillas.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let name = "Adrián";
            let markup = html!{
                    p { "Hola, soy " (name) " y estoy usando Maud" }
                    p.red.font-big#editor contenteditable? {
                    }
            };
            println!("{}", markup.into_string());
    }
    

    Estructuras de control

    Maud soporta las estructuras de control básicas de Rust, if/else, if/let, for in y match.

    #![feature(plugin)]
    #![plugin(maud_macros)]
    
    extern crate maud;
    
    fn main(){
            let loggedIn = false;
            let email = Some("mariscal@example.com");
            let fonts = ["Arial","Times New Roman","Verdana"];
            let markup = html!{
                    @if loggedIn {
                            h1 { "Has iniciado sesión" }
                    } @else {
                            h1 { "Por favor, inicia sesión primero" }
                    }
    
                    @if let Some(mail) = email {
                            p { "Su email es " (mail) }
                    }
                    ol {
                            @for font in &fonts {
                                    li (font)
                            }
                    }
    
            };
            println!("{}", markup.into_string());
    }
    

    Como vemos, Maud posee suficientes características para ser interesante. Maud además permite extender el motor para representar cualquier tipo de dato. Por defecto Maud mirá si está implementado std::fmt::Display pero si queremos añadir etiquetas extra este método no funcionará. En cambio si se implementa la trait maud::Render tendrás control total sobre como va a mostrar Maud las variables de ese tipo. En la crate maud_extras se encuentran implementaciones por ejemplo de Markdown para Maud.

    Maud se integra además con web frameworks de Rust, en especial con Iron y con Rocket. Sin duda, una de mis crates favoritas.

    La entrada Tutorial de Maud, motor de plantillas HTML para Rust aparece primero en Blog - Adrianistan.eu.

    Lunes 30 de enero de 2017

    Gaspar Fernández

    Gaspar Fernández
    Poesía Binaria

    Operaciones básicas con cadenas en C++: capitalización, conversiones, recorte, recorrido y más

    Como ha sucedido con otros lenguajes, C++ también ha evolucionado. Ha madurado mucho desde aquellos códigos que programábamos hace años y se nota. Por un lado, podemos pensar que al sumar abstracción en ciertos aspectos nos separa de la máquina y hace nuestro código más lento. Suma comprobaciones, hace más callbacks y en definitiva, una sencilla tarea que completaba en pocos cientos de operaciones, ahora son pocos miles. Aunque en su favor, podemos decir que aquello que programábamos en 15 o 20 líneas de código se ha reducido a una o dos, reduciendo así los puntos de ruptura, posibles bugs y calentamientos de cabeza futuros.

    Eso sí, si queremos siempre podemos volver a los orígenes. Aunque será mucho más seguro utilizar estas nuevas formas de trabajo, si estamos seguros de lo que hacemos y queremos que el rendimiento de nuestro programa sea mucho mayor, podemos hacerlo. Es más, muchos programadores, todavía a 2017, suelen preferir programar en C cuando quieren ver un rendimiento superior en sus desarrollos.

    He hecho esta pequeña recopilación de chuletas para realizar ciertas operaciones en C++ moderno, que podréis compilar si contáis con soporte para C++11 o superior. He decidido incluir los programas completos, no sólo la parte en que quiero hacer hincapié , para que podáis copiar, pegar y compilar, y así lo veis y lo sentís como lo hago yo.

    Nota: Tenemos Glib, Boost y cientos de bibliotecas de C++ que pueden hacer cosas muy chulas (y lo que están preparando para C++17, que hasta finales de año no estará listo y que podremos disfrutar en su totalidad en 2018), pero en este post he querido centrarme en lo que podemos hacer con las herramientas que nos da el lenguaje sin utilizar bibliotecas de terceros

    Pasar una cadena completa a mayúsculas/minúsculas

    Recordemos los tiempos en los que en C pasábamos a mayúsculas y minúsculas una cadena. La recorríamos por completo y evaluábamos para cada letra cuál sería su mayúscula. No empezaremos con una novedad del lenguaje (podremos compilar con compiladores antiguos, pero sólo estamos abriendo boca). Cuando sólo tenemos un alfabeto inglés podemos hacer lo siguiente:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <cctype>

    int main()
    {
        std::string s = "HoLa MuNDo DeSDe PoeSía BiNaRia";

        std::transform(s.begin(), s.end(), s.begin(), ::toupper);

        cout << s << endl;
    }

    Utilizaremos transform() para que recorra la cadena y llame a toupper con cada uno de los caracteres, lo típico, toupper de cctype. Y de la misma manera que llamamos a toupper, lo podemos hacer con tolower para las minúsculas.

    Mayúsculas y minúsculas en un mundo plurilingüe

    Pero, a estas alturas, un ordenador tiene que poder hablar inglés, español, francés y hasta ruso, y todos tenemos derecho a nuestras letras mayúsculas y minúsculas. Ahora tenemos que poner en práctica el uso de la locale con la que queremos hacer la transformación. Eso sí, en lugar de un string, también tendremos que utilizar un wstring, porque en codificaciones como UTF-8, un solo byte no siempre equivale a un carácter. Necesitaremos alguien que sea capaz de leer caracteres de nuestros bytes (y programarlo nosotros es horrible). Por ejemplo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <locale>

    using namespace std;

    int main()
    {
        std::wstring s = L"HoLa MuNDo DeSDe PoeSía BiNaRia";
        std::locale::global(std::locale("es_ES.UTF-8"));

        std::transform(s.begin(), s.end(), s.begin(), [](wchar_t c){
                return std::toupper(c, std::locale()); });

        wcout << "RESULTADO:"<<endl;
        wcout << s << endl;
    }

    O también:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <locale>

    int main()
    {
        std::wstring s = L"HoLa MuNDo DeSDe PoeSía BiNaRia";
        std::locale::global(std::locale("es_ES.UTF-8"));

        std::use_facet<std::ctype<wchar_t>>(std::locale()).toupper(&s[0], &s[0] + s.size());

        std::wcout << "RESULTADO:"<<std::endl;
        std::wcout << s << std::endl;
    }

    O si queremos que el código quede más limpio, podemos sustituir esta línea tan larga por:

    1
    2
    auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
    f.toupper(&s[0], &s[0] + s.size());

    Caracteres al principio y al final

    Para saber el primer carácter de una cadena s, podíamos utilizar:

    • s[0] : Primera posición del string, que está muy bien, pero damos una posición numérica y no decimos de forma explícita “lo primero que hay”.
    • *s.begin() : El valor del iterador al primer elemento. Aunque como programadores de C++ y no de C, ver muchos asteriscos nos agobia…

    Para la última letra, ya lo tendríamos más complicado, tendríamos que usar:

    • *(s.end()-1) : El iterador al último carácter de la cadena será el terminador, pues resolvemos el puntero al carácter anterior. Esto queda un poco feo, hay asteriscos y hacemos cuentas con punteros. No es muy seguro.
    • s[s.length()-1] : Aunque no tenemos asteriscos. pedimos la longitud de la cadena, lo que puede que implica una llamada, aunque muchos compiladores están muy bien optimizados.

    En C++11 tenemos front():

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <iostream>
    #include <string>

    int main()
    {
        std::string s = "Hola Mundo";

        std::cout << "Primera: "<<s.front() << std::endl
                    << "Última: "<<s.back()<< std::endl;
    }

    Si queremos, podemos añadir o eliminar caracteres al final con las funciones push_back() y pop_back, así:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include <string>

    int main()
    {
        std::string s = "Hola Mundo";

        s.push_back('!');
        std::cout << s << std::endl;
        s.pop_back();
        std::cout << s << std::endl;
    }

    Comprobar que una cadena contiene un número

    Vamos, lo que queremos hacer es saber si el contenido de una cadena, es numérico. Para ello, debemos asegurarnos de que todos los caracteres de la misma son números:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    #include <string>
    #include <algorithm>

    bool isNumeric(const std::string& input)
    {
        return std::all_of(input.begin(), input.end(), ::isdigit);
    }

    int main()
    {
        std::string s = "1239812357";
        std::cout << ((isNumeric(s))?"Sí":"No") << std::endl;
    }

    Sí, precioso, pero ¿qué pasa con los negativos? Bueno, podemos modificar isNumeric un poco para comprobar el primer carácter de la cadena:

    1
    2
    3
    4
    5
    6
    7
    bool isNumeric(const std::string& input)
    {
        auto ib = input.begin();
        if ((input.front()=='+') || (input.front()=='-') )
            ib++;
        return std::all_of(ib, input.end(), ::isdigit);
    }

    Bueno, ya cubrimos los números enteros, y si comprobamos esto, podremos ver que daría igual la longitud de la cadena, es decir, pueden ser números muy grandes, números que desbordarían un long, pero al menos podemos comprobar su validez.
    Pero, ¿qué pasaría con los números hexadecimales? ¿o los binarios? Aquí podemos especificar la base:

    1
    2
    3
    4
    5
    6
    7
    8
    bool isNumeric(std::string in, int base=10 )
    {
        std::string validos = "0123456789ABCDEF";
       
        return (in.find_first_not_of(validos.substr(0, base),
                                                                 ((in.front()=='+') || (in.front()=='-') )
                        ) == std::string::npos);
    }

    Eso sí, ¿qué pasaría con los decimales? Nos estamos poniendo caprichosos ya, pero podríamos comprobar la existencia de la coma decimal y ver si hay más números a partir de ahí:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <locale>

    bool isNumeric(std::string in, int base=10 )
    {
        std::string validos = "0123456789ABCDEF";
       
        auto entera = in.find_first_not_of(validos.substr(0, base),
                                                                             ((in.front()=='+') || (in.front()=='-') ));

        // Podíamos haber utilizado == '.' pero no sabemos el idioma del usuario.
        // Para los decimales puede utilizar . , o cualquier otra cosa.
        if (in[entera] == std::use_facet< std::numpunct<char> >(std::locale()).decimal_point())
            return (in.find_first_not_of(validos.substr(0, base),
                                                                     entera+1) == std::string::npos);
        else
            return (entera == std::string::npos);
    }

    int main()
    {
        std::locale::global(std::locale("es_ES.UTF-8"));
        std::string s = "-123982357,";

        std::cout << ((isNumeric(s, 16))?"Sí":"No") << std::endl;
    }

    Comprobar que una cadena contiene un número II

    Bueno, y como es C++ moderno, tenemos un extra muy interesante, ¡expresiones regulares! Pues nada, creemos una expresión regular para comprobar cadenas numéricas. Total, en otros lenguajes lo hacemos sin miedo, aunque, ¡cuidado! El tamaño del ejecutable puede crecer mucho.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <regex>

    bool isNumeric(std::string in )
    {
        std::regex num_regex("^[+|-]?(([0-9]*)|(([0-9]*)\\.([0-9]*)))$");
        return std::regex_match(in, num_regex);
    }

    int main()
    {
        std::string s = "123982357";

        std::cout << ((isNumeric(s))?"Sí":"No") << std::endl;
    }

    Convertir de cadena a número

    Si pensamos en C. Aunque tenemos atoi(), atod(), strtol() y demás familiares y derivados, debemos recorrer la cadena por completo y analizar carácter a carácter si es numérico y si lo es, darle un valor con respecto a la posición que ocupa dentro de la cadena. También es cierto que atoi() y demás pueden ser inseguras ya que C no comprueba tamaños de cadenas y si no controlamos el dato, los resultados pueden ser inesperados. Es más, atoi() es la función que nunca se queja, tanto si le pasas una cadena que no contiene un número (que devuelve 0) como si le pasas una cadena muy larga con números muy largos que desbordan la variable (ok, se desborda, devuelve lo que quiere, pero no falla). Aunque strtol() / strtod() nos dan más control, pero no son estilo C++.

    En C++ podemos hacer lo siguiente:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string>

    int main()
    {
        std::string numero = "12347665";
        try
            {          
                std::cout << std::stoi(numero)<<std::endl;
            }
        catch (std::logic_error e)
            {
                std::cout << "Problemas!!"<< std::endl;
            }
    }

    Eso sí, stoi(), stol() y stoll() funcionan con strtol() y strtoll() por detrás, para eso de tener excepciones. Si queremos velocidad, seguramente nos vaya mejor utilizando las funciones de C, pero si queremos estilo y excepciones, las funciones de C++ nos vendrán bien.

    Al igual que stoi(), tenemos también stof() para float, stod() para double y stold() para long double. Eso sí, ¿quieres números extremadamente grandes? Puedes probar GMP, que tiene una interfaz para C++. Aquí tienes un ejemplo de uso en C.

    Convertir de número a cadena

    En C, los que aprendimos hace mucho tiempo teníamos una función, itoa(), pero no era ANSI-C. De hecho, yo la conocí en Turbo C, y no la vemos en muchos compiladores. Aunque tenía el mismo problema de siempre: no hay comprobación del tamaño de cadenas, porque en C no es muy fácil.

    De todas formas, aunque en C terminábamos haciendo las conversiones número-cadena con sprintf() o snprintf() (mejor esta segunda), antiguamente en C++, podíamos utilizar sstream, pero muchísimas veces da una pereza enorme y nos obligaba a tener wrappers a meno con estas funciones siempre cerca. Pero desde C++11 tenemos una nueva función para sacarnos las castañas del fuego, to_string(), fácil y preciosa, a la que le da igual que le pasemos un int, double, uint16_t, char o lo que queramos, siempre que sea numérico:

    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include <string>

    int main()
    {
        uint16_t zz = 1239;
        std::cout << std::to_string(zz);
    }

    Dividir cadenas (split, tokenize…)

    Una ardua tarea es siempre separar una cadena en varios trozos, o bien por palabras, o con algún carácter comodín, o cualquier otro criterio. En C tenemos strtok(), con la inseguridad que conlleva, además porque en un mundo multihilo puede darnos problemas (y por eso vino su hermano strtok_r()), pero es otro cantar. En C++ tenemos a nuestra disposición multitud de estructuras de datos, y algo que hacemos en otros lenguajes como Javascript de forma muy fácil (un split de toda la vida), en C++ se nos puede atravesar un poco. Y tenemos varias opciones:

    Separar palabras por espacios

    En realidad, por los caracteres que utiliza cin para separar elementos. Lo haremos con istream_iterator y meteremos los valores en un vector. Lo bueno es que podemos utilizar strings, int, o cualquier cosa que podamos utilizar en un stream:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>

    int main()
    {
        std::istringstream iss("Estoy probando un\n\n\n\ntokenizer desde Poesía Binaria");
        std::vector<std::string> results { std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>() };
       
        for (auto vi : results)
            std::cout << vi <<std::endl;
    }

    …¡¡con expresiones regulares!!

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
    #include <string>
    #include <vector>
    #include <regex>

    std::vector<std::string> split(const std::string& str, const std::string& regex)
    {
        std::regex _regex(regex);
        return { std::sregex_token_iterator (str.begin(), str.end(), _regex, -1), std::sregex_token_iterator() };
    }

    int main()
    {
        std::string ss = "hola:mundo:de:codigo";
        std::string sep = ":";
       
        auto v = split(ss, sep);
        for (auto vi : v)
            std::cout << vi <<std::endl;
    }

    Desde que el soporte de expresiones regulares es nativo. C++ se ha convertido en un lenguaje adulto. Es cierto que antes podíamos hacer multitud de cosas, y que seguro que muchos aprovechamos ese soporte de expresiones regulares para complicarnos la vida y hacer cosas menos eficientes, pero se agradece mucho en ocasiones y seguro que simplifica nuestros códigos.

    …separadas con un carácter

    Otro ejemplo más, puede ser este:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include <iostream>
    #include <string>
    #include <vector>

    const std::vector<std::string> split(const std::string& haystack, const char& needle)
    {
        std::string buff{""};
        std::vector<std::string> v;
       
        for(auto c:haystack)
        {
            if(c != needle)
                buff.push_back(c);
            else if ( (c == needle) && (!buff.empty()))
                {
                    v.push_back(buff);
                    buff = "";
                }
        }
       
        if (!buff.empty())
            v.push_back(buff);
       
        return v;
    }

    int main()
    {
        std::string ss = "hola:mundo:de:codigo";
        std::string sep = ":";

        auto v = split(ss, ':');
        for (auto vi : v)
            std::cout << vi <<std::endl;
    }

    Aunque si queremos utilizar las nuevas herramientas que nos da C++ como lambdas o iteradores, que pueden llegar a ser muy interesantes, podemos utilizar esto:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include <iostream>
    #include <string>
    #include <vector>
    #include <sstream>
    #include <algorithm>

    std::vector<std::string> split(const std::string& str, char delimiter)
    {
        std::vector<std::string> ret;
        std::string::const_iterator i = str.begin();

        while (i != str.end())
            {
                i = find_if(i, str.end(), [delimiter](char c)   {
                        return (c!=delimiter);
                    });
                std::string::const_iterator j = find_if(i, str.end(), [delimiter](char c)   {
                        return (c==delimiter);
                    });
                if (i != str.end())        
                    ret.push_back(std::string(i, j)); i = j;
            }
        return ret;
    }

    int main()
    {
        std::string ss = "hola     mundo   de codigo";
        std::vector<std::string> v = split(ss, ' ');

        for (auto vi : v)
            std::cout << vi <<std::endl;
    }

    En este punto, dependiendo de nuestras necesidades podríamos utilizar find() y derivados. Si os apetece también podemos recurrir a strtok() de C (aunque si no tenemos que hacer varios millones de operaciones como esta por segundo, mejor nos quedamos con las herramientas de C++ que serán algo más seguras y podríamos implementarlas fácilmente con wstring. (Si os queréis aventurar con strtok(), mejor utilizar strtok_r(), porque en un mundo multihilo sería normal que dos hilos llamasen a strtok() al mismo tiempo, y eso puede causarnos problemas.

    Reemplazar subcadenas dentro de cadenas

    Varios ejemplos de esto los encontramos en estos posts: Reemplazar cadenas de texto en C++ (string y Glib::ustring) y Reemplazar cadenas en C++, esta vez desde un map, para múltiples sustituciones.

    Rot13

    Una manera sencilla de hacer cifrados, pero no voy a eso. Es un cifrado tremensamente fácil de romper, pero transform() puede dar mucho juego, entre otras cosas, hacer un rot13 se vuelve muy sencillo:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>

    std::string rot13(std::string text) {
        std::transform(
            begin(text), end(text), begin(text),
            [] (char c) -> char {
                if (not std::isalpha(c))
                    return c;

                char const pivot = std::isupper(c) ? 'A' : 'a';
                return (c - pivot + 13) % 26 + pivot;
            });
        return text;
    }

    int main()
    {
        std::string ss = "hola mundo desde Poesía Binaria";

        std::cout << rot13(ss)<<std::endl;
    }

    Eliminar espacios de una cadena

    ¡En una sola línea de código, con posibilidad de eliminar no sólo los espacios sino cualquier carácter que cumpla una determinada condición. Con remove_if():

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <cctype>

    std::string strip(std::string s)
    {
        s.erase( std::remove_if(s.begin(), s.end(), ::isspace), s.end() );
        return s;
    }

    int main()
    {
        std::cout << strip("¿ Qué pasa si a una cadena le quito los espacios ?") << std::endl;
    }

    Y, en lugar de ::isspace (de cctype) podemos utilizar un lambda con una función que determine qué carácter eliminamos (no removemos), en dicha función podrán entrar otros delimitadores.

    Y ya puestos, probemos con palíndromos

    Este es un típico ejercicio de programación que se hace en todas las escuelas y universidades (bueno, seguro que en todas no, pero en la mayoría). Se utiliza para enseñar a los alumnos a utilizar bucles y cadenas de caracteres. Aunque aquí daremos un paso más en la abstracción y como antes, con una línea comprobaremos si la cadena es palindrómica o no. O, lo que es lo mismo, que podemos leerla tanto de izquierda a derecha como de derecha a izquierda:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <cctype>

    void strip(std::string &s)
    {
        s.erase( std::remove_if(s.begin(), s.end(), ::isspace), s.end() );
    }

    bool palindromo(std::string s)
    {
        strip(s);
        return std::equal(s.begin(), s.end(), s.rbegin());
    }

    int main()
    {
        std::string ss = "reconocer";
        std::cout << ss<< ( (!palindromo(ss))?" no":"")<<" es palíndromo."<<std::endl;

        ss = "murciélago";
        std::cout << ss<< ( (!palindromo(ss))?" no":"")<<" es palíndromo."<<std::endl;

        ss = "anita la gorda lagartona no traga la droga latina";
        std::cout << ss<< ( (!palindromo(ss))?" no":"")<<" es palíndromo."<<std::endl;

        ss = "la ruta nos aporto otro paso natural";
        std::cout << ss<< ( (!palindromo(ss))?" no":"")<<" es palíndromo."<<std::endl;
    }

    Esto sólo es el principio

    Estas son unas pocas operaciones con cadenas en C++. ¿Se te ocurren algunas más? Seguro que sí, y podrán dar para otro post con muchos más ejemplos. Déjame un comentario con tus sugerencias.

    Foto principal: Katie Chase

    The post Operaciones básicas con cadenas en C++: capitalización, conversiones, recorte, recorrido y más appeared first on Poesía Binaria.

    Domingo 29 de enero de 2017

    Gorka Urrutia

    Gorka Urrutia
    Nideaderedes

    Cómo instalar PrestaShop con Vagrant

    Para evtiar dolores de cabeza y tener que andar configurando un servidor local en Linux o algún Wamp en Windows o Mamp en Mac podemos usar Vagrant. He creado una máquina virtual que puedes usar como entorno de desarrollo para PrestaShop.

    Cómo instalar PrestaShop con Vagrant

     

    Gorka Urrutia

    Gorka Urrutia
    Nideaderedes

    La guía definitiva del código espagueti II: Que tus variables y funciones confundan al enemigo

    Porque elegir unos nombres horribles para tus variables y funciones es un arte:

    La guía definitiva del código espagueti II: Que tus variables y funciones confundan al enemigo

    Gorka Urrutia

    Gorka Urrutia
    Nideaderedes

    Programación orientada a objetos en PHP. 3: Encapsulación

    Otra entrega más (y ya van tres) del mini curso de programación orientada a objetos en PHP. Esta vez hablo de encapsulación. No te lo pierdas:

    Programación orientada a objetos en PHP capítulo 3: ¿Por qué no hacer todo public? (Encapsulación).

    Viernes 27 de enero de 2017

    Tutorial de Neon – Combina Node.js con Rust

    Hoy en día muchas webs se diseñan con Node.js. Es una solución fantástica para respuestas rápidas pero numerosos benchmarks han demostrado que su rendimiento empeora en respuestas complejas. Estos mismos benchmarks recomiendan usar Java o .NET si preveemos que nuestra aplicación web va a generar respuestas complejas. Sin embargo renunciar a las ventajas de Node.js no es del agrado de muchos. Afortunadamente hay otra solución, usar Rust. Todo ello gracias a Neon.

    Con Neon podemos generar módulos para Node.js que son escritos y compilados en Rust con las ventajas que supone desde un punto de vista de rendimiento y con la certeza de que en Rust la seguridad está garantizada.

    Usando Neon puedes desarrollar tu aplicación en Node.js y si alguna parte tiene problemas de rendimiento sustituirla por su equivalente en Rust. Para el ejemplo voy a hacer un módulo de Markdown.

    Instalando Neon

    En primer lugar instalamos la herramienta de Neon desde npm.

    npm install -g neon-cli
    

    Una vez esté instalado podemos usar la herramienta de Neon para construir un esqueleto de módulo. Este esqueleto tendrá dos partes, un punto de entrada para Node.js y otro para Rust.

    neon new PROYECTO
    

    Hacemos un npm install como nos indica. Esto no solo obtendrá dependencias de Node.js sino que también se encargará de compilar el código nativo en Rust.

    El código Node.js

    Nuestro módulo contiene un archivo de Node.js que sirve de punto de entrada. Allí lo único que se debe hacer es cargar el módulo en Rust y hacer de pegamento. Puede ser algo tan simple como esto:

    var addon = require("../native");
    
    module.exports = addon; // se exportan todos los métodos del módulo nativo
    

    Aunque si queremos añadir un tratamiento específico también es posible.

    var addon = require("../native");
    
    module.exports = {
        render: function(str){
            return addon.render(str);
        }
    }
    

    El código en Rust

    Nos dirigimos ahora al archivo native/src/lib.rs. Ahí definimos los métodos nativos que va a tener el módulo. Lo hacemos a través de la macro register_module!.

    register_module!(m,{
        m.export("render",render)
    });
    

    Ahora vamos a implementar la función render, que toma el texto en Markdown y lo devuelve en HTML.

    fn render(call: Call) -> JsResult<JsString> {
        let scope = call.scope; // obtener el contexto
        let md: Handle<JsString> = try!(try!(call.arguments.require(scope,0)).check::<JsString>()); // obtener primer argumento como JsString. aquí puede hacerse tratamiento de fallos
        let string = md.value(); // Pasar JsString a String
        let html: String = markdown::to_html(&string); // usamos la crate markdown para renderizar a html
        Ok(JsString::new(scope, &html).unwrap()) // devolvemos un JsString con el contenido del HTML
    }
    
    

    Las funciones que interactuan con Node deben devolver un JsResult de un tipo JsXXX, por ejemplo, JsString, JsUndefined o JsInteger. Siempre aceptan un argumento llamado de tipo Call que nos da toda la información necesaria y que podemos usar para sacar argumentos. El scope o contexto es muy importante y lo deberemos usar en las funciones que interactúen con Node.

    Código completo del fichero Rust

    #[macro_use]
    extern crate neon;
    extern crate markdown;
    
    use neon::vm::{Call, JsResult};
    use neon::js::JsString;
    use neon::mem::Handle;
    
    fn render(call: Call) -> JsResult<JsString> {
        let scope = call.scope;
        let md: Handle<JsString> = try!(try!(call.arguments.require(scope,0)).check::<JsString>());
        let string = md.value();
        let html: String = markdown::to_html(&string);
        Ok(JsString::new(scope, &html).unwrap())
    }
    
    register_module!(m, {
        m.export("render", render)
    });
    

    Y no te olvides de añadir la dependencia markdown al fichero Cargo.toml.

    Probándolo

    Es muy fácil probarlo. Con el REPL de Node podemos probar partes del módulo antes de publicarlo a npm.

    Para abrir el REPL ejecuta Node sin argumentos

    node
    

    E introduce línea por línea lo que quieras probar:

    var md = require("./");
    md.render("__Esto es Markdown__");
    

    Verás el resultado por la pantalla:

    Ahora que ya sabemos que funciona podemos publicarlo a npm si queremos con:

    npm publish
    

    Aunque recuerda revisar antes el fichero package.json para especificar la licencia y la descripción. Una vez esté publicado su uso en un nuevo proyecto será muy sencillo y de forma transparente se compilará el código nativo.

    var md = require("rust-markdown");
    var http = require('http');
    var fs = require("fs");
    
    var server = http.createServer((req, res) => {
      fs.readFile("index.md","utf-8",function(err,data){
         var html = md.render(data);
         res.statusCode = 200;
         res.setHeader('Content-Type', 'text/html');
         res.end(html);
      });
    });
    
    server.listen(8080, "127.0.0.1", () => {
      console.log("Server running");
    });
    
    
    
    

     

     

    La entrada Tutorial de Neon – Combina Node.js con Rust aparece primero en Blog - Adrianistan.eu.

    Martes 24 de enero de 2017

    Gaspar Fernández

    Gaspar Fernández
    Poesía Binaria

    ¿Qué ha hecho SiteGround en 2016? Hosting para seres humanos y, ¡atentos! ¡Un concurso!

    SiteGround es una de las empresas de hospedaje web que sigo de cerca y he recomendado a algunos amigos. Los que seguís el blog veréis que soy más de montarme las cosas en plan artesano pero, si no quieres perder el tiempo en configuraciones, seguridad, actualizaciones y parches de seguridad constantemente, una empresa como SiteGround puede sernos de gran ayuda.

    No es para tanto…

    No sólo por su gran apoyo técnico, que hasta un sábado a las 3:00 AM (hora de despliegue) están ahí para solucionar un problema, o por la facilidad que nos dan tanto para subir una web y mantenerla, con discos SSD y algo que no te esperas en este tipo de hostings, ¡¡SSH!!. Sino porque es una empresa que se moja en muchos sentidos, ya el año pasado comentaba las aportaciones al software libre que hicieron en 2015. Este año se han centrado en la colaboración con diferentes CMS como WordPress, Joomla y Drupal, desarrollando tanto código como plugins, así como con sus comunidades uniendo a desarrolladores de todo el mundo patrocinando meetups y webinars y, por supuesto, mimando mucho a los bloggers de diferentes sectores.

    Muy metidos en el mundo WordPress han apostado muy fuerte por PHP7. Que, por supuesto, habrá liberado bastante carga de sus servidores. Pero eso permite a los usuarios aprovechar al máximo las características de los servidores: estar más seguros, poder atender a más visitas y poder desarrollar sistemas más complejos fácilmente. Además, ayudan a los usuarios a colocar certificados HTTPs en sus páginas integrados perfectamente con Let’s Encrypt.

    ¡Eso no quiere decir que dejen de lado el kernel! En 2016 han hecho 30 commits al kernel y han mantenido sus servidores al día tanto con actualizaciones como workarounds de algunos de las principales vulnerabilidades que han surgido en GNU/Linux. Además, me gusta cada día más la transparencia con la que informan de los fallos y sus soluciones en el blog de la empresa (tanto de la matriz como de la filial española).

    Échale un ojo tú mismo

    Siguiendo la nueva tradición de la compañía, este 2016 también han preparado su Resumen Anual 2016 de SiteGround donde puedes ver algunas de las iniciativas que han llevado a cabo.

    Pero si profundizas un poco más, comprobarás que es sólo la punta del iceberg. Dada la transparencia y velocidad que ofrecen solucionando problemas en sus servidores, yo mismo les utilizo como una fuente más de información ante este tipo de problemas y vulnerabilidades

    ¡El concurso!


    ¡Tienes que darte mucha prisa! A la hora de la publicación de este post todavía estás a tiempo de participar. Sólo tienes que entrar en esta página, casi casi al final, compartir un mensaje por Twitter o Facebook para llevarte un gorro y una bufanza de SiteGround.

    ¡ Date prisa ! ¡ Mucha prisa ! Que con el frío que hace se agradece.

    Sobre este post

    No hace falta que diga que es un post patrocinado. Lo que creo que sí es necesario decir es que he rechazado muchos posts de este tipo. Aunque, conozco SiteGround desde antes de estar en España y como dije antes, la recomiendo a amigos y conocidos que se inician en el mundo web. Yo he utilizado sus servicios tanto personalmente como en nombre de otras personas a las que he ofrecido soporte y nunca me han decepcionado. He podido ver de primera mano el interés que se toman tanto en ofrecer el servicio como en las iniciativas que promueven y eso les hace muy dignos.

    El propósito de este sitio no es ganar dinero, pero iniciativas así ayudan a costearme los servidores y a continuar haciendo algo que me gusta y me apasiona.

    The post ¿Qué ha hecho SiteGround en 2016? Hosting para seres humanos y, ¡atentos! ¡Un concurso! appeared first on Poesía Binaria.

    Sábado 21 de enero de 2017

    Ramón Miranda

    Ramón Miranda
    Ramon Miranda

    Underwater Romance


    Hola a todos mis lectores y colegas. Se fue el 2016, y el 2017 ya lo tenemos aquí.
    Este pequeño artículo es de esos momentos en los que uno hace balance de cómo le fue el año y se pone nuevas metas.Para mi ha sido espectacular. Lo más importante es que al fin di el sí quiero con la mujer que amo. Se llama Lara y es parte fundamental de que esté aquí en Málaga, en esta tierra de luz y color donde tantas veces veranee de pequeño. Nos casamos de manera discreta y sin mucho ruido como queríamos que fuera. Así que en estos momentos estoy muy feliz. Quizás algún día asome por el blog, aunque de momento os digo que no tiene nada que ver con el mundo de la imagen.

    Ya metidos en materia también es muy destacable toda la evolución que ha habido dentro del mundo Krita. Increíble trabajo el de los desarrolladores. Una de las imágenes que la fundación decidió utilizar, fue esta que publico la cual pinté exclusivamente para ellos como recompensa para los que apoyaron la campaña de Kickstarter de Krita en este año. Este es el resultado de apoyar a Krita. la recompensa de ver cómo mejora cada día y ver que más usuarios puedan aprender desentrañando la imagen en alta resolución viendo todas las capas correctamente nombradas. Si quieres apoyar para que el proyecto sea aun mas grande aquí tienes un link https://krita.org/en/support-us/donations/




    Cabe destacar que la idea de hacer la ilustración como vista en el fondo del mar, se le ocurrió a mi mujer tras ver lo que estaba haciendo y los colores que estaba usando. 

    La cara de ella quizás ha sido la parte más difícil. 3 veces la repetí hasta dar con el gesto que buscaba, una pose de inocencia y a la vez de "me dejo seducir por este guapo sireno" ;D



    Si os gusta el resultado seguro que vais a disfrutar con el próximo artículo donde explicaré cómo se hizo esta imagen desde el boceto de color a la pintura acabada.

    Nos leemos






    English Readers

    Hello to all my readers and colleagues. 2016 has gone, and 2017 is already here

    This small article is one of those moments in which you think about how the year went and set new goals. For me it has been spectacular. The most important thing is that finally! I said "yes, i do" to the woman I love. Her name is Lara and she is a fundamental part for being here in Malaga, in this land of light and color where i spent so many summers as a child. We married discreetly and without too much noise as we wanted it to be. So right now I'm very happy. Maybe someday she will write something here, for now I swear you she has nothing to do with the world of the image. :D

    Talking about the picture... is also very remarkable all the evolution that has been in the Krita world. Incredible work for the developers. One of the images that the foundation decided to use, was this one that I published exclusively for them as a reward for those who supported Krita's Kickstarter campaign this year. The bakers with 50$ baked if i remember well received the image in high res and .kra format to learn more about how to use krita. If you want to support krita more there you have a link https://krita.org/en/support-us/donations/



    It is noteworthy that the idea of ​​making the illustration as seen on the bottom of the sea, occurred to my wife after seeing what i was doing and the colors i was putting on canvas.

    Mermaid's face has been the hardest part. I repeated 3 times until I found the gesture I was looking for, a pose of innocence and at the same time "I let myself be seduced by this handsome siren";D





    If you like the result you will enjoy with the next article where I will explain how this image was made from the color sketch to the finished painting.









    Martes 17 de enero de 2017

    Tutorial de Piston, programa juegos en Rust

    Ya he hablado de Rust varias veces en este blog. La última vez fue en el tutorial de Iron, que os recomiendo ver si os interesa el tema del desarrollo web backend.

    Hoy vamos a hablar de Piston. Piston es una de las librerías más antiguas del ecosistema Rust. Surgida cuando todavía no existía Cargo, esta librería está pensada para el desarrollo de juegos. No es la única que existe en Rust pero sí la más conocida. Piston es una librería que te enseñará Rust de la mejor forma. Y ahora quiero disculparme, porque Piston no es una librería, son un montón, pero eso lo veremos enseguida. En primer lugar creamos un proyecto nuevo con Cargo.

    cargo new --bin ejemplo_piston
    cd ejemplo_piston

    Ahora abrimos el archivo Cargo.toml, vamos a añadir las dependencias necesarias. Las dependencias en Piston son un poco complicadas, veamos:

    • Existen las dependencias core, implementan la API fundamental pero no pueden usarse por separado, son window, input y event_loop. Se usan a través de piston.
    • Los backends de window, existen actualmente 3 backends: glutin, glfw, sdl2. Se importan manualmente.
    • Graphics, una API 2D, no presente en core, pero al igual que las dependencias core necesita un backend.
    • Los backends de graphics son varios: opengl, gfx y glium.
    • Existe una dependencia que nos deja todo montado, piston_window. Esta trae por defecto el core de Piston, glutin, graphics y gfx.
    • Luego existen dependencias extra, como por ejemplo para cargar texturas, estas las podremos ir añadiendo según las necesite el proyecto.

    Para simplificar añadimos piston_window únicamente:

     

    [package]
    name = "piston_example"
    version = "0.1.0"
    authors = ["Adrián Arroyo Calle"]
    
    [dependencies]
    piston_window = "0.59.0"
    

     

    Ahora abrimos el archivo main.rs. Añadimos la crate de piston_window y los módulos que vamos a usar.

    extern crate piston_window;
    
    use piston_window::*;
    use std::path::Path;
    

     

    Así mismo definimos un par de cosas para el resto del programa, la versión de OpenGL que usará Piston internamente y una estructura para guardar los movimientos de teclado.

    const OPENGL: OpenGL = OpenGL::V3_1;
    
    struct Movement{
        up: bool,
        down: bool,
        left: bool,
        right: bool
    }
    

     

    En la función main podemos crear la ventana, especificando título y tamaño. Más opciones como V-Sync, pantalla completa y demás también están disponibles.

    fn main() {
    
        let mut window: PistonWindow = WindowSettings::new("Piston - Adrianistan",[640,480])
            .exit_on_esc(true)
            .opengl(OPENGL)
            .build()
            .unwrap();
    

     

    Ahora cargamos la tipografía Sinkin Sans, que vamos a usar para dibujar texto en pantalla. Como hay dos posibles localizaciones comprobamos esos dos lugares antes de salir del programa si no se consigue cargar la fuente.

        let mut glyphs = Glyphs::new(Path::new("SinkinSans.ttf"),window.factory.clone()).unwrap_or_else(|_|{
            let glyphs = Glyphs::new(Path::new("target/debug/SinkinSans.ttf"),window.factory.clone()).unwrap_or_else(|_|{
                panic!("Failed to open the font file. Check that SinkinSans.tff is in the folder");
            });
            glyphs
        });
    

     

    Inicializamos la estructura de movimientos, generamos las dimensiones iniciales del rectángulo (que será un cuadrado en este caso), su color y la posición del ratón.

        let mut mov = Movement{
            up: false,
            down: false,
            left: false,
            right: false
        };
    
        let mut dims = rectangle::square(50.0,50.0,100.0);
        let mut rect_color = color::BLACK;
    
        let mut mc: [f64; 2] = [0.0,0.0];
    

     

    Ahora viene la parte importante, el bucle de eventos. El bucle va a funcionar infinitamente generando eventos por el camino (pueden ser eventos de inactividad también). Usamos la función draw_2d para dibujar en 2D. Hay dos maneras de dibujar un rectángulo, en primer lugar tenemos la forma abreviada y en segundo lugar una más completa que permite más opciones. Por último dibujamos el texto usando la fuente y realizando una transformación para que no quede el texto en la posición 0,0.

     while let Some(e) = window.next() {
            window.draw_2d(&e, |c, g| {
                clear([0.5, 0.5, 0.5, 1.0], g);
                rectangle([1.0, 0.0, 0.0, 1.0], // color rojo, rgba
                            [0.0, 0.0, 100.0, 100.0], // dimensiones
                            c.transform, g); // transormacion y donde se va a dibujar
    
                let rect = Rectangle::new(rect_color);
                rect.draw(dims,&c.draw_state,c.transform,g);
                text(color::BLACK,18,"¡Saludos desde Piston!",&mut glyphs,c.transform.trans(100.0,200.0),g); // aplicamos una transormacion, movemos las X 100 y las Y 200
            });
    

     

    A continuación vamos a tratar cada evento de forma independiente, como todos los métodos devuelven Option, hemos de usar esta sintaxis con Some. En primer lugar tenemos un UpdateEvent, que básicamente nos informa del tiempo delta transcurrido. Recomiendo usar este evento para realizar los cambios en las geometrías, en este caso para mover el rectángulo.

    if let Some(upd_args) = e.update_args() {
                let dt = upd_args.dt;
                
                    if mov.right {
                        dims[0] += dt*100.0;
                    }
                    if mov.left {
                        dims[0] -= dt*100.0;
                    }
                    if mov.up {
                        dims[1] -= dt*100.0;
                    }
                    if mov.down {
                        dims[1] += dt*100.0;
                    }
            }
    

    Los siguientes dos eventos son opuestos, uno se activa cuando pulsamos una tecla y el otro cuando la soltamos. Comprobamos la tecla y modificamos la estructura movement en consecuencia.

    if let Some(Button::Keyboard(key)) = e.press_args() {
                if key == Key::W {
                    mov.up = true;
                }
                if key == Key::S {
                    mov.down = true;
                }
                if key == Key::A {
                    mov.left = true;
                }
                if key == Key::D {
                    mov.right = true;
                }
            };
            if let Some(Button::Keyboard(key)) = e.release_args() {
                if key == Key::W {
                    mov.up = false;
                }
                if key == Key::S {
                    mov.down = false;
                }
                if key == Key::A {
                    mov.left = false;
                }
                if key == Key::D {
                    mov.right = false;
                }
            };
    

    Por último, si queremos comprobar clicks del ratón hacemos algo similar. He añadido código para que cambio el color del rectángulo si pulsamos sobre él.

    if let Some(Button::Mouse(mb)) = e.release_args() {
                if mb == MouseButton::Left {
                    let x = mc[0];
                    let y = mc[1];
                    if x > dims[0] && x < dims[0] + dims[2] { if y > dims[1] && y < dims[1] + dims[3] {
                            rect_color = if rect_color == [1.0,0.0,0.0,0.7]{
                                [0.0,1.0,0.0,0.7]
                            } else if rect_color == [0.0,1.0,0.0,0.7] {
                                [0.0,0.0,1.0,0.7]
                            } else{
                                [1.0,0.0,0.0,0.7]
                            }
                        }
                    }
                    
                }
            }
    

    A continuación un pequeño evento que guarda la última posición del ratón.

            if let Some(mouse_cursor) = e.mouse_cursor_args() {
                mc = mouse_cursor;
            }
        }
    }
    

     

    Y con esto ya tenemos hecho un ejemplo en Piston.

    Si quieres tener un ejecutable para Windows sin que se muestre primero la consola debes compilar la versión que vas a distribuir con unos parámetros especiales. Si usas Rust con GCC usarás:

    cargo rustc --release -- -Clink-args="-Wl,--subsystem,windows"

    Si por el contrario usas Visual C++:

    cargo rustc --release -- -Clink-args="/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup"

     

    Piston todavía se encuentra en fuerte desarrollo, en la API estan documentados todos los métodos pero aun así muchas veces no se sabe como hacer ciertas cosas. Piston soporta además 3D, contando con una librería especializada en vóxels. Veremos como evoluciona esta librería.

    La entrada Tutorial de Piston, programa juegos en Rust aparece primero en Blog - Adrianistan.eu.

    Domingo 15 de enero de 2017

    Ha llegado Calligra Suite 3.0

    Luego de la separación de Krita (que sigue avanzando a un ritmo irresistible: ya va por la versión 3.1), hoy el equipo de Calligra Suite ha anunciado la disponibilidad de la versión 3.0 del paquete de oficina construido sobre tecnologías KDE: Calligra 3.0 released En el breve anuncio oficial descubrimos lo que era de esperarse: […]

    Sábado 14 de enero de 2017

    Samuel Arroyo

    Samuel Arroyo
    WordPress

    Hello world!

    WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてください !

    Viernes 13 de enero de 2017

    BlogDRAKE: ShellCheck una herramienta para revisar scripts

    Jueves 12 de enero de 2017

    Música «invisible» para Plasma

    Un par de años atrás escribí un artículo llamado «Música “Invisible”» en el que comentaba mis problemas, y la solución para KDE4 que había encontrado, con los reproductores de música tradicionales. Auto referencia: Todos los reproductores de música en todos los sistemas operativos tienen un problema para mi: son demasiado visibles. Cuando escucho música en […]
    Baltasar Ortega

    Baltasar Ortega
    KDE Blog

    Clarity, excelente pack de iconos monocromáticos para Plasma

    Volvemos con el tema de los packs de iconos para Plasma con Clarity, una excelente colección de iconos monocromáticos ideal para los escritorios minimalistas pero coloridos que en ocasiones queremos convertir nuestro espacio de trabajo.

    Clarity, excelente pack de iconos monocromáticos para Plasma

    De la mano y la mente de jcubic nos llega un nuevo pack de iconos monocrpmáticos para Plasma para escitorios Plasma de KDE, Gnome, Xfce, etc.

    Se trata de Clarity, un pack de iconos planos, mocromáticos pero con un preciso sombreado gris que lo hacen simple pero muy elegante. Además sus dibujos curvados los hacen ideales para un escritorio mimalista pero coloridos.

    Clarity

    Como podemos ver en la imagen superior podemos tener Clarity en varias tonos cromáticos, cada una bautizada con un nombre. De esta forma tenemos:

    1. Caeruleus – Gradiente azulado
    2. Lux_caeruleus – Variante brillante de caeruleus
    3. Canus – Gradiente gris (estilo por defecto)
    4. Dark_canus – Gradiente gris oscuro (ideal para temas claros)
    5. Luteus – Gradiente naranja
    6. Violaceus – Gradiente  violeaceo o rosa
    7. Lux_violaceus – Variante brillante de Violaceus
    8. Viridis – Gradiente verde

    Si contáis, un par más de los que aparecen en la imagen ya que en esta no aparecen las variantes brillantes.

    Según podemos leer en su página de KDE Look , se puede encontrar el repositorio del tema en https://github.com/jcubic/Clarity, donde se pide que se reporten los errores como las peticiones de iconos que falten en el pack.

    Más información: KDE Look

    Cómo instalar Clarity

    Para instalar Clarity, al menos en su tema básico de color gris, basta con seguir los siguientes pasos:

    Para ello vamos a recurrir al cada vez más completo Preferencias de Sistema de KDE, para ello seguimos los siguientes pasos:

    • Iniciamos el Lanzador de aplicaciones o Kickoff
    • Clicamos en la Preferencias del sistema.
    • Ahora pinchamos en Apariencia del espacio de trabajo.
    • Ahora nos vamos a la sección de Iconos
    • En la parte inferior nos aparece el botón de Obtener nuevos temas. Lo pulsamos.
    • Nos aparecerá la ventana que nos enlaza a los packs de iconos de KDE Look. Vamos a instalamos el pack Clarity.
    • Automáticamente nos instalará el pack de iconos. Cerramos la ventana y ya vemos el nuevo pack en la lista de packs de iconos.
    • Ahora simplemente seleccionamos el pack y pulsamos Aplicar.

    Podéis ver el proceso en imágenes en esta entrada del blog.

     

     

     

    Miércoles 11 de enero de 2017

    Baltasar Ortega

    Baltasar Ortega
    KDE Blog

    Lanzado digiKam 5.4, mejorando la gestión multimedia

    Ya tenemos la cuarta revisión de la quinta versión de digiKam (esto parece la escena del contrato de los Hermanos Marx), es decir, ya ha sido lanzado digiKam 5.4. Con esta actualización se sigue afinando la aplicación y mejorando algunos aspectos como el manejo de los duplicados y el visualizador de vídeos.

    Lanzado digiKam 5.4

    Tras el gran salto de digiKam a Qt5/KF5, ya tenemos entre nosotros su cuarta gran revisión que destaca por el trabajo realizado por los desarrolladores solucionando los errores reportados por los usuarios, algo fundamental para el buen desarrollo de cualquier aplicación en los tiempos que corren, y en la mejora de las funcionalidades que tiene digiKam.

    Y es que de la mano de Mario Frank se ha mejorado sustancialmente la usabilidad de fuzzy sidebar. De esta forma, la barra nos ofrecerá mucha más información.

    Además, en los resultados de la búsqueda de duplicados ahora contiene el tanto por ciento de potencial duplicidad. Esta información nos permite ordenar los resultados por dicho parámetro, lo cual nos ayudará a decidir qué hacer con las imágenes.

    Lanzado digiKam 5.4

    Pero no solo se ha mejorado esto y nos encontramos con un buen número de otras novedades.

    • Wolfgang Scheffner ha trabajado en la mejora del digiKam handbook,  actualizando la descripción de los menús. También se ha sustituido el capítulo de la interfaz de la Cámera por la interfaz de Importación.
    • Simon Frei, otro nuevo contribuidor, ha mejorado la agrupación de imágenes. A modo de ejemplo, ahora si seleccionamos un grupo de imágenes podemos tagearlas todas con una simple acción. Además, Simon ha mejorado la Gestión de acciones masivas permitiendo ahora podamos procesar solo una acción y no todas las que tengamos programadas a la vez.
    • Maik Qualmann ha mejorado la gestión de las etiquetas. Ahora se pueden editar de forma jerárquica, histórica y permite autocompletado. Además, se han solucionado muchos errores que aparecían con Flickr y las herramientas de exportación de Google disponibles en los kipi-plugins.

    Capítulo aparte merece que a partir de esta versión, digiKam ha sido portado a QtAV framework para gestionar archivos de vídeo y audio, con lo que se resuelven muchos de los problemas con la reproducción de dichos archivos. Estos problemas estaban presentes tanto en la versión de Windows, MacOS y Linux, y con el nuevo sistema se consigue una mejor integración y pone la base para futuras mejoras. Un gran paso para digiKam.

    Tenéis la explicación completa en el anuncio oficial de lanzamiento.

    Pedro L. Lucas

    Pedro L. Lucas
    Cartas de Linux

    Creando un archivo que se puede leer desde Linux pero no desde Windows

    Hace poco, por accidente, creé una archivo que se podía manejar desde Linux, pero Windows no podía con él. La cuestión es bastante sencilla:

    Windows usá los dos puntos “:”, para identificar unidades, como por ejemplo, C:, D:, G:,… Por lo tanto el símbolo : no debería usarse en Windows para poner nombres a ficheros.

    En mi caso en el nombre del fichero había puesto una hora en el formato: “20:30:00”. Claro, el separador era “:”.

    Al llegar a Windows, me encontré que el navegador de ficheros lo listaba pero no lo podía abrir. Daba igual la aplicación que intentase usar. Para colmo el mismo error se producía si intentaba renombrar el archivo desde Windows.

    ¿La solución? En mi caso me fue más sencillo volver a Linux y cambiar el nombre del archivo.


    Martes 10 de enero de 2017

    Baltasar Ortega

    Baltasar Ortega
    KDE Blog

    Sigue en directo Plasma 5 en las V Jornadas y Talleres Libres

    Hoy me permito hacer hincapié en la charla que voy a hacer mañana en la UNED de Vila-real. La razón es que es la que más me gusta y me gustaría que tuviera la máxima repercusión posible. Además, aprovecharé la ocasión para animarte a que sigas en directo la charla “Plasma 5, el escritorio definitivo” ya que desde hace un tiempo, en las V Jornadas y Talleres Libres de la UNED de Vila-real, emitimos en directo, y posteriormente se pone en diferido, todas las ponencias.

    Sigue en directo Plasma 5 en las V Jornadas y Talleres Libres

    Mañana 11 de enero es uno de los días que tengo marcados en rojo en mi calendario. Me toca hablar de los productos de la Comunidad KDE en la Universidad donde tutorizo algunas asignaturas.

    Y es que el protagonista de la charla mensual de las V Jornadas y Talleres Libres de la UNED de Vila-real será “Plasma 5, el escritorio libre definitivo”, la ponencia que más me gusta realizar dentro de la limitada serie de charlas de mi repertorio.

    En ella intentaré en primer lugar dejar claro que es el Proyecto de la Comunidad KDE, para posteriormente dedicarme a realizar una breve demostración tanto de Plasma 5 como de una aplicación KDE (que seguramente será Dolphin). Tambien, si tengo tiempo, mostraré el funcionamiento de KDE Connect y echaremos un vistazo a Plasma 5.9.

    Me encantaría que asistierais al salón de Actos de la UNED de Villa-real a las 19 horas, pero si no podéis, os invito a seguirlo en directo en este enlace.

    El cartel es el siguiente y agradecería que tuviera la máxima repercusión posible, así que por favor compartirlo en vuestras redes sociales.No suelo pedirlo públicamente, pero este tipo de charlas son las que enganchan a la gente al mundo del Software Libre.

    Sigue en directo Plasma 5

    La información básica de la charla es la siguiente:

    Otras informaciones

    Otras informaciones útiles respecto a las V Jornades Lliures son las siguientes:

    • Si quieres colaborar, no tienes más que ponerte en contacto con nosotros (jornadeslliures@unedvila-real.es)
    • Puedes seguir las noticias en:
    • El listado de charlas y talleres pendientes es el siguiente:
      • 26 de Octubre: Software Libre, mucho más que Software, por Baltasar Ortega
      • 28 de Octubre: Taller instalación GNU/Linux, por Ignacio Monforte
      • 16 de Noviembre: Wikipedia, la enciclopedia libre, por Santiago Navarro
      • 18 de Noviembre: Taller Wikipedia, por Santiago Navarro
      • 14 13 de Diciembre: Slimbook, el ultrabook libre, por Alejandro López
      • 11 de Enero: Plasma 5, el escritorio definitivo, por Baltasar Ortega
      • 13 de Enero: Taller aplicaciones KDE, por Baltasar Ortega
      • 15 de Febrero: Sistemas inalámbricos por Héctor Tomás
      • 17 de Febrero: Taller sistemas inalámbricos por Héctor Tomás
      • 15 de Marzo: La potencia del terminal, por Erik Poveda
      • 12 de Abril: Que no te engañen con el “feisbuc”, por Jonathan Secanella
      • 10 de Mayo: Raspberry, tu microordenador libre, por Jesús Marín

    Agradecemos a la UNED de Vila-real las facilidades para realizar las charlas y los talleres, así como a toda la gente involucrada en las jornadas su buena predisposición.

    Lunes 09 de enero de 2017

    BlogDRAKE: Mageia_Magnet

    Domingo 08 de enero de 2017

    David Moreno

    David Moreno
    dm's blog

    Thanks Debian

    I sent this email to debian-private a few days ago, on the 10th anniversary of my Debian account creation:

    Date: Fri, 14 Aug 2015 19:37:20 +0200
    From: David Moreno 
    To: debian-private@lists.debian.org
    Subject: Retiring from Debian
    User-Agent: Mutt/1.5.23 (2014-03-12)
    
    [-- PGP output follows (current time: Sun 23 Aug 2015 06:18:36 PM CEST) --]
    gpg: Signature made Fri 14 Aug 2015 07:37:20 PM CEST using RSA key ID 4DADEC2F
    gpg: Good signature from "David Moreno "
    gpg:                 aka "David Moreno "
    gpg:                 aka "David Moreno (1984-08-08) "
    [-- End of PGP output --]
    
    [-- The following data is signed --]
    
    Hi,
    
    Ten years ago today (2005-08-14) my account was created:
    
    https://nm.debian.org/public/person/damog
    
    Today, I don't feel like Debian represents me and neither do I represent the
    project anymore.
    
    I had tried over the last couple of years to retake my involvement but lack of
    motivation and time always got on the way, so the right thing to do for me is
    to officially retire and gtfo.
    
    I certainly learned a bunch from dozens of Debian people over these many years,
    and I'm nothing but grateful with all of them; I will for sure carry the project
    close to my heart — as I carry it with the Debian swirl I still have tattooed
    on my back ;)
    
    http://damog.net/blog/2005/06/29/debian-tattoo/
    
    I have three packages left that have not been updated in forever and you can
    consider orphaned now: gcolor2, libperl6-say-perl and libxml-treepp-perl.
    
    With all best wishes,
    David Moreno.
    http://damog.net/
    
    
    [-- End of signed data --]
    

    I received a couple of questions about my decision here. I basically don’t feel like Debian represents my interests and neither do I represent the project – this doesn’t mean I don’t believe in free software, to the contrary. I think some of the best software advancements we’ve made as society are thanks to it. I don’t necessarily believe on how the project has evolved itself, whether that has been the right way, to regain relevancy and dominance, and if it’s remained primarily a way to feed dogmatism versus pragmatism. This is the perfect example of a tragic consequence. I was very happy to learn that the current Debian Conference being held in Germany got the highest attendance ever, hopefully that can be utilized in a significant and useful way.

    Regardless, my contributions to Debian were never noteworthy so it’s also not that big of a deal. I just need to close cycles myself and move forward, and the ten year anniversary looked like a significant mark for that.

    Poke me in case you wanna discuss some more. I’ll always be happy to. Specially over beer :)

    Peace.

    Lunes 02 de enero de 2017

    BlogDRAKE: ¿Están exagerando las compañías con las restricciones de acceso a los servicios web?

    Miércoles 21 de diciembre de 2016

    Juanjo Amor

    Juanjo Amor
    DrAmor's Blog

    Acabemos con los intersticiales

    ¡Interstitials!

    Vaya palabro. “Interstitials”. Intersticiales en español. Anuncios intersticiales; que para la RAE serían aquellos que ocupan los intersticios, pero que, realmente, son anuncios que ocupan toda la pantalla y son especialmente molestos porque,

    • Impiden visualizar la página que queremos ver. Vamos, que molestan, y mucho más, que los pop-ups de toda la vida.
    • Incitan al click fraudulento: La mayor parte de las veces que pulsamos sobre el anuncio, no es para acceder al producto anunciado sino para cerrar el mismo. El botón para cancelarlo suele requerir de una especial destreza (o puntería) del usuario sobre su pantalla multitáctil… a menos que tengas los dedos del tamaño de la cabeza de un alfiler.

    Anuncio Intersticial, imagen de Google

    Pues bien, hace ahora más de 4 meses, Google anunció que iba a penalizar el uso de anuncios intersticiales en las búsquedas desde móvil a partir de enero de 2017, algo que ya está a la vuelta de la esquina.

    Es bueno recordarlo porque, a día de hoy, la mayor parte de las páginas de actualidad en Internet siguen incorporando este tipo de anuncios como si nada, haciendo muy incómoda la lectura, sobre todo en móviles, donde deshacerse del anuncio resulta complicado y por lo que, muchas veces, un servidor decide abandonar el medio de comunicación elegido para irme a uno alternativo que me informe más y me moleste menos.

    Aún me queda la esperanza de que esta penalización del buscador realmente consiga su efecto. Mientras tanto, seguiremos haciendo uso extensivo y abusivo de los bloqueadores de anuncios, pese a los avisos de determinados medios de que eso les hace daño.

    Pedro L. Lucas

    Pedro L. Lucas
    Cartas de Linux

    Groff: El procesador de textos que ya tienes instalado

    Haciendo un ejercicio de arqueología informática, he estado escribiendo un manual sobre el procesador de textos Groff:

    manual_groff.pdf

    Escribir este manual ha sido toda una experiencia, pues en muchos casos la documentación que hay en la red sobre este procesador de textos ¡data de los años 70!

    Groff es la versión GNU de troff, procesador de textos usado en los antiguos UNIX.

    A día de hoy groff está ampliamente superado por LaTEX, pero es ligero, se puede manejar por tuberías y seguramente ya lo tengas instalado por defecto en tu distribución de Linux, porque se usa para generar los manuales que se muestran por el comando “man”. Es muy útil para generar archivos PDF a partir de scripts escritos en bash o python.

    Espero que lo disfrutéis.


    Lunes 05 de diciembre de 2016

    Emiliano A. González Salgado

    Emiliano A. González Salgado
    El blog de Emi

    Error al inicio de Linux debido a CUPS

    Uso Fedora 25 KDE. Desde hace tiempo y, con varias versiones anteriores. se está produciendo el mismo fallo al inicio del sistema.

    Para ver los errores que se han producido en el inicio de sesión, en los sistemas que incorporan Systemd, hay que teclear el comando:

    [root@HOST-PC ~]# journalctl -b -p err

    Uno de los que estaba arrojando últimamente era:
    cupsd[1213]: Missing value on line 11 of /var/cache/cups/job.cache.

    Los números 1213 y 11 pueden variar. El primero debe ser un índice de Journal (el registro de logs de Systemd) y el segundo hace referencia a la línea del fichero job.cache que produce el fallo.

    Es este caso era debido a que cups-pdf (la impresora virtual) al crear un fichero no le asignó un nombre en el archivo job.cache.

    Intenté borrar la caché de Cups desde el administrador de impresión (system-config-printer), pero no se encontraban trabajos pendientes ni terminados. También desde la interfaz web del servidor cups: http://localhost:631/jobs?which_jobs=all

    No era posible. No se podía borrar. Incluso eliminé el contenido de  job.cachecon un editor de texto, pero al volver a iniciarse el contenido estaba otra presente, así como el error se reproducía.

    Al final la solución llegó a través de la consola.

    Los comandos a ejecutar son:

    Parar Cups:

    [root@HOST-PC ~]# systemctl stop cups.service

    Ver la lista de trabajos completados:

    [root@HOST-PC ~]# lpstat -W completed -o

    Ver la lista de trabajos no completados:

    [root@HOST-PC ~]# lpstat -o

    Eliminar todos los trabajos:

    [root@HOST-PC ~]# cancel -a -x

    Esto cancelará todos los trabajos.

    Editar el fichero  /var/cache/cups/job.cache, borrar el contenido y guardar de nuevo.

    por ejemplo con nano como root

    [root@HOST-PC ~]# nano /var/cache/cups/job.cache

    Reiniciar el sistema y ver si se ha solucionado el fallo.

    SI las respuestas dadas aquí no funcionan:

    ps aux | grep printer kill {printer job}

    Este último comando no lo he probado. con lo anterior fue suficiente.

    Un saludo,

    Emiliano

     


    Jueves 01 de diciembre de 2016

    Luis Vilchez

    Luis Vilchez
    El blog de Jabba

    Pillars of Eternity, el heredero espiritual de Baldur's Gate para OSX y Linux

    Hablar de Baldur’s Gate es hablar del gran clásico entre los clásicos de los juegos de rol computerizado. Su legado y su influencia están muy presentes en gran cantidad de los títulos que conforman el panorama del videojuego actual. Un juego con una profundidad, libertad y capacidad de personalización nunca vistas hasta entonces. Un juego que muchos tenemos como uno de los mejores -sino el mejor- RPG de la historia.


    Quince años después Pillars of Eternity pretende devolvernos la magia, la ambientación, la jugabilidad y esa aura cautivadora y mítica propia de los grandes clásicos del género; un deleite para los sentidos de los veteranos en los juegos de rol y una experiencia inigualable para los recién llegados. Me han bastado unas semanas perdiéndome virtualmente por el mundo de Eora para confirmar que Pillars of Eternity es la oportunidad de volver a revivir un JUEGAZO infinity engine de corte clásico como los de antaño. Un juego que rezuma a Baldur's Gate del bueno por los cuatro costados. ¿Y sabéis lo mejor? Con versiones nativas para OSX y... ¡Linux!

    Es de recibo decir que gran parte de la culpa de todo esto la tienen los fans y el modelo kickstarter que sus creadores usaron para financiar el proyecto (por aquel entonces bajo el nombre de Project Eternity). El resultado ha sido un RPG de corte occidental distribuido por Paradox Interactive y desarrollado por Obsidian Entertainment, creadores de sagas como Fallout, IceWind Dale o Neverwinter Nights, además del citado Baldur’s Gate.

    Como en Baldur's Gate, la primera cosa que hay que hacer en Pillars of Eternity es crear un personaje. Aspectos como las diferentes ventajas e inconvenientes de cada raza, los atributos, las clases, las limitaciones de atributo por clase, las alineaciones morales, las habilidades complementarias, afinidad de armas, selección de conjuros, clases duales... habrá que tenerlos muy en cuenta antes incluso de comenzar la "aventura". Y seguramente no es el sistema de creación de personajes más amplio de la historia del género, pero sí es MUY completo. Incluso me atrevo a decir que podrá parecer algo complejo para los recién llegados pero hará las delicias de los veteranos del género. A fin de cuentas aprender forma parte de la esencia del rol y eso pasa por cosas como la creación de nuestro personaje. A continuación os dejo un vídeo para que lo veáis en acción.


    En otras plataformas no sé, pero en Linux sin duda estamos ante el juego del año :)

    Miércoles 30 de noviembre de 2016

    Raúl González Duque

    Raúl González Duque
    Linux – Mundo Geek

    Cómo crear un pendrive USB bootable con Ubuntu en Windows

    Tener un USB con Ubuntu siempre listo en el bolsillo puede ser muy útil para solucionar problemas con Windows, eliminar virus, realizar operaciones seguras en Internet, o simplemente para jugar un poco con Linux.

    Para crear una unidad USB arrancable con Ubuntu me gusta utilizar Rufus, que es gratuita, muy ligera, rápida y cuenta con versión portable. Además de Rufus, sólo necesitaremos una ISO de Ubuntu y un pincho USB con al menos 2GB de espacio, que debe estar vacío, o no importarte mucho su contenido, porque se formateará durante el proceso.

    Conecta el pincho USB a tu equipo y ejecuta Rufus.

    En “Dispositivo” selecciona tu pincho USB.

    Marca la opción “Crear disco de arranque con:”, selecciona “Imagen ISO”, y haz clic sobre el icono del CD Rom para abrir un diálogo en el que buscar la imagen ISO que has descargado

    USB booteable Ubuntu

    Pulsa el botón “Empezar”. Te avisará de que necesita descargar un par de archivos de Internet, pulsa en “Sí”.

    Cuando te pregunte por el modo de escritura de la imagen, selecciona “Escribir en modo Imagen ISO (Recomendado)”.

    A continuación te avisará de que va a proceder a formatear el dispositivo USB. Haz clic en “Aceptar” para empezar el proceso.

    Lunes 28 de noviembre de 2016

    José María Morales Vázquez

    José María Morales Vázquez
    tecnología – Un lugar en el mundo…

    Centralizando los datos de munin de varios servidores

    herramientas Hemos hablado bastante por aquí en los últimos años acerca de munin. No en vano se trata de una de mis herramientas de monitorización favorita. Vamos a completarlas con alguna cosa más.

    Cuando queremos monitorizar varios servidores diferentes, lo más cómodo es verlos todos en la misma página del navegador. Para ello hacemos lo siguiente:

    En primer lugar, recordad que munin tiene dos módulos diferentes: munin y munin-node. En el artículo inicial de esta “saga” instalábamos tres paquetes: munin, munin-node y munin-plugins-extra. Ahora instalaremos los tres sólo en la máquina que centralizará los datos de la monitorización. Esta máquina se configurará igual que vimos ya en su día y debe de contar con un servidor web, intérprete de php y todo lo que ya hablamos en su momento. En las máquinas que solamente queremos monitorizar sólo instalaremos los dos paquetes finales (munin-node y munin-plugins-extra).

    En todas las máquinas (salvo la que centralizará la comunicación) tendremos que editar el fichero /etc/munin/munin-node.conf. En este fichero nos aseguraremos de que aparecen dos líneas como estas:

    host_name nombre2.midominio.net
    allow 33.44.55.66

    Donde 33.44.55.66 es la IP de la máquina que centralizará la monitorización de munin y nombre2.midominio.net será el nombre con el que queremos que aparezca esta máquina en nuestro panel de monitorización. Una vez hecho esto reiniciamos el daemon de munin-node: systemctl restart munin-node

    En la máquina donde queremos ver las gráficas editamos el fichero /etc/munin/munin.conf y escribimos algo como esto:

    [nombre1.midominio.net]
        address 127.0.0.1
        use_node_name yes
    
    [nombre2.midominio.net]
        address 11.22.33.44
        use_node_name yes
    
    [nombre3.midominio.net]
        address 55.66.77.88
        use_node_name yes

    El primer bloque (nombre1.midominio.net) corresponde a la máquina en la que estamos editando el fichero y por eso usamos 127.0.0.1 como dirección. Cada uno de los otros corresponde con una de las máquinas cuya información queremos recoger y centralizar en esta.

    Por defecto las máquinas aparecerán en el panel de monitorización en orden alfabético. Si queremos alterar dicho orden debemos de introducir una nueva directiva:

    [midominio.net;]
            node_order nombre2.midominio.net nombre1.midominio.net nombre3.midominio.net

    Ojo al punto y coma final de la directiva que es importante para que funcione. Luego reiniciamos el daemon munin (systemctl restart munin).

    Ahora, cuando entremos en nuestra página de monitorización veremos en la sección overview una línea llamada midominio.net y luego otra por cada una de las máquinas monitorizadas:

    Página de Overview de munin con varios servidores

    Y si pulsamos en la línea correspondiente a midominio.net veremos los datos de todos los servidores ordenados en columnas:

    Página de monitorización de munin con varios servidores

    Y ya. La próxima entrada que hagamos sobre esto irá sobre la posibilidad de que munin realice notificaciones en caso de error o de exceder de ciertos límites. Si, si, yo tampoco lo sabía, pero se puede 😉

    Artículo Original: .

    Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Centralizando los datos de munin de varios servidores || Hospedado en un Cloud VPS de Gigas.

    Sábado 12 de noviembre de 2016

    Pedro L. Lucas

    Pedro L. Lucas
    Cartas de Linux

    Ejecuta un comando de forma automática cada vez que guardes un archivo

    A veces hay que escribir comandos en consola para compilar o procesar unos archivos que se han modificado. Es tremendamente útil que esta operación se haga de forma automática. Por ejemplo, se están editando unos archivos en LATEX, cada vez que guardemos el archivo podemos conseguir que se genere el PDF correspondiente y nos lo muestre de forma totalmente automática.

    Este proceso se puede automatizar usando el comando inotifywait. Este comando nos avisa de las modificaciones que se produzcan en el o los archivos que se le indiquen. Para usarlo, se puede usar un script como el que se muestra a continuación. En archivo se introduce el nombre del archivo que se quiere vigilar. En comando el comando que se ejecutará cada vez que haya una modificación:

    b=0
    inotifywait -m --event modify archivo | while read a ;
    do
      if [[ $b -eq 0 ]] ; then
        b=1
      else
        echo $a
        comando
        b=0
      fi
    done
    

    Tecleando en un terminal:

    man inotifywait

    Tendremos disponible la documentación en la que se puede encontrar más opciones y ejemplos  de uso.


    Martes 08 de noviembre de 2016

    Raúl González Duque

    Raúl González Duque
    Linux – Mundo Geek

    ¿Cuántos usuarios de Linux se necesitan para cambiar una bombilla?

    Sea merecida o no, lo cierto es que los usuarios y desarrolladores de GNU/Linux tenemos fama de arrogantes, extremistas y de perdernos en los detalles. Desde el Proyecto GNU se toman con humor estos estereotipos calculando cuántos usuarios de Linux se necesitarían para cambiar una bombilla.

    • 1 para publicar un hilo en la lista de correo informando de que la bombilla se ha fundido
    • 1 para sugerir reiniciar la bombilla usando la línea de comandos
    • 1 para quejarse de que el usuario rompiera la bombilla
    • 1 para preguntar qué bombilla se debería instalar
    • 1 para aconsejar que no se use la palabra “fundida” para referirse a una bombilla rota, porque puede interpretarse que la bombilla se ha prendido fuego, en lugar de haberse estropeado por un exceso de corriente eléctrica
    • 25 para sugerir todos los tipos de bombilla imaginables
    • 5 para para decir que la bombilla fundida es un fallo de origen
    • 1 novato para sugerir instalar una bombilla de Microsoft
    • 250 usuarios para inundar el correo del susodicho novato
    • 300 para decir que la bombilla de Microsoft se pondría azul y tendrías que reiniciarla constantemente para que volviera a funcionar
    • 1 antiguo usuario de GNU/Linux, que todavía frecuenta el foro, para sugerir una iBombilla de Apple, que tiene un diseño fresco e innovador y sólo cuesta 250$
    • 20 para decir que las iBombillas no son libres, y que tienen muchas menos funcionalidades que una bombilla estándar 20 veces más barata
    • 15 para sugerir una bombilla nacional
    • 30 para decir que las bombillas nacionales son copias de las bombillas extranjeras y que no ofrecen nada nuevo
    • 23 para discutir si la bombilla debe ser blanca o transparente
    • 1 para recordar a todo el mundo que el nombre correcto es GNU/Bombilla
    • 1 para decir que las bombillas son sólo para usuarios de Window$ y los usuarios de GNU/Linux de verdad no tienen miedo a la oscuridad
    • 1 para anunciar finalmente el modelo de la bombilla elegida
    • 217 para descartar el modelo escogido y sugerir otro
    • 6 para quejarse de que el modelo elegido tiene elementos propietarios, y que debería usarse otro
    • 20 para decir que una bombilla 100% libre sería incompatible con el interruptor
    • Los mismos 6 anteriores para sugerir cambiar el interruptor por uno compatible
    • 1 para chillar “¡DEJAD DE DISCUTIR Y CAMBIAR LA P*#@!%¡# BOMBILLA DE UNA VEZ, POR EL AMOR DE DIOS!”
    • 350 para preguntar al usuario anterior a qué Dios se refiere, y si tiene pruebas empíricas de su existencia
    • 1 para explicar cómo funciona la electricidad y por qué una bombilla eléctrica es ineficiente
    • 1 para decir que no se puede confiar en una bombilla fabricada por una corporación y que deberíamos confiar en bombillas hechas por la comunidad
    • 1 para publicar un enlace a un archivo ODF explicando cómo construir una bombilla desde cero
    • 14 para quejarse del formato del archivo anterior, pidiendo que se envíe en txt o LaTeX
    • 5 para decir que no les gustó la decisión y van a hacer forks de la instalación eléctrica de la casa para instalar una lámpara mejor
    • 1 para publicar una serie de comandos a introducir para cambiar la bombilla
    • 1 para comentar que ejecutó los comandos y obtuvo un mensaje de error
    • 1 para aconsejar que los comandos deberían ejecutarse como root

    Y finalmente:

    • El padre del usuario original, que mientras todos estaban discutiendo, se acercó a la tienda y compró la bombilla más barata que vendían

    Lunes 07 de noviembre de 2016

    Raúl González Duque

    Raúl González Duque
    Linux – Mundo Geek

    Los 10 comandos más útiles de Linux

    CommandlineFu es una web donde los usuarios pueden enviar sus comandos Linux favoritos, añadir comentarios, y votar los comandos enviados por otros usuarios; un recurso imprescindible si queréis convertiros en verdaderos expertos en el uso de la consola. Y para muestra, un botón: estos son los 10 comandos más votados por sus usuarios.

    sudo !!

    Ejecuta el último comando introducido como root.

    python -m SimpleHTTPServer

    Inicia un servidor web que sirve los archivos del directorio actual en http://localhost:8000

    ^foo^bar

    Ejecuta el último comando, reemplazando el texto “foo” por “bar”

    Ctrl + X, Ctrl E

    Invoca un editor de textos en el que poder escribir el comando que vamos a ejecutar. El comando se ejecutará una vez se cierre el editor

    Alt + .

    Inserta el último argumento utilizado en el punto en que esté situado el cursor

    reset

    Resetea la consola

    mount | column -t

    Muestra los puntos de montaje actuales con un formato amigable para la lectura

    echo “ls -l” | at midnight

    Ejecuta un comando en el momento indicado

    curl ip.appspot.com

    Descarga el documento de http://ip.appspot.com para mostrar la IP externa del equipo

    man ascii

    Muestra la página de ayuda con la tabla de caracteres ASCII

    Domingo 30 de octubre de 2016

    Marcelo Fortino

    Marcelo Fortino
    Fortinux

    Tutorial usar git-annex para sincronizar archivos entre dispositivos GNU/Linux

    Tutorial usar git-annex como repositorio de archivos Una forma de tener nuestros archivos sincronizados entre el notebook, desktop y otros dispositivos es usar como herramienta git-annex. Git-annex gestiona archivos con Git sin verificar el contenido de los mismos. Esto permite trabajar con archivos grandes usando repositorios sincronizados.

    Jueves 27 de octubre de 2016

    繊細ゾーンの抜毛を抜毛サ

    華奢ゾーンの抜け毛を抜け毛エステですると、キレイに成し遂げるだけでなく、肌荒れが起きる可能性も低いだ。
    ただし、すべての抜け毛エステについて華奢ゾーンの抜け毛を実施している根拠ではなく恰好HPをチェックしてみてください。
    華奢ゾーンの抜け毛は後ろめたいという方も、よくいますが、女子の人手が行ないますし、名人としてもらったほうがセキュリティだ。
    分娩が終わってからスパンを空けずに抜け毛エステで脱毛するのはオススメできません。
    妊娠、分娩、産後の一定の時はホルモンのプラスにより、ムダ毛が上がる自身が多いためです。
    仮に、妊娠の影響でムダ毛が生えやすくなっても、産後、年間以内にはムダ毛の件数が立ち戻るでしょう。
    不安になっても、いまだに身体もあやふやでしょうし、産後の約年間は待つようにしてください。
    抜け毛エステ、それは抜け毛に限定されたオペ事項は抜け毛だけなので、担当は戦法力を伸ばし易くなるでしょう。
    それと、痩身プランやフェイスプランなどの別プログラムをここ数年の間に、乏しい単価確立に移行してきたこともあり、抜け毛エステを選択する女性が増加傾向にあります。
    全体抜け毛施術をするのに加わる金額は、エステを通じておもったより違いがあります。
    VIOシルエット抜け毛をふくめた全体抜け毛計6回のお値段は、値段が安くてて10万円ほど、高くて30万円ほどかかります。
    じつに3ダブルも料金がことなるのです。
    全体抜け毛にかかる単価のアベレージは約16万円なので、一般的な単価としては15〜18万円程度で、13万円もかからなければ安く、オペチャージが20万円を超えたら高いです。
    元々全体抜け毛単価の平均が分かると心に隙間が出ますね。
    エステでの抜け毛はオペを受けに行く前に自分でオペ部分を処理しておきましょう。
    ムダ毛が残っているときは、オペを受け付けて貰えない可能性もあります。
    かたや、エステ人手が無料で処理してもらえるケースがあったり、やり方が抜け毛エステを通じてちっとも違う。
    抜け毛エステをめぐっているのに断られては原料もお子さんもありませんので、細心の注意を払いましょう。
    指定に常時対応して得る抜け毛エステだったら、忙しい自身も、ナカナカ指定できずに行けなくなってしまったり終わるからオススメです。
    web指定なら呼び出し指定の煩わしさもありません。
    抜け毛エステも有名ならそれほど採用していますが、まれにweb指定厳禁のところもあるらしいので要注意です。
    それに、ネットから思いお日様を予約しても、エステからの答弁メイル(コンピューターの人脈を利用して、声明を交換する報告秘訣の一種だ)や呼び出し考察無しには指定がとれたことにならないエステも多いのです。
    全体抜け毛を受ける場合には、抜け毛エステを選択しなければなりません。
    その場合、全体抜け毛の平均的な相場を調べておくことが大事です。
    異常に高額の抜け毛エステのおみせは持ちろん、避けてください。
    また、どうしても安すぎるおみせも気をつけた方がいいでしょう。
    全体抜け毛に必要な平均的な価格を調べておけば、最適な抜け毛エステを選ぶ事が可能です。
    いま、抜け毛エステを比較したカテゴリーHPは非常に多いです。
    ただし検討の基盤がどこにあるのかを分析するだけの眼力がユーザーには必要だと思います。
    例を挙げると、指定の取りやすさ、抜け毛インパクトなどによっても、抜け毛エステのクラス据え置きなんて変わってしまいます。
    検討の指標は、読者視点で何に重きを置くかと判断する上で大事です。

    Miércoles 26 de octubre de 2016

    抜け毛店先や温泉で有名な輝き

    抜け毛店舗やエステで有名な灯抜け毛はおめでた当事者の時にうけても危うくないのでしょうか?普通は、おめでた当事者は灯抜け毛は不可能だとされています。
    妊娠している時はホルモンのバランスが崩れた状態になっているため、肌荒れが起き易くなったり、抜け毛反響がやたら得られないことがあるのが訳です。
    一時期、恒久抜け毛は痛みを伴うタイプといわれる企業多かったのですが、それは抜け毛に使用されるエクササイズマシーンの種類によってもことなるのではないでしょうか。
    此度、僕が処理にあたっておる恒久抜け毛は別に苦痛は感じません。
    脱毛する状態、ほんの際、チクリとした感度があるのですが、際だけのことなので、厳しいというほどのことではありません。
    自宅で抜け毛をするのは難題で思い通りにきれいにならないことも再三あるはずです。
    ムダな毛髪をなんとか無くしたいって常日頃思うなら、抜け毛ができる店舗で全身の抜け毛をすることを視野に入れてみるのはいかがでしょう。
    エキスパートによるおっきい効果のある抜け毛を必ず経験してみてちょーだい。
    わき毛の抜け毛は女性が金字塔気にするフロアでしょう。
    いくら美しい衣服を着立としても、ワキ毛髪がのぞいていたら、どうしても残念に受け取るはずです。
    マニアだと思っていた個人もすぐに嫌いになるケースだって考えられます。
    中でも夏は脇の下が開いた衣服を着て脇毛が引き立ち易くなりますし、自己処理でかぶれたりして不必要な課題を抱えることになります。
    抜け毛サロンジェイエステティックはムダ毛作製以外にも、フェイスエステやダイエット道程も通算エステができる店舗だ。
    抜け毛やり方(では指しうる見通しをピックアップすることが肝心だ)はほかの抜け毛店舗もおなじみの灯抜け毛だ。
    格安で同店の美肌抜け毛を体験できるお試し道程も用意され、割に要求太陽にリザーブを入れ易い事項もジェイエステは評価されています。
    会社は全国に100会社以来あり、こんなところにもというような地区にもあります。
    行けそぐうなと頃に支店があれば、お試しキャンペーンなどで体験してみる美味はあるでしょう。
    ムダ毛作製を自宅で行なうのは苦しみするものです。
    たとえばビデオ方策や背中といった自分で講じるには難しい地点があったり、日毎ムダ毛のお手入れをするのは厄介で精力を使いますし、気がかりに感じている方もいるのではないでしょうか。
    それなら、抜け毛店舗に任せれば、自己処理が困難地点の抜け毛も惑いいらないですし、自己処理に手間取る必須もピリオド指せられるでしょう。
    所々の会社が日本ざっと最寄り駅から足5分け前で行けてしまうというのが、抜け毛店舗「エタラビ」特有の事項だ。
    26地点に関する全身のパートの抜け毛を給料9500円で行なう道程と処理地点の人数を10に落として月4980円の道程が提供されています。
    再度、通常は抜け毛店舗で処理をうける前に施術する地点が自己処理されているべきですが、剃り忘れの時エタラビでは無料で作製を代行してもらえるお手伝いがあります。
    いよいよ抜け毛が終わっ立と思っても2、3クラスの抜け毛では一時的に休んでいた毛根が努力を通じて、ムダ毛が現れることもあります。
    その訳は、店舗の抜け毛だと恒久抜け毛ではない為、完全にムダ毛が立ち戻る可能性も全くないは言い切れないのです。
    かと言って生えてきた毛髪が元々の分厚い毛髪であるとかの可能性は小さく、持ちろん、脱毛する前と比較したら日々のお手入れの時間が果てしなく省かれます。
    抜け毛をした後々も引き続き生えていない個人もいるので、立とえ永遠に生えてこないとは言えずとも、十分すぎる効果は持てるでしょう。

    Domingo 16 de octubre de 2016

    Marcelo Fortino

    Marcelo Fortino
    Fortinux

    Tutorial instalar Plone CMS en Ubuntu server

    En este tutorial veremos como podemos instalar el gestor de contenidos Plone en un servidor Ubuntu 14.04 o 16.04. Plone es un gestor de contenidos basado en el servidor de aplicaciones Zope que es bastante utilizado como Intranet en gobiernos y empresas, entre ellos, el gobierno brasileño, la universidad de Oxford (Reino Unido) o Google.

    Lunes 29 de agosto de 2016

    Juanje Ojeda

    Juanje Ojeda
    Nada de particular

    Ser menos sedentarios en esta vuelta al cole

    Como ya comenté en la entrada anterior, me estoy centrando en la salud y en la manera de hacer que la gente (sobre todo frikis sedentarios como yo :-P ) mejore su salud.

    Últimamente escribo bastante sobre el tema, en el otro blog, pero me gustaría hacer un pequeño resumen y enlazar directamente aquellos artículos que puedan ser más útiles, para ahorrarles tiempo.

    En el artículo «Saliendo del sedentarismo», planteo 3 ejercicios muy concretos y fáciles poner en marcha para empezar.
    Buscando ser lo más efectivos posibles, busqué aquellos tres «ejercicios» que consiguieran mayores resultados, con el menos esfuerzo.

    En el artículo se explican y se enlazan también otros artículos que desarrollan dichos ejercicios.

    Otro artículo que les puede interesar, no sólo para empezar a ser menos sedentarios, sino para empezar cualquier objetivo que se planteen es el de «Sedentarios Anónimos».

    Explica algunas estrategias muy concretas que pueden ayudarnos a no desistir por el camino y a conseguir llegar a nuestra meta.

    Con esto tienen suficiente para hacer una vuelta al cole menos sedentaria y mejorar su salud en este nuevo «curso» ;-)
    David Moreno

    David Moreno
    dm's blog

    Webhook Setup with Facebook::Messenger::Bot

    The documentation for the Facebook Messenger API points out how to setup your initial bot webhook. I just committed a quick patch that would make it very easy to setup a quick script to get it done using the unreleased and still in progress Perl’s Facebook::Messenger::Bot:

    use Facebook::Messenger::Bot;
    
    use constant VERIFY_TOKEN => 'imsosecret';
    
    my $bot = Facebook::Messenger::Bot->new(); # no config specified!
    $bot->expect_verify_token( VERIFY_TOKEN );
    $bot->spin();
    

    This should get you sorted. What endpoint would that be, though? Well that depends on how you’re giving Facebook access to your Plack’s .psgi application.

    Domingo 21 de agosto de 2016

    David Moreno

    David Moreno
    dm's blog

    WIP: Perl bindings for Facebook Messenger

    A couple of weeks ago I started looking into wrapping the Facebook Messenger API into Perl. Since all the calls are extremely simple using a REST API, I thought it could be easier and simpler even, to provide a small framework to hook bots using PSGI/Plack.

    So I started putting some things together and with a very simple interface you could do a lot:

    use strict;
    use warnings;
    use Facebook::Messenger::Bot;
    
    my $bot = Facebook::Messenger::Bot->new({
        access_token   => '...',
        app_secret     => '...',
        verify_token   => '...'
    });
    
    $bot->register_hook_for('message', sub {
        my $bot = shift;
        my $message = shift;
    
        my $res = $bot->deliver({
            recipient => $message->sender,
            message => { text => "You said: " . $message->text() }
        });
        ...
    });
    
    $bot->spin();
    

    You can hook a script like that as a .psgi file and plug it in to whatever you want.

    Once you have some more decent user flow and whatnot, you can build something like:



    …using a simple script like this one.

    The work is not finished and not yet CPAN-ready but I’m posting this in case someone wants to join me in this mini-project or have suggestions, the work in progress is here.

    Thanks!

    Lunes 25 de julio de 2016

    Ramón Ramón Sánchez

    Ramón Ramón Sánchez
    Software Libre y Comunicación

    Los datos abiertos generan transparencia, riqueza y empleo

    Las políticas de datos abiertos, fruto del esfuerzo de organizaciones sociales y administraciones públicas ha supuesto una revolución en cuanto a la apertura de información, y lo que es más importante, a la generación de valor en torno a datos que hasta no hace mucho apenas se les daba uso. Existen en la actualidad más de 2500 portales de datos... Leer más »

    La entrada Los datos abiertos generan transparencia, riqueza y empleo aparece primero en Software Libre y Comunicación.

    Sábado 23 de julio de 2016

    Ramón Ramón Sánchez

    Ramón Ramón Sánchez
    Software Libre y Comunicación

    ¡Cuidado con el “secuestro digital”! 3 medidas para proteger tus cuentas de redes

    Hace un par de semanas el director de una cadena de restaurantes llegó a nosotros desesperado. Su anterior Community Manager había dejado la empresa y se había llevado las claves de las cuentas de redes sociales y de los correos a las cuales estaban vinculadas. El hombre estaba ¡ilocalizable!             La solicitud del cliente fue:... Leer más »

    La entrada ¡Cuidado con el “secuestro digital”! 3 medidas para proteger tus cuentas de redes aparece primero en Software Libre y Comunicación.