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» ;-)
Asociación LiGNUx: Higan (multiemulador de consolas Nintendo)
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.

Miguel Parada

Miguel Parada
Ubuntizando.com

Cómo ajustar el brillo de tu monitor automáticamente usando tu webcam

La mayoría de los smartphones del mercado incluyen la función de ajustar el brillo de la pantalla automáticamente en función de las condiciones lumínicas que tengamos mientras los usamos. De este modo mejora la experiencia de uso y optimizamos la batería, lo que está genial si te dedicas a cazar pokemons por la calle.

Algunos portátiles también incluyen esta función y para aquellos que no existe una solución muy ingeniosa que utiliza nuestra webcam como sensor. WildGuppy funciona tomando fotografías a intervalos regulares y analiza las condiciones de luz a partir de ellas. Genial ¿verdad?

Eso sí, si te preocupa tu privacidad yo he resuelto el problema añadiendo una cinta 3M Scotch-magic traslucida que podemos encontrar en cualquier papelería. Funciona perfectamente y los “huakers” solo verán un borrón.

Para instalar Wildguppy en Ubuntu y distribuciones derivadas debemos escribir lo siguiente en el terminal:
sudo add-apt-repository ppa:fantasyleague0629/wildguppy
sudo apt-get update
sudo apt-get install wildguppy

Y una vez finalizada la instalación escribiremos wildguppy o lo ejecutamos desde el menú de aplicaciones.

Si queremos activar WildGuppy automáticamente al inicio de sesión debemos escribir lo siguiente o añadir WildGuppy como aplicación al inicio.
wget http://dl.dropboxusercontent.com/s/bcnzhxv6mrmipdd/wildguppy-gtk.desktop -O ~/.config/autostart/wildguppy-gtk.desktop

Y ya está. Si todo ha ido bien WildGuppy se ejecutará y así podemos controlar dinámicamente el brillo de nuestra pantalla.

wildguppy

Fuente: http://www.webupd8.org

La entrada Cómo ajustar el brillo de tu monitor automáticamente usando tu webcam aparece primero en Ubuntizando.com.

Miguel Parada

Miguel Parada
Ubuntizando.com

Google introduce los juegos en tus búsquedas

¿Puede ser un buscador un centro de ocio? Google quiere que así sea. Para ello acaba de anunciar que la próxima vez que se realicen ciertas consultas en el buscador éste dará la posibilidad de acceder a minijuegos. Esta opción estará disponible tanto a través del móvil como en nuestro escritorio.

tictactoe

La oferta de juegos es por el momento limitada a dos juegos como Ta-Te-Ti (tres en raya) o el Solitario. Basta con escribir su nombre en el buscador y ya podemos acceder al juego. No es que busquemos algo genérico o que quiera hacer la competencia a casas de apuestas como bonocasino o empresas que desarrollan minijuegos como Rovio.

No es la primera vez que Google introduce minijuegos en su aplicaciones. Si no recuerdo mal ya el navegador Chrome incluye un minijuego offline en donde avanzamos con un dinosaurio en una carrera de obstáculos. Este juego se activa como opción cuando nuestra conexión a internet se interrumpe. También alguna vez nos ha sorprendido con otros minijuegos temáticos. Todos recordamos a PacMan en Google Maps 😉

Parece que Google le ha pillado el gusto a que podamos jugar en su plataforma. Como digo actualmente son solo dos los juegos activados pero la idea es ir añadiendo juegos que tenemos que ir descubriendo. ¿Podremos jugar al Parchís o a juegos de tragaperras?

La entrada Google introduce los juegos en tus búsquedas aparece primero en Ubuntizando.com.

Spotify Web Player para Linux: versión no oficial

La plataforma más conocida como Spotify Web Player for Linux fue desarrollada por Matthew James al ver que la compañía no brindaba ninguna solución para los usuarios de este sistema operativo libre, y desde su creación ha ido creciendo bastante entre los usuarios, a tal punto que hoy es una de las aplicaciones más utilizadas desde distribuciones de Linux. Esta herramienta, con la cual podremos
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo crear un plugin para WordPress. Making of de SimTerm: insertar recursos JS/CSS y shortcodes (tercera parte)

simterm
Estoy haciendo un pequeño tutorial de cómo me lo he montado para crear un plugin de WordPress: simterm. El plugin inserta un shortcode que nos permite simular una ventana de terminal (sea el SO que sea) y hacer como que se escriben cosas y el sistema nos da la respuesta. Es perfecto para nuestros tutoriales y si seguís este blog, seguro que lo habéis visto miles de veces.

Esta es la tercera parte, enfocada a recursos y shortcodes. Podéis acceder desde aquí a:

  • Primera parte. Introducción y conceptos básicos de plugins de WordPress y algunas manías personales.
  • Segunda parte. Enfocada a la pantalla de configuración de nuestro plugin.

Vayamos al grano.

Insertar recursos en la web

Cuando queremos insertar archivos JS y CSS dentro de una web hecha en WordPress, como para todo, tenemos dos formas:

  • A pelo, es decir, insertando el código HTML:
    1
     <script type="text/javascript" src="ruta de nuestro script"></script>

    . Aunque esto es muy feo y muy poco recomendable ya que puede romper la estructura del HTML resultante, resultar lento para el usuario y puede que las dependencias no se gestionen correctamente (¿cuántos archivos js dependen de que jQuery se haya cargado antes? y eso de esta forma no está garantizado)

  • Utilizando funciones específicas de WordPress. Esta será la forma recomendada para que nada se rompa. Y la que contaré en este post

Insertar scripts

Aunque hay varios métodos para insertar recursos Javascript y CSS en una web hecha en WordPress, algunas formas muy complicadas. Aunque si no queremos complicarnos la vida podemos usar wp_enqueue_script(). Esta función introduce nuestro script en una cola que se podrá incluir en el <head> o justo antes de que acabe el </body&ft;. Permite además gestionar en cierto modo la versión del script que se utiliza. Eso será bueno ya que si nuestro servidor permite que el usuario guarde archivos en caché local (vamos, que el usuario se queda con los JS y los CSS para no tener que descargarlos cuando está navegando por nuestra web) lo va a utilizar de forma eficiente.

Sin más dilación, la forma en la que tenemos que utilizar esto sería:

1
wp_enqueue_script($identificador, $src, $dependencias, $version, $footer);

Es decir:

  • $dentificador: Será un identificador único de nuestro script, ningún otro script que cargue este wordpress puede llamarse igual. Esto nos ayuda con la gestión de dependencias. Si por ejemplo el Javascript que incluimos es una biblioteca genérica (underscore, angular, plugins de jQuery, etc), podemos utilizar como identificador el nombre de esta biblioteca. Esto será bueno porque si varios plugins utilizan la biblioteca al mismo tiempo sólo se incluirá una vez, evitando conflictos. Por otro lado, si el archivo Javascript es nuestro, o muy específico del plugin podemos utilizar como nombre “nombreplugin-nombrescript” para garantizar que el nombre es único. En mi caso (que pondré más adelante, los identificadores se llaman “simterm-shoryourterms” y “simterm-launcher”.
  • $src: Es la URL del recurso que vamos a incluir. Es decir, el Javascript en cuestión. Esta ruta debería ser absoluta para evitar muchos problemas en el caso en el que el blog no esté en el directorio raíz del dominio. Por ejemplo, podríamos poner aquí: “/wp-content/plugins/simterm/js/simterm.js” perfectamente, y funcionaría en muchos sitios. Pero si nuestro blog lo colocamos en www.dominio.com/blog/ ya no funcionaría correctamente. Para ello podemos utilizar la función plugins_url() de la siguiente forma:
    1
    2
    <?php
    echo plugins_url('js/simterm.js', __FILE__);

    De esta forma, la función cogerá la URL correspondiente al fichero actual del plugin y le añadirá js/simterm.js; solucionando cualquier problema que pueda presentar la ruta en el futuro.

  • $dependencias: Esto será un array con los identificadores de todos los scripts de los que dependa el javascript que estamos encolando. De esta forma, cuando se vaya a añadir definitivamente el script en la página, las dependencias se añadirán antes, incluso las dependencias de las dependencias… de esta forma evitamos este tipo de conflictos.
  • $version: Una cadena de caracteres con la versión del script que vamos a añadir, false (o nada) si queremos coger la versión que tiene WordPress (si la tiene), o null si no queremos añadir versión.
  • $footer: Es un booleano que, si vale false, añadiremos el script en la cabecera, y si vale true, lo añadiremos antes de cerrar body. También depende del momento en el que hagamos la inclusión del script, si ya tenemos la salida iniciada, es recomendable añadirlo en el footer.

Si por el contrario, sólo queremos que WordPress conozca la existencia del script, sin añadrlo atomáticamente y, si algún módulo lo incluye como dependencia se incluya automáticamente, podemos utilizar de la misma manera wp_register_script().

Insertar estilos CSS

Casi casi de la misma forma que insertamos Javascripts podemos insertar estilos, sólo que esta vez no se añaden en el footer, el último argumento de wp_enqueue_style() es $media, que especifica para qué dispositivo, orientación, o tamaño de pantalla está pensado este CSS. Por defecto ‘all’.

Ejemplo en simterm

En el plugin simterm, esto se ha hecho de la siguiente forma:

1
2
3
4
      wp_enqueue_script('simterm-showyourterms', plugins_url('js/show-your-terms.min.js',__FILE__), array(), '20160705', true);
      wp_enqueue_script('simterm-launcher', plugins_url('js/simterm.js',__FILE__), array('simterm-showyourterms'), '20160705', true);
      wp_enqueue_style('simterm-showyourtermscss', plugins_url('css/show-your-terms.min.css', __FILE__), array(), '20160705', 'all');
      wp_enqueue_style('simterm-extracss', plugins_url('css/simterm.css', __FILE__), array(), '20160705', 'all');

Inserto dos JS y dos CSS, para mantener compatibilidad con el script original, inserto el JS y el CSS originales tal cual están en el repositorio (tengo mi propio fork en GitHub, con algunas modificaciones), por otro lado hay un JS y un CSS para adaptar a WordPress estos archivos (son un pequeño cambio, pero me gusta tenerlo todo separado).
Por otro lado, para los números de versión he utilizado la fecha en formato YYYYMMDD (añomesdía), y los scripts los he situado en directorios css/ y js/ dentro del mismo directorio del script.

Creación del shortcode

El funcionamiento del plugin será el siguiente. En medio de un post, escribimos:

[simterm]
$ comando
salida del comando
$ comando 2
Bienvenido al comando 2
> El comando 2 permite al usuario una entrada de texto adicional
El comando 2 proporciona una respuesta.
Fin del comando 2
[/simterm]

El shortcode será simterm. WordPress utiliza este tipo de códigos cortos que nos ayudan a escribir texto predefinido e insertar bloques predefinidos dentro de los posts (tal y como hago, por ejemplo para insertar bloques de código), o como hacen muchas webs para insertar un texto para enviar por Twitter directamente.
El shortcode del ejemplo anterior se traducirá por esto:

comando
salida del comando
comando 2
Bienvenido al comando 2
El comando 2 permite al usuario una entrada de texto adicional
El comando 2 proporciona una respuesta.
Fin del comando 2

Lo primero es decirle a WordPress que vamos a insertar un shortcode. Esto lo hacemos así:

1
2
<?php
    add_shortcode('simterm', array(self::$st, 'simterm_shortcode'));

Donde el segundo argumento será el callback que se ejecutará cada vez que se encuentre este shortcode. El shortcode será simterm. El callback puede ser el nombre de una función como string o un array tipo (clase, función) como en el caso anterior. Esta línea, yo la he incluido en la inicialización del plugin, directamente en aquella función Init() que expliqué en la primera parte, pero perfectamente puede estar a pelo escrito en el PHP principal de tu plugin.

La función del shortcode tendrá una forma parecida a esta:

1
2
3
4
    function simterm_shortcode($atts, $content="")
    {
       return "Lo que queremos poner de vuelta";
    }

Si el shortcode tiene esta forma:

[[code atributo1=valor1 atributo2=valor2]contenido[/code]]

En $atts recibiremos los atributos y en $content recibiremos el contenido. Con esto ya tenemos lo suficiente para generar una salida en consecuencia que devolveremos en el return de la función. En mi caso, yo he decidido cargar aquí los JS y los CSS, para no incluir nada que no se necesite en la página del post. Además, como valor de retorno, he cargado una vista que se encargará de generar el código HTML necesario para representar el terminal. Podéis echarle un vistazo al código en GitHub. Ya que creé una clase aparte para procesar cada línea de entrada, y hay algunas cosas que poco tienen que ver con WordPress.

En este punto, consulto las opciones que tengo almacenadas por el plugin que modificarán el comportamiento.

En la práctica podemos incluir tantos shortcodes como queramos, el sistema de gestión de shortcodes es bastante eficiente y depende más del número de shortcodes que incluyamos en el post en cuestión que del número de shortcodes que podemos introducir. Aunque es muy recomendable que las funciones que procesan estos shortcodes estén lo más optimizadas posible y dependan lo menos posible de recursos externos ya que influirán en el tiempo de carga del post, y eso puede ser malo para nuestros usuarios.

Siguiente parte

Aunque con esto hay para hacer un plugin básico, todavía quedan algunos aspectos interesantes que podemos incluir, como por ejemplo la localización de nuestro plugin, para que los mensajes estén en el idioma del usuario. El post sale el 5 de septiembre.

The post Cómo crear un plugin para WordPress. Making of de SimTerm: insertar recursos JS/CSS y shortcodes (tercera parte) appeared first on Poesía Binaria.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Lanzado KDE Connect 1.0, conecta tu Plasma con tu móvil

Uno de los proyectos killers más interesantes de la Comunidad KDE sigue avanzando.  Y es que ha sido lanzado KDE Connect 1.0, la aplicación “must have” que debemos tener en nuestro KDE ey n nuestro smartphone para simplificar y optimizar la interacción entre ellos. Es el momento de actualizar y ver las novedades que nos ofrece.

Lanzado KDE Connect 1.0

Lanzado KDE Connect 1.0Una de las aplicaciones que debes tener en tu móvil y en tu ordenador si quieres utilizarlos de forma eficiente acaba de lanzar su primera versión definitiva, es decir, la 1.0 (aunque ya sabemos que eso no significa que no fuera utilizable en sus anteriores versiones)

El pasado 26 de agosto Albert Vaca, creador de KDE Connect, publicó una entrada en su blog en el que nos informaba del lanzamiento de la nueva versión de su maravilloso software: KDE Connect. Esta nueva versión viene con muchas novedades importantes, que ha traducido desde su web oficial el magnífico Víctorhck en su blog y que me limito a copiar y pegar, por eso de no duplicar trabajo y compartir conocimientos:

  • Comandos ya preconfigurados, al estilo de “lanzadores” o accesos directos que lo hacen más productivo y rápido a la hora de realizar las tareas más comunes.
  • Puedes responder directamente a SMS desde tu escritorio. Una de las características más esperadas, ya que cuando recibes una notificación de un mensaje de texto en tu escritorio, un botón de “Responder” te permitirá responder al mensaje sin necesidad de utilizar tu teléfono. ¿Mágia? ¡No, simplemente software libre! Por cierto, para disfrutar de esto necesitarás la versión 1.4 de la aplicación Android, ya disponible.
  • Recibe en tu teléfono las notificaciones de tu escritorio. Esta funcionalidad está deshabilitada por defecto, ya que puede llegar a incomodar un poco. Deberás habilitarla tanto en la aplicación de Android como en los Ajustes del Sistema, y podrás escoger qué notificaciones notificar al teléfono y cuales no.
  • KDE Connect gana en un cifrado más robusto, cambiando del método RSA a TLS. Esto además de proteger la comunicación entre ambos dispositivos también mejora la rapidez y consumo de batería que es menor.

Recuerda que para utilizar esta aplicación debes tenerla instalada tanto en tu ordenador (ya expliqué como hacerlo para openSUSE leap 42.1, en otras distribuciones viene de serie) y también en tu smartphone descargándote la aplicación desde F-Droid o la Play Store.

Como vemos, muchas novedades en una de los más afamados proyectos de la Comundidad KDE, en parte fruto del trabajo que se realizan en los Sprints de Randa.

Más información: Albert Vaca’s blog | Víctorhck in the Free World | La mirada del replicante

Asociación LiGNUx: Sport Tracker, el programa multiplataforma para hacer un seguimiento de tus actividades deportivas

Domingo 28 de agosto de 2016

La Criptonovela del verano: una historia en tres capítulos (Capítulo 2)

En el capítulo anterior vimos los intentos de tomar el control de Bitcoin por parte de Blockstream y la disputa por el tamaño de bloque con Core, Classic y Unlimited luchando por hacerse un hueco. Veamos la situación en Ethereum.

Capítulo 2: Ethereum y la DAO, o el debate de si el código es la ley

Ethereum es una plataforma basada en la cadena de bloques. Normalmente cuando se habla de cadena de bloques la gente piensa en Bitcoin y piensa que la única aplicación de esta tecnología son las criptodivisas. ¿Pero qué pasa si en vez de dinero transmitimos datos? ¿Y si esos datos tienen un procesado dentro de la propia plataforma? Pues eso es Ethereum, donde pueden funcionar aplicaciones descentralizadas en su máquina virtual, con la verificación entre nodos que nos da la cadena de bloques. Esto son los contratos inteligentes, para más información visita la entrada que escribí sobre Ethereum y Smart Contracts.

El crecimiento de Ethereum ha sido impresionante, hasta tal punto de que la moneda propia de Ethereum, el Ether tiene niveles de capitalización de mercado y volumen que cualquier criptodivisa desearía y que solo Bitcoin es capaz de lograr.

EthereumMarketCap

Los desarrolladores de Ethereum deciden crear el 30 de abril de 2016 una organización autónoma, un organismo regido por el código sin trabajadores y a la vez fondo de inversión para otras empresas y organizaciones basadas en Ethereum que repartía beneficios a sus inversores. Su nombre fue la DAO (siglas de Decentralized Autonomous Organization). Algunas de sus características eran:

  • Funcionamiento sobre la plataforma Ethereum sin jefes ni junta directiva
  • Totalmente autónoma
  • Opensource, programada en Solidity
  • Opera sin la regulación de ninguna nación del mundo

La DAO fue financiada gracias a financiación colectiva (crowdfunding) el 28 de mayo de 2016, con un éxito rotundo. La DAO batió récords y se convirtió en la campaña de crowdfunding más exitosa de la historia, recaudando 160 millones de dólares en monedas de Ethereum, Ether. Superaba así al mayor proyecto hasta la fecha que era el videojuego Star Citizen.

DAODAO, en chino, “el camino”

Se calculó que el 14% de todo el Ether minado en Ethereum se encontraba en la DAO. A partir del 28 de mayo las participaciones en la DAO podían ser intercambiadas como si se tratara de una criptodivisa más.

Al poco tiempo llegan los problemas, varias personas revisan el código de la DAO y encuentran vulnerabilidades graves que piden que sean corregidas.

Ya el 17 de junio, un hacker aprovechó una combinación de las vulnerabilidades descubiertas en la DAO previamente para sustraer un tercio de la cantidad depositada en la DAO. Estas vulnerabilidades no se creían explotables hast que el hacker encontró que las mismas se encontraban en otra parte del código y le dejarían replicar la DAO, pero bajo su control. Se intentó parar el ataque mandando SPAM a la red Ethereum. Al poco se lanzó un soft fork en Ethereum que limitaba la la cuenta DAO hija gastar ese dinero hasta que no hubiesen transcurrido 27 días, tiempo en el que se decidiría que hacer. Al cambio la cantidad del robo fue de 50 millones de dólares. El precio del Ether se desplomó. Esto suscitó un gran debate.

¿Era una brecha de seguridad? ¿O simplemente un método legal pero poco ético de cumplir las disposiciones del contrato inteligente? En Ethereum la norma era que el código es la ley, lo que se programa se cumple siempre sin excepción. El hacker cumplió los términos del contrato inteligente. ¿Era fallo del hacker o del desarrollador que escribió el contrato de forma pésima? ¿Se podía considerar un robo? Si recordamos, la DAO no estaba sujeta a ninguna legislación nacional.

La gente se dividió en dos bandos:

  • El primero consideraba que el hacker, aunque de forma poco ética, había cumplido los términos y disposiciones y por ello legalmente le pertenecería ese dinero.
  • Otros que consideraban que esto debía de ser considerado una excepción y que había que encontrar una forma de devolver el dinero a la gente, incumpliendo el mandato de que el código es la ley irrefutable.

DAOButton

Los desarrolladores de Ethereum, que eran también algunos de los grandes inversores de la DAO, prefirieron la segunda opción. Ethereum fue programado para añadir la característica de devolver el dinero sustraído a partir de un determinado bloque que entraría en la cadena a partir del 17 de julio. Obviamente los usuarios del primer grupo sintieron que los principios de Ethereum se estaban viendo traicionados y anunciaron sus intenciones de proseguir su trabajo en Ethereum Classic.

Empresas como Coinbase o Uphold apoyaron a Ethereum y se comprometieron a usar en sus nodos la versión que incluiría la devolución. Al igual que en Bitcoin, en Ethereum tenía que haber un consenso de la fuerza de cómputo suficiente para lograr un hard fork y dividir la cadena en dos. Se produjo el hard fork, en ese momento los nodos que no actualizaron su versión Ethereum pasaron a Classic.

Etc

Ahora ambas plataformas conviven, con cadenas de bloques separadas. En Ethereum Classic prefieren código irreversible, resistente a censuras, con los ideales de que Ethereum es ese ordenador que nunca se apaga y que siempre ejecuta tus contratos. Se calcula que un 22% de los usuarios de Ethereum apoyan las pretensiones de Classic y que lo ocurrido con la DAO sienta un terrible precedente que podría desembocar en censura.

¿Cuál triunfará? Posiblemente ambas cadenas se mantengan, pero una de las dos tendrá que ser la mayoritaria. Ethereum tiene a su favor que la fundación Ethereum va a seguir programando tal y como tenía planeado, con nuevas actualizaciones que podrían beneficiar al ecosistema. Por otra parte el cambio de un algoritmo PoW a un algoritmo PoS que quiere realizar Ethereum podría quitarle las ganas a ciertos mineros. Estos se trasladarían a Classic, aunque aquí la opinión es que sería algo temporal ya que mantener el algoritmo PoW a Classic le podría pasar factura al largo plazo. Classic tiene a su favor su reputación de realmente inmutable, ajena a cualquier situación, una libertad anárquica, algo de lo que Ethereum ya no puede presumir.

¿Cuál es tu opinión al respecto? ¿Cuál fue la decisión correcta, la de Ethereum o la de Ethereum Classic?

En el siguiente capítulo veremos otro robo, en este caso a Bitcoin, a través de Bitfinex.

La entrada La Criptonovela del verano: una historia en tres capítulos (Capítulo 2) aparece primero en Blog - Adrianistan.eu.

Liher Sanchez

Liher Sanchez
El blog de Liher

Fondos de escritorio 25

Hacia tiempo que no publicaba un articulo sobre fondos de escritorio y ya es hora, aquí os dejo cuatro fondos que espero os gusten.

 

1_15

 

1_19

 

023

 

081

 

Un saludo.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Carpetas multicolor para el próximo Plasma 5.8

El desarrollo del escritorio Plasma 5 de KDE sigue avanzando, tanto en sus funcionalidades como en su diseño. En la próxima gran actualización tendremos otro caramelito visual: carpetas multicolor para el próximo Plasma 5.8 que se adaptaran al esquema de color que tengamos seleccionado. Esto no para.

Carpetas multicolor para el próximo Plasma 5.8

Según podemos leer en KDE and Linux el equipo de diseño está trabajando en una nueva funcionalidad visual que hará las delicias de los amantes de la personalización: el tema de iconos oficial Breeze tendrá carpetas multicolor para el próximo Plasma 5.8.

Esto significa que el mejorado diseño de las carpetas será como el de la imagen inferior:

Carpetas multicolor para el próximo Plasma_01

¿No veis ninguna novedad? Claro, es que es una captura con el esquema de colores por defecto. Pero si jugamos con dicho esquema cromático las carpetas nos cambiaran de la siguiente forma:

Carpetas multicolor para el próximo Plasma

 

Es asombroso, ¿no? Esta funcionalidad no es más que una extensión otra que ya tenemos desde Plasma 5.6, pero que lamentablemente nunca comenté en el blog: los iconos monocromáticos de Breeze cambian según el esquema de colores.

Carpetas multicolor para el próximo Plasma_04

En otras palabras, si elegimos un esquema de colores donde la letra es azul, los iconos monocromáticos Breeze cogerán ese color para mostrarse en pantalla.

Este cambio se produjo por la necesidad de mejorar la visualización de estos iconos. Ahora muchos iconos Breeze son monocromáticos, por tanto se necesita mucho contraste para que la visualización sea óptima. Esto llevó a añadir una nueva propiedad a los iconos y como consecuencia de ello supuso varias mejoras en el tema visual Breeze:

  • Reducir dos tercios del código
  • Mejorar la velocidad de renderización de los iconos
  • Reducir el peso del pack de iconos de 28 Mb a 9,4Mb.

Como vemos, se sigue puliendo el aspecto visual respetando las personalización de Plasma 5.

Más información: KDE and Linux – Rainbow Folders | KDE and Linux – Performance update for breeze icons

David González

David González
Blog Bitix

Cómo configurar una impresora HP en red en Arch Linux

Después de mucho tiempo sin tener configurada una impresora en red decidí dedicarle un tiempo a realizar la configuración. Con un par de errores que me encontré finalmente conseguí realizar correctamente la impresión de prueba con el modelo de impresora en concreto del que dispongo.

Arch Linux

Uso Arch Linux desde hace ya más de un lustro, en mi equipo personal e incluso en el equipo del trabajo. Hasta hace poco cuando necesitaba imprimir llevaba el documento en formato PDF en una memoria USB a una copistería y allí los imprimía dado que no tenía configurado mi equipo para usar la impresora en red, más que nada porque no le había dedicado de tiempo para hacerlo. Por último, encontré un momento y realice la configuración de un impresora en red Hewlett Packard Color LaserJet MFP M476dw con CUPS en Arch Linux no sin encontrarme con algunos algunos problemas que finalmente conseguí resolver.

La wiki de Arch Linux es una de la mejores documentaciones que hay en GNU/Linux pero en el caso de CUPS la versión en inglés tiene bastantes secciones desactualizadas, la versión en español de CUPS está mejor pero aún así siguiendolas no conseguí instalar la impresora. Tuve que hacer varias búsquedas en foros.

Lo primero necesario a instalar es el paquete de CUPS y el controlador de la impresora en este caso HP, posteriormente iniciar como superusuarios el servicio de CUPS con systemd y avahi para el descubrimiento de impresoras y activarlos con el inicio del sistema si así lo deseamos:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/749c13e14296f931a0329628afcf8e49/raw/install.sh">install.sh</pre></a></noscript>

CUPS posee un panel de administración accesible con el navegador en la dirección http://localhost:631/admin. Pulsando el botón Añadir impresora en el panel de administración de CUPS iniciamos el asistente para añadir la impresora en el que avahi nos detectará la impresora en red y deberemos seleccionar la marca junto con el modelo específico. Al añadir la impresora se nos preguntará por un usuario y contraseña, como nombre usuario deberemos introducir root y como contraseña la que hayamos establecido en el sistema para el superusuario. Desde el panel de impresoras de GNOME se debería poder añadir la impresora, sin embargo, a mi me daba algún tipo de error de modo que lo hice desde CUPS.

Finalizado el asistente en la sección Impresoras examinado los detalles de la misma podremos ver los documentos imprimidos o en proceso de impresión. En el desplegable Mantenimiento podremos imprimir una página de prueba con la que comprobaremos que funciona correctamente además de otras acciones sobre los trabajos, en el desplegable Administración podemos eliminarla o modificarla.

Si la página de prueba no funciona en el archivo /var/log/cups/error_log encontraremos mensajes de error con pistas que nos ayudarán a saber que está fallando. Algunos de los mensajes de error que me encontré al realizar la configuración fué el siguiente.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/749c13e14296f931a0329628afcf8e49/raw/error_log">error_log</pre></a></noscript>

A raíz de este mensaje tuve que añadir en el archivo /etc/hosts el host HP.local con la dirección IP de la impresora en red que averigüé usando la pantalla táctil que ofrece este modelo de impresora (las mayúsculas y minúsculas son importantes).

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/749c13e14296f931a0329628afcf8e49/raw/hosts">hosts</pre></a></noscript>

Con todo configurado la prueba de impresión realizable tanto desde la página de administración de CUPS como de GNOME se realizó correctamente y este es el resultado. Una vez que esta prueba es satisfactoria podemos imprimir documentos desde las aplicaciones usando el diálogo de impresión donde aparecerá la impresora en red configurada. Además podremos cambiar algunas opciones como imprimir a dos caras o solo a una, imprimir en blanco y negro o a color o usar un perfil de impresión para ahorro de tinta.

Para otras marcas y modelos de impresoras deberemos instalar otro controlador, en la siguiente base de datos de impresoras encontraremos el controlador aconsejado si en nuestra distribución no está documentado.

Referencia:
Asociación LiGNUx: Lxdream (Emulador de Sega DreamCast para GNU/Linux)

Sábado 27 de agosto de 2016

La Criptonovela del verano: una historia en tres capítulos (Capítulo 1)

Este verano el mundo de las criptodivisas nos ha deleitado con tres culebrones. Cada culebrón nos expone fortalezas y debilidades de estos sistemas y lo que es seguro es que forman parte de su historia, para bien o para mal.

Capítulo 1: Bitcoin y su escalabilidad, tamaño del bloque

Esto es una auténtica guerra. Bandos muy definidos, hostilidad, el debate comenzó hace ya tiempo (abril de 2015, puede que antes) pero sigue sin finalizar. ¿Debería Bitcoin aumentar el tamaño de los bloques? Y más inquietante, ¿cómo debería hacerse?

Guerra

El protocolo actual de Bitcoin permite ejecutar un máximo de 7 transacciones por segundo (3 según otras fuentes). Este número era suficiente cuando Bitcoin surgió y solo lo usaban cuatro gatos pero ahora empieza a haber problemas que se agravarían aún más si se consigue popularizar Bitcoin. Por ello, para aumentar el número de transacciones simultáneas se hace preciso aumentar el tamaño del bloque (actualmente 1 MB) que contiene las transacciones pendientes de verificar.

TamañoDelBloque

El límite en el tamaño de los bloques fue una solución temporal creada por Satoshi Nakamoto hasta que se pudieran usar clientes ligeros, sin embargo nunca se ha modificado.

Esta cuestión no ha contado con el consenso habitual que se lograba para implementar otras características. Hay intereses en ambas direcciones. Gavin Andresen y Mike Hearn publicaron ya a finales de 2015 un fork, denominado Bitcoin XT, que implementaba la proposición BIP 101. Además añadía algunas mejoras de seguridad y usabilidad. El objetivo era lograr que el 11 de enero de 2016, al menos el 75% de los nodos de la red Bitcoin funcionasen con Bitcoin XT. Si lo conseguían, conseguirían imponer sus normas y Bitcoin Core (el Bitcoin original) se bifurcaría (un hard fork). Los mineros de cada red seguirían minando pero ya no funcionarían en la misma red, habría dos.

Gavin Andresen, fue el designado por Satoshi Nakamoto para desarrollar BitcoinGavin Andresen, fue el designado por Satoshi Nakamoto para desarrollar Bitcoin

Sin embargo esto generó mucha crítica en la comunidad. Por una parte tener dos cadenas de bloques podría suponer un peligro de doble gasto y la credibilidad de Bitcoin se vería afectada por haber “dos bitcoines”. Otra crítica tuvo que ver con la privacidad. Bitcoin XT recogía las IP, también de usuarios que usaban Tor. Las críticas llegan al modelo de gobernación de Bitcoin pues en última estancia Bitcoin XT proponía cambiar la manera de tomar decisiones.

Bitcoin XT guardaba las IP de los usuarios rompiendo con la privacidad característica de BitcoinBitcoin XT guardaba las IP de los usuarios rompiendo con la privacidad característica de Bitcoin

Más tarde, Satoshi Nakamoto (o alguien que se hacía pasar por él) afirmaba que él veía la necesidad de cambios en Bitcoin Core, pero que Bitcoin XT le parecía peligroso. Finalmente Bitcoin XT no logró sus objetivos.

En este punto vamos a revisar los motivos que exponen aquellos que no quieren aumentar el tamaño del bloque.

  • Las tarifas de transacción son muy bajas y no subirán hasta que el espacio en el bloque sea escaso. Necesitamos un límite de tamaño por bloque para asegurar la escasez y por lo tanto ponerle un precio a las transacciones.
  • ¿Qué pasaría si el mercado fijase un tamaño de bloque tan grande que sólo Google se pudiera permitir mantener funcionando nodos completos?
  • ¿Y si las tarifas de transacción fijadas por el mercado no pagan lo suficiente como para mantener un poder computacional que proteja a la red de otros adversarios económicamente fuertes?
  • ¿Y si la competencia resulta en que la rentabilidad del minado es tan baja que saca del juego a los pools más pequeños y la minería Bitcoin acaba siendo un monopolio?

Argumentos tomados de ElBitcoin.org

Estos argumentos son muy parecidos entre sí y tienen que ver con la minería. Las objeciones al límite del tamaño del bloque tienen que ver con las recompensas por cómputo. Si el tamaño del bloque aumenta, los mineros van a tener que realizar más trabajo para recibir la recompensa por bloque minado (25 BTC). La otra recompensa, basada en las comisiones por transacción sigue siendo tan baja que sigue siendo preferible minar para conseguir un bloque entero. Los mineros van a preferir bloques pequeños. Además se expone la posibilidad de que los bloques sean tan grandes que Bitcoin acabe centralizándose. Esto último de hecho es algo que ya ocurre. Los grandes nodos chinos copan gran parte del mercado.

Sigamos con la historia. En febrero de 2016 una encuesta a usuarios de Bitcoin revelaba que el 90% de ellos querían aumentar el tamaño del bloque hasta por lo menos 2MB. Entonces aparece Bitcoin Classic. Bitcoin Classic, también diseñado por Gavin Andresen, propone aumentar el tamaño de bloque a 2MB. No realiza ningún cambio más sobre Bitcoin Core. El anuncio de este hard fork fue eliminado de Reddit, lo que hizo pensar a muchos que cierta parte del mundo Bitcoin censuraba a Classic.

Classic obtuvo el apoyo de mucha más gente en mucho menos tiempo. Empresas como Coinbase, Bitcoin.com, Xapo, Blockchain.info,… apoyaron Classic desde el principio, algo que evidenciaba el alejamiento de los desarrolladores de Core con parte de la comunidad. Para que Classic se imponga tiene que cumplirse la misma condición que con Bitcoin XT, 75% de la potencia de la red ha de funcionar usando Classic.

BitcoinClassic

Bitcoin Core no ha sido ajena y ha propuesto sus soft forks, pequeñas modificaciones, más conservadoras, que no eliminan la compatibilidad, proponiendo un modelo de “testigos segregados”, que no aumenta el tamaño del bloque sino que reduce la información de cada transacción de manera que entran más transacciones en un bloque del mismo tamaño. La postura de Core fue apoyada por OneName, GreenAddress,…

Los testigos segregados han sido criticados ya que según parte de la comunidad solo resolverían el problema a corto plazo. Esta solución no obstante parece ser también del agrado de Classic, que añadiría ambas cosas: testigos segregados y aumento del tamaño de bloque. Este aumento primero sería fijo, subiendo a 2MB, posteriormente se trabajaría según la propuesta de Stephen Pair, CEO de BitPay, en un modelo de crecimiento dinámico. Sin embargo BitPay ya se ha adelantado y actualmente están desarrollando un fork de Bitcoin Core según sus propuestas, esta versión es BitPay Core y es experimental.

La cosa se complica más pues tenemos Bitcoin Unlimited. Se trata de un sistema donde cada nodo especificaría el tamaño de bloque que le gustase. Concretamente empezaría en un 1MB y el tamaño podría verse aumentado según el minero. Este proyecto sin embargo no ha atraído la atención suficiente y aunque sigue en activo, no cuenta con un apoyo suficiente.

Blockstream

Ya en 2015 entra en juego también Blockstream, una compañía dedicada a sidechains o cadenas laterales (una cadena lateral es un producto paralelo pero que toma referencia en Bitcoin, similar a las monedas de distintos países con un patrón oro). Aprovechan la potencia de Bitcoin con otros propósitos. Su producto principal es Liquid. Las transacciones en Liquid no son procesadas por los mineros. Para usar la red lateral Liquid es necesario pagar a Blockstream una cuota mensual. Esto no sería ningún problema si no fuera porque muchos desarrolladores de Bitcoin Core están en nómina de Blockstream. Una parte de la comunidad les acusa de querer centralizar Bitcoin y para ello llevarán Bitcoin al colapso, con el tamaño de bloque sin modificar para que la gente use soluciones mejores, en este caso las de Blockstream. Si la gente se queda sin espacio en la cadena pública deberán pasarse a la cadena de Blockstream, que si tendrá espacio para tus transacciones.

Sidechain

La desconfianza en Blockstream creció cuando firmó contratos con mineros chinos para poder sustentar Core y las cadenas laterales derivadas de él, productos de Blockstream. Estos contratos han hecho sospechar a mucha gente, que empezó a demonizar contra ellos. Estos mensajes han sido borrados sistemáticamente de ciertos foros y subreddits que se creen en control de Blockstream. Así pues Blockstream parece querer controlar Bitcoin junto con la opinión pública.

Algunos afirman que Blockstream no durará mucho, que caerá, que Classic triunfará. Otros afirman que el resto de desarrolladores de Core no dejarán que Blockstream se oponga a la modifiación del tamaño de bloque y que Core evolucionará.

Bitcache

Y ahora… Bitcache. El nuevo proyecto de Kim Dotcom (fundador de Megaupload). Todavía no ha visto la luz pero este proyecto cuenta con la aprobación de BankToTheFuture. Se trataría de un sistema que relacionaría archivos con transacciones Bitcoin y parece ser que resolvería los problemas de escalabilidad. Su salida se ha planeado para enero de 2017. Estaré atento.

Y en los siguientes capítulos

  • Ethereum y la DAO
  • El robo de Bitfinex

Suscríbete por correo electrónico para no perderte los dos episodios que vienen.

La entrada La Criptonovela del verano: una historia en tres capítulos (Capítulo 1) aparece primero en Blog - Adrianistan.eu.

Baltasar Ortega

Baltasar Ortega
KDE Blog

El Kernel Linux cumplió 25 años

El mundo del Software Libre es tan grande y variado que en ocasiones me sobrepasa… y eso que dedico ingentes cantidad de tiempo a aprender sobre él y promocionarlo. Eso significa que en ocasiones hay entradas importantes que no aparecen o se publican tarde, como la que estáis leyendo. Y es que el Kernel Linux cumplió 25 años… y yo estaba de vacaciones y no pude celebrarlo con unas líneas. Es hora de corregir este error.

El Kernel Linux cumplió 25 años

Lo cierto es que es difícil hacer una entrada sobre el 25 aniversario de Linux cuando la lista de ellas es inmensa. Así que he decidido hacer algo diferente: una recopilación de dichos artículos al tiempo que invito a los novatos leer una vieja entrada del blog donde se explicaba qué era eso del Kernel.

El proyecto Linux fue anunciado un 25 de agosto de 1991, su “padre” es Linus Torvalds, ahora es utilizado por millones de personas y que tiene millones de líneas de código, su valor en el mercado sería de billones de dólares, casi todas las supercomputadoras del mundo lo utilizan,  es apoyado por empresas como de Intel, Red Hat, Samsung, IBM, AMD, Google o ARM, se solucionana casi 8 parches por hora cada día, Android lo utiliza,  y aún así todavía no es habitual en los ordenadores personales de la mayoría de los usuarios.

El Kernel Linux cumplió 25 años

De esta forma si queréis leer sobre los 25 años del Kernel Linux os aconsejo leer, sin que el orden sea sinónimo de importancia, los siguientes artículos, que es de donde he sacado toda la información del párrafo anterior, así como buena parte de las imágenes de esta entrada.

En definitiva, una fecha muy importante para todos aquellos amantes del Software Libre que demuestra un par de cosas: que la constancia es la clave del éxito y que los proyectos colaborativos son el futuro.

¡Larga vida a Linux!

Viernes 26 de agosto de 2016

David González

David González
Blog Bitix

Varios juegos de culto con ScummVM en GNU/Linux

Un juego puede gustar por sus gráficos espectaculares, sin embargo, no será venerado si no proporciona gran cantidad de diversión. Hay algunos juegos en que gran parte de la diversión es proporcionada por la historia o guión. Este son los casos de varios juegos de apuntar y pinchar de hace algunos lustros que quedaron en el recuerdo de muchos de sus jugadores que hoy en día son jugables con ScummVM.

ScummVM
Linux

A día de hoy hay una buena colección de juegos que ya tiene varias décadas pero que están muy bien y han alcanzado el calificativo de míticos. Los clásicos del juego del ajedrez y el juego go son atemporales, en GNU/Linux también otros clásicos del arcade y consolas con el emulador Mame, también en GNU/Linux hay otros más actuales algunos basados en originales de distintos géneros como Arcade, FPS, estrategia con gráficos en tres dimensiones o basados en texto jugables desde la terminal y que no requieren computadoras potentes. Otros juegos buenos, muy conocidos y míticos son Monkey Island, Maniac Mansion, El día del tentáculo, Indiana Jones, … jugables con el emulador ScummVM.

Con ScummVM podemos jugar a esos juegos del estilo point-and-click en los que se trata de probar diferentes acciones algunas lógicas otras no tanto con los objetos que tenemos o el escenario de la pantalla. Para los días de hoy gráficamente no son muy avanzados aunque sigue siendo notable su arte pixelado, pero lo principal de estos juegos no son los gráficos sino la historia que se desarrolla en los mismos. Historia que incluye bastante humor que ha hecho que perduren en el recuerdo de sus jugadores. Algunas de estas aventuras gráficas más conocidas son Monkey Island, Maniac Mansion, El día del tentáculo o Indiana Jones entre los que yo conocí.

En GNU/Linux podemos seguir jugando a estos juegos, para ello debemos instalar el emulador ScummVM y descargar la ROM de los mismos. En Arch Linux instalamos el emulador con el paquete scummvm y el siguiente comando:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/36d208fc3c9aac01c0a5265634bf4e92/raw/pacman.sh">pacman.sh</pre></a></noscript>

Son juegos en los que se desarrollan diálogos y hay que leer texto por lo que si no dominamos el inglés deberemos descargarlos en su versión en español. Descargar las ROMs en algunos casos es igual de ilegal que piratear un juego, en otros casos al ser juegos muy antiguos y que se consideran software abandonado o abandonware no es ilegal y se considera una forma de conservación del software, en cualquier caso dejo esta decisión al lector. Algunos juegos han sido reeditados para nuevas plataformas como tabletas o móviles. Hay varios sitios web dedicados a almacenar las ROMs de los juegos. La que he utilizado y en la que he encontrado los juegos de los que hablo en este artículo es EMUPARADISE, en esta página hay listados unos 500 juegos para ScummVM.

Instalado ScummVM y con las ROMs descomprimidas iniciamos el emulador, seleccionamos Add game… y buscamos el directorio descomprimido del juego usando el botón Go up en caso de ser necesario para navegar el árbol de directorios. Añadido los juegos los iniciamos con el botón Start y a partir de este momento ya podemos empezar a jugar. Algunos juegos originalmente tenían una protección anticopia que en las ROMs y ScummVM queda desactivada. En el manual de usuario de ScummVM tenemos el listado de juegos soportados así como las teclas usables y sus funciones. Como son juegos que deberemos continuar en múltiples partidas deberemos guardar el estado del juego con Alt 0-9 y cargar para continuar con Ctrl 0-9.

¡A disfrutar! Lamentablemente ya no tengo el tiempo que tenía antes para jugar a juegos y a veces tampoco las ganas de dedicar ese tiempo a los juegos pero estoy seguro que a aquellos sigan disfrutando de los juegos les será interesante.

¡Hola! Me llamo Guybrush Threepwood, ¡y quiero ser un pirata!

Guybrush Threepwood, The Secret of Monkey Island

Liher Sanchez

Liher Sanchez
El blog de Liher

Como reproducir DVD en Ubuntu 16.04 y derivadas

El reproducir películas en DVD es algo que prácticamente ya no se hace, de echo a mi portátil le quite la bahía del DVD para sustituirla por un segundo disco duro, tengo guardado el DVD ya que en algunas ocasiones lo uso pero muy pocas veces. Y para lo que no lo he usado es para reproducir películas, es mas tuve que probarlo para escribir este articulo ya que todavía no la había hecho nunca. Hace un tiempo escribí un articulo en el cual os mostraba como reproducir películas en DVD en Ubuntu 14.04 pero ahora ese procedimiento no sirve para la nueva Ubuntu 16.04 y sus derivadas.

Lo que voy a hacer en este articulo es explicaros como poder reproducir los DVD de películas en Ubuntu 16.04 y sus derivadas. Yo he probado esto en Linux Mint 18 y Ubuntu 16.04 y funciona sin problemas. Antes de seguir quiero dar las gracias a Jacqueline que ha sido quien me ha mostrado como hacerlo en el articulo viejo mediante un comentario.

Vamos al lío, lo primero que vamos a hacer es abrir una Terminal y escribir el siguiente comando:

sudo apt-get install libdvd-pkg

Nos aparecerá en la Terminal el siguiente mensaje:

 

reproducir dvd en ubuntu 16.04

 

Este mensaje nos da información sobre lo que vamos a hacer. No tenemos mas opciones que pulsar la tecla Enter en “Aceptar”, lo que esta remarcado en rojo, y seguís adelante. Después veremos esto otro:

 

segundo mensaje de instalar DVD en ubuntu 16.04

 

Aquí nos esta preguntando si queremos que cuando aparezca una nueva versión se actualice, como podéis ver en la penúltima linea, aquí pulsaremos en “Si”, la opción que viene remarcada en rojo en la parte inferior. Si os aparece marca la opción “No” podéis cambiarla con las flechas o la tecla Tabulador. Pulsamos en “Si” y veremos esto en la Terminal:

 

mensaje al instalar los dvd en Ubuntu 16.04

 

Aquí vemos el proceso de instalación, en la parte inferior he remarcado en blanco un mensaje en el cual indica que tenemos que correr el siguiente comando una vez termine el proceso:

sudo dpkg-reconfigure libdvd-pkg

Al teclear este comando nos aparecerá en la Terminal un nuevo mensaje tal como el que podéis ver en la siguiente imagen:

 

paso final para instalar DVD en ubuntu 16.04

 

Aquí nos pregunta si queremos descargar, compilar e instalar la librería necesaria para poder ver los DVD en Ubuntu 16.04, no os asustéis es un proceso automático ;D, hay que seleccionar la opción “Si” y pulsar la tecla Enter. Entonces se iniciara el proceso de descarga, compilación e instalación de dicha librería, tardara unos segundos, depende del ordenador que tengáis, pero es poco tiempo.

Y ya esta, ahora ya podéis reproducir vuestros DVD con películas en vuestro Ubuntu 16.04 y derivadas. Como podéis ver es un proceso bastante sencillo que apenas lleva un minuto de tiempo.

Un saludo.

Miguel Parada

Miguel Parada
Ubuntizando.com

Cómo evitar que Facebook conozca tu número de WhatsApp

No sé si lo sabes pero Whatsapp pertenece a Facebook. Y esta debería ser una razón de peso para no usar WhatsApp ya que no hay forma de saber qué usos le dará en el futuro a nuestra información más sensible. Porque WhatsApp es gratuito sí pero lo es porque tú eres el producto.

Muy pronto tu número de telefono y su frecuencia de uso serán datos que Facebook conocerá de ti. Datos que pueden no parecer muy importantes, lo son, pero que a la compañía de Zuckerberg le encantará conocer por los grandes beneficios que representa ya que así podrá vincular a cada uno de los usuarios con su perfil de Facebook, si ha llegado a entregar su número de teléfono a la red social, y de este modo poder ofrecer mejores productos publicitarios a sus clientes. Dicho de otro modo, no habrá rincón en la web donde no verás publicidad de algún cliente de Facebook.

Supongo que esta noticia no te está gustando mucho. Puedes evitar que el gran hermano conozca tu número de WhatsApp siguiendo unos sencillos pasos. Aquí te cuento cómo.

Cómo usuario de WhatsApp recibirás en próximos días una notificación en donde se advertirá del cambio de política de uso. Ahí puedes elegir no compartir tu información de contacto con Facebook.

Si no lo has recibido o quieres desactivar esta opción. Debes dirigirte y  Ajustes > Cuenta > Compartir la información de mi cuenta.

whatsapp-facebook-phone-number-3

 

Y con esto ya está. Facebook debe respetar tu decisión.

Puedo entender que este tipo de noticias no te gusten y que quieras cambiar de aplicación  de mensajería. Telegram es una excelente opción pero si quieres un poco más de seguridad existen otras como Signal que también están muy bien y garantizan cierto control de tus datos y privacidad ante miradas ajenas.

NOTA MUY IMPORTANTE: Después de aceptar el intercambio de información sólo tendrás 30 días para cambiar tu decisión.

La entrada Cómo evitar que Facebook conozca tu número de WhatsApp aparece primero en Ubuntizando.com.

Jueves 25 de agosto de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

Que es y como instalar Inxi en Ubuntu y derivadas mediante PPA

En el universo Linux hay muchas formas de obtener información de nuestro ordenador, hay programas para la Terminal o con GUI que nos pueden informar de los componentes que tiene nuestro ordenador y hoy os quiero hablar de una de ellos, personalmente me parece la mejor de todas por su sencillez y eficacia. Ademas muestra la información bastante bien detallada y ordenada. Dicho programa se llama Inxi y os voy a mostrar como instalar en Ubuntu y sus derivadas, esta en los repositorios oficiales pero también podéis añadir el PPA correspondiente para tenerlo siempre a la ultima, personalmente uso la versión que viene en los repositorios oficiales ya que cumple con su función perfectamente.

Como ya os mencionado dicho programa se encuentra en los repositorios oficiales de Ubuntu, actualmente yo uso Linux Mint 18 y viene instalada por defecto pero no en Ubuntu 16.04. Pero, antes de nada, os voy decir que tipo de información podéis ver con Inxi.

Inxi nos muestra mucha información y muy útil como el modelo de nuestro ordenador, el escritorio que estamos usando junto con su versión, el Kernel que estamos usando, la distribución que tenemos instalada, la versión de la BIOS, la marca del ordenador, el modelo del procesador y sus características, el modelo de la tarjeta gráfica, el modelo de la tarjeta de sonido, los discos duros que tenemos junto con el espacio libre y usado de cada uno de ellos, la cantidad de RAM que tenemos instalada y la que esta libre y en uso, la Swap que tenemos y su uso y algunas cosas mas. Para que os hagáis una idea os muestro la información que me sale a mi en mi portátil:

 

informacion inxi en ubuntu

 

Como podéis ver la información sale muy ordenada y esta todo muy diferenciado y de un solo vistazo tenemos mucha información al alcance. Si queréis instalar Inxi desde los repositorios oficiales de Ubuntu basta con que tecleéis el siguiente comando en la Terminal:

sudo apt-get install inxi

Si queréis añadir el PPA para tenerlo mas actualizado solo tenéis que poner esto en la Terminal:

sudo add-apt-repository ppa:unit193/inxi
sudo apt-get update
sudo apt-get install inxi

Personalmente no recomiendo añadir PPAs innecesarios, y este es el caso, yo uso la versión que viene en los repos oficiales y funciona perfectamente y hace su función, pero os dejo las dos opciones para que vosotros elijáis la que queráis. Este PPA que os he puesto funciona en Ubuntu 12.04, 14.04, 15.10, 16.04 y 16.10. En el caso de que no uses ninguna de esas versiones entonces no quedaría mas remedio que instalar la versión que esta en los repositorios oficiales de Ubuntu.

Una vez instalado Inxi para ver la información lo que tenemos que hacer es abrir una Terminal y escribir:

inxi

Esto nos muestra poca información, aunque quizás lo que os muestra os es suficiente, si queréis ver en la Terminal lo mismo que me aparece a mi en la imagen de arriba tenéis que teclear:

inxi -F

Como ya he dicho Inxi me parece una herramienta muy buena, por su sencillez y eficacia y espero que la probéis. Ahora ya sabéis como podéis instalar Inxi en Ubuntu y cualquiera de sus derivadas y si queréis tenerlo lo mas actualizado posible tenéis también como añadir el PPA correspondiente.

He utilizado como fuente un articulo de Yoyo, desde aquí muchas gracias amigo ;D, que podéis visitar aquí:

Un saludo.

Lunes 22 de agosto de 2016

David González

David González
Blog Bitix

22+ buenos juegos en GNU/Linux

¿Que en GNU/Linux no hay juegos? Los hay, ciertamente no muchos de los triple AAA comerciales pero hay algunos originales y otros basados en otros que fueron muy conocidos comerciales publicados con anterioridad que están muy bien.

Linux
GNU

El número de juegos disponibles en GNU/Linux no es tan amplia como en Windows. Hay algunos clásicos como el juego del ajedrez que podemos jugar contra otro humano o contra la computadora, otro clásico es el juego Go o los juegos incluidos en el entorno de escritorio GNOME.

Si estos nos parecen pocos seguramente recordaremos con nostalgia los juegos de arcade de los 80 y 90 con los que tan buenos momentos pasamos en nuestra infancia, con el emulador Mame y las ROM de los juegos podremos echarnos unas partidas a algunos juegos míticos. Si estos nos parecen poco hay alguna lista de otros buenos juegos en GNU/Linux más actuales y otra lista de juegos de software libre.

Hace un tiempo hice una pequeña lista de juegos en GNU/Linux en el que comentaba varios: OpenTTD, Hedgewars, I have no tomatoes, Frozen Bubble, Neverball y Neverputt o Pingus. Varios de estos son reimplementaciones de los originales como Transport Tycoon Deluxe, Worms, Puzzle Bobble o Lemmings. Los triple AAA suelen aprovechan todas las capacidades de las tarjetas gráficas y tiene una calidad de gráficos impresionante pero exigen computadoras muy potentes y con los últimos componentes que no todos pueden renovar cada pocos años. Los siguiente juegos quizá a nivel gráfico esté algo por debajo de los últimos estrenos comerciales pero en cuanto a jugabilidad y diversión proporcionada no tiene por que ser menor. De la lista juegos recopilados en la wiki de Arch Linux en este artículo destacaré los siguientes juegos de diferentes géneros que me han parecido de lo mejor que he encontrado con especial mención para Teeworlds, Supertux Kart, 0 A.D, The Battle for Wesnoth, UFO AI, Widelands y Nethack.

Todos estos juegos los encontraremos entre los paquetes para nuestra distribución GNU/Linux disponibles para instalar mediante el gestor de paquetes. Si queremos juegos comerciales en Linux en Steam y GOG encontraremos algunos bastante buenos.

Astromenace

Acción y aventura. Astromenace es un juego de naves con la adición que permite mejorar las armas de la nave. Tiene un aspecto gráfico en tres dimensiones con efectos especiales de gran calidad. Sitio web.

Teeworlds

Disparos. Es un shooter en dos dimensiones para jugar contra otros jugadores y con diferentes modos de juego como todos contra todos, equipo contra equipo y capturar la bandera. Sitio web.

GCompris

Educación. Es una colección de juegos educativos con numerosas actividades para niños de entre dos y 10 años. Algunas actividades están orientadas al juego no obstante orientadas a la educación. Sitio web.

Torcs

Carreras. Torcs es un juego de simulación de carreras con gráficos 3D. Sitio web

VDrift

Carreras. Otro juego de simulación de conducción. Sitio web

Supertux Kart

Carreras. Similar al Mario Kart pero ambientado con los personajes del mundo Tux. Es un juego de carreras con múltiples circuitos, personajes y modos de juego. Es un juego con la intención de ser divertido para todas las edades más que realista. Se puede jugar contra la computadora y otros jugadores. Sitio web

Glest

Estrategia. Glest es un juego de estrategia en tiempo real donde puedes controlar dos ejércitos de diferentes acciones, Tech que se compone de guerreros y dispositivos mecánicos y Magic que prefieren magos y criaturas invocadas. Sitio web

0 A.D

Estrategia. Un juego similar a Age of Empires que no tiene nada que envidiarle. Podremos controlar varias de las civilizaciones más conocidas de la antigüedad. Sitio web

The Battle for Wesnoth

Estrategia. Está basado en turnos con una ambientación de fantasía. Deberás formar gradualmente una armada reclutando nuevos guerreros y formando veteranos. Elige personajes de una amplia selección y forma una fuerza con las habilidades correctas para luchar correctamente en diferentes terrenos.

Wesnoth tiene varias campañas, 200 tipos de unidades, 60 razas, 6 facciones y cientos de años de historia. El mundo de Wesnoth es muy grande. Sitio web

UFO AI

Estrategia. Un juego de estrategia basado en turnos. Formarás un grupo de resistencia para luchar contra la invasión alien. Crearás una base y equiparán a un grupo de combatientes. Está basado en el conocido juego X-COM. Sitio web

Warzone 2100

Estrategia. Es un juego de estrategia y táctica en tiempo real donde comandarás fuerzas para reconstruir el mundo después de que haya sido destruido por misiles nucleares. Ofrece un modo de campaña, multijugador y de un solo jugador de escaramuzas. 400 diferentes tecnologías combinado con el sistema de diseño de unidades permite una variedad de posibles unidades y tácticas. Sitio web

Widelands

Estrategia. Inspirado en el gran juego Settlers II pero con una significante más variedad. Deberás recolectar diferentes tipos de materias y productos para hacer crecer a tu pueblo. Sitio web

Unknown Horizons

Estrategia. Es un juego de estrategia de simulación en tiempo real en 2D con énfasis en la economía y la construcción de ciudades. Expande tu pequeño establecimiento para forma una colonia poderosa, recolecta impuestos y proporciona a tus habitantes bienes valiosos. Incrementa tu poder con una economía bien balanceada y con comercio estratégico y diplomacia. Sitio web

Angband

Roguelike. Angband es un juego de exploración de mazmorras para un solo jugador. Está basado en texto. Jugarás con un aventurero en busca de riquezas, lucharás contra monstruos y te prepararás para una batalla final con Morgoth, el señor de la oscuridad. Sitio web

Nethack

Roguelike. Similar a Angband y uno de los juegos de su estilo más conocidos. Sitio web

Alien Arena, AssaultCube, Cube 2: Sauerbraten, Nexuiz, Warsow, Xonotic

Disparos. Juegos similares a Quake.

Urban Terror

Disparos. Juego similar a Counter Strike que es la referencia de este estilo. Posee diferentes modos de juego. Ambientado en la actualidad. Sitio web

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo crear un plugin para WordPress. Making of SimTerm: pantalla de configuración (segunda parte)

simterm
WordPress es un sistema gestor de contenidos muy utilizado mundialmente. Y uno de sus puntos fuertes es su capacidad para que cualquiera de nosotros lo pueda extender fácilmente. Aprovechando el mismo núcleo que proporciona WordPress con funciones y clases que nos permiten interactuar con la plataforma crearemos nuestras propias funcionalidades que harán de nuestra página o blog algo único.
Este post es la segunda parte, si prefieres empezar desde cero, te recomiendo visitar primero Cómo crear un plugin para WordPress. Making of SimTerm.

Esta vez nos centraremos en la configuración de nuestro plugin.

Configuración

Nuestro plugin necesitará algo de configuración por defecto para nuestros terminales, como serán el tema y la velocidad por defecto (iremos metiendo más opciones luego).

Para crear la configuración del plugin, vamos a utilizar la API de configuración de WordPress (WordPress Settings API) que está con nosotros desde hace algunos años y nos ayuda enormemente con este tema proporcionando sencillez a la hora de programarla y una capa de seguridad, con la que nos podemos olvidar de hacer muchas comprobaciones a los datos que nos llegan del usuario (no están de más, pero es un tostón hacerlo, y WordPress nos quita trabajo).

Para separar la configuración del propio plugin he creado el archivo simterm-settings.php que contendrá la clase SimTermSettings, será de tipo singleton y se encargará de presentar distintas vistas para la pantalla de configuración. Se ha creado una vista para cada tipo de campo, como detallaremos más adelante.

Antes de adentrarnos en la configuración, primero debemos añadir un par de acciones en la inicialización de nuestro plugin (aquella función init() de la primera parte), aunque lo importante es que esto se ejecute siempre, puede estar escrito directamente en el archivo PHP principal del plugin:

1
2
    add_action('admin_menu', array('Clase', 'register_settings_menu'));
    add_action('admin_init', array('Clase', 'settingsInit'));

Con estas dos funciones, lo primero es añadir un elemento de menú para nuestro plugin (al menos que la página de configuración aparezca), y con el segundo inicializamos la configuración del plugin (estableciendo qué cosas se van a configurar y cómo). En el ejemplo he puesto ‘Clase’, ya que el segundo parámetro de add_action() es un callback que llamará WordPress de manera independiente cuando sea necesario. Si vuestro plugin es orientado a objetos podréis pasar el objeto donde está ubicado el método a llamar para cada acción. En mi caso concreto, simterm.php contiene lo siguiente:

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
36
<?php
/**
 * Plugin Name: SimTerm
 * Plugin URI:  http://gaspar.totaki.com/en/php-project/simterm/
 * Description: Simulates terminal input/output for tutorials
 * Version: 0.1.0
 * Author: Gaspar Fernández
 * Author URI: http://totaki.com/poesiabinaria/
 * License: GPL3
 */


require_once('views.php'); // visto en la primera parte

class SimTermLoader
{
    protected static $st;

    function Init()
    {
    /* Incluimos nuestra clase */
    $path = plugin_dir_path(__FILE__);
    require_once($path.'simterm-core.php');
    self::$st = new SimTerm;

    add_action('admin_menu', array(self::$st->settings(), 'register_settings_menu'));
    add_action('admin_init', array('SimTermLoader', 'settingsInit'));
    }

    public function settingsInit()
    {
    $sett = self::$st->settings();
    $sett->register();
    }
};

SimTermLoader::Init();

En este caso, Init() crea una instancia de SimTerm, que está en el archivo simterm-core.php (vimos algo en la primera parte). Ahora, el objeto donde están register_settings_menu y register lo obtenemos de la llamada a settings() de SimTerm. Por ahora, la clase SimTerm contiene lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
require_once('simterm-settings.php');

class SimTerm
{
    protected $settings;

    function __construct()
    {
    /* Inicialización básica de mi plugin
       (la que no tiene que ver con WordPress) */

    $this->settings = SimTermSettings::getInstance();
    }

    function settings()
    {
    return $this->settings;
    }
};

Como vemos, ya que SimTermSettings es un singleton, con la llamada de SimTerm::settings() obtendremos la instancia de dicho singleton. La clase SimTermSettings, por el momento vacía está así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class SimTermSettings
{
    private static $instance;
    public static function getInstance()
    {
    if (self::$instance === null)
        self::$instance = new SimTermSettings();

    return self::$instance;
    }

    protected function __construct()
    {
    }

    private function __clone()
    {
    }

    private function __wakeup()
    {
    }
};

Comentamos ahora lo que tiene que hacer la función a la que llamamos en la acción admin_menu:

1
2
3
4
5
6
7
8
9
10
<?php
    public function register_settings_menu()
    {
    add_options_page('SimTerm Settings', 'SimTerm settings', 'administrator', 'simterm-settings',array($this, 'globalSettingsPage'));
    }

    public function globalSettingsPage()
    {
    echo SimTermView::render('globalsettings');
    }

Lo importante es add_options_page($titulo_de_la_pagina, $titulo_del_menu, $permisos, $slug, $callback) con el que se inserta el elemento en el menú de WordPress. Si preferimos un enlace más grande y no dentro de Ajustes podemos utilizar add_menu_page() con el que podemos poner hasta un icono.
Lo importante es que cuando se pulsa, se cargará la vista que está en views/globalsettings (mirar la clase SimTermView, para ver cómo va todo). Esta vista la pondré más adelante.

Por otro lado, tenemos el método register(), que explicaremos a continuación.

Empezamos con las opciones

Lo más básico para crear opciones de WordPress es:

No voy a detallar el funcionamiento de estas llamadas porque ya está muy bien documentado en el Codex de WordPress (ver los enlaces). Aunque voy a poner el caso concreto de SimTerm aquí para tener una idea y un ejemplo concreto de uso.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
    public function register()
    {
    /* Settings registration  */
    register_setting('simterm-settings',
             'simterm-default-theme');
    register_setting('simterm-settings',
             'simterm-delay-time',
             array($this, 'number_sanitize'));
    register_setting('simterm-settings',
             'simterm-command-prepend');
    register_setting('simterm-settings',
             'simterm-type-prepend');
    /* Config sections  */
    add_settings_section('simterm-global-settings',
                 'SimTerm Configuration',
                 array($this, 'globalConfiguration'),
                 'simterm-settings');

    /* Config fields */
    add_option('simterm-type-prepend', '>');
    add_option('simterm-command-prepend', '$#');
    add_option('simterm-default-delay', '400');
    add_option('simterm-default-theme', 'light');

    add_settings_field('simterm-default-theme',
               'Theme to use',
               array($this, 'config_default_theme'),
               'simterm-settings',
               'simterm-global-settings');
    add_settings_field('simterm-default-delay',
               'Delay between lines',
               array($this, 'config_default_delay'),
               'simterm-settings',
               'simterm-global-settings');
    add_settings_field('simterm-command-prepend',
               'Command prepend character',
               array($this, 'config_command_prepend'),
               'simterm-settings',
               'simterm-global-settings');
    add_settings_field('simterm-type-prepend',
               'Type prepend character',
               array($this, 'config_type_prepend'),
               'simterm-settings',
               'simterm-global-settings');
    }

    public function number_sanitize($value)
    {
    return (is_numeric($value))?$value:0;
    }

    public function globalConfiguration()
    {
    echo wpautop( "This are some options you can change." );
    }
    public function config_default_theme()
    {
    /* In the future, this themes may be extensions of this plugin  */
    echo SimTermView::render('settings/select', array('fieldId'=>'simterm-default-theme',
                              'options' => array('regular' => 'Regular',
                                         'dark' => 'Dark',
                                         'light' => 'Light',
                                         'blue' => 'Blue'),
    ));
    }

    public function config_default_delay()
    {

    echo SimTermView::render('settings/text', array('fieldId'=>'simterm-default-delay',
                            'fieldText' => 'Delay in milliseconds'
    ));
    }

    public function config_command_prepend()
    {
    echo SimTermView::render('settings/text', array('fieldId'=>'simterm-command-prepend',
                            'fieldText' => 'Any of these characters may prepend a command input'
    ));
    }

    public function config_type_prepend()
    {
    echo SimTermView::render('settings/text', array('fieldId'=>'simterm-type-prepend',
                            'fieldText' => 'Any of these characters may prepend a type input'
    ));
    }

En este caso registramos las siguientes configuraciones:

  • simterm-default-theme : Será el tema por defecto que coja el terminal. En principio habrá pocos temas, así que estarán codificados directamente en estos archivos. Si todo marcha bien y terminamos con 200 plugins habrá que pensar algo nuevo.
  • simterm-delay-time : Será la espera entre línea y línea. En el futuro habrá más opciones para esto.
  • simterm-command-prepend : Será el carácter que introducirá un comando (pondremos el prompt, que suele ser un dólar).
  • simterm-type-prepend : Será el carácter que introducirá una petición al usuario, pondremos un signo mayor que (>)

Todas las configuraciones pertenecen a simterm-settings, que lo creamos para la ocasión. El último parámetro de register_setting() es un callback que filtrará el dato obtenido de base de datos e impedirá que entren datos no válidos (o por ejemplo si agrupamos varios datos en una misma cadena de caracteres, o tenemos que hacer cualquier otro tratamiento)

Con respecto a las secciones, sólo tendremos una sección (por el momento), y principalmente llamará a la función globalConfiguration() que pondrá un texto en pantalla. Podríamos cargar una vista para poner más cosas, en el futuro creo que así será. Más adelante, definimos las opciones por defecto de cada una de las opciones de configuración. Y, por último, definimos los campos de formulario que se cargarán para cada opción de configuración definida y el texto introductorio de las mismas. En este caso, a add_settings_field le pasaremos:

  • Opción a modificar
  • Texto de introducción
  • Callback del campo (que como vemos, todas las funciones llaman a vistas (que pondré más adelante)
  • Página de configuración
  • Sección
  • Podemos pasar un array de argumentos para el callback y hacer funciones más genéricas.

Es cierto que podemos prescindir del tema de las plantillas de las vistas, fijaos como los callbacks lo único que hacen es presentar ciertas plantillas, código que podemos escribir directamente en dichas funciones PHP. Pero por manía mía desde hace años, y por tener algo más de flexibilidad y mejor mantenimiento me gusta tener todo lo relacionado con las vistas en otro lugar y por separado.

Y ya lo tenemos, generaremos una pantalla de configuración como esta:
Screenshot 28-07-2016-210714

Las vistas utilizadas

Adjunto también las vistas utilizadas, porque, aunque miréis el código fuente del plugin, tal vez éste haya cambiado con respecto a esta guía.

views/globalsettings.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div class="section panel">
    <h1>SimTerm Options</h1>
    <form method="post" enctype="multipart/form-data" action="options.php">
        <?php
    settings_fields('simterm-settings');
        do_settings_sections('simterm-settings');
        ?>
        <p class="submit">  
            <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />  
        </p>  
       
    </form>
   
    <p>SimTerm by <a href="http://gaspar.totaki.com">Gaspar Fernández</a> using Show Your Terms by <a href="http://kandebonfim.com">Kande Bonfim</a>.</p>
</div>

views/settings/text.php

1
2
3
4
5
6
7
8
9
<label for="<?php echo $fieldId;?>">
   <input id="<?php echo $fieldId;?>" type="text" value="<?php echo get_option( $fieldId ); ?>" name="<?php echo $fieldId;?>" />
   <div class="settings-text-expl">
   <?php
    if (isset($fieldText))
      echo $fieldText;
   ?>
</div>
</label>

views/settings/select.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="<?php echo $fieldId;?>" value="1" name="<?php echo $fieldId;?>">
   <?php
   if (isset($options))
     {
       $default = get_option( $fieldId, true );
       foreach ($options as $optionKey => $optionValue)
     {
       echo '<option value="'.$optionKey.'" '.selected($optionKey==$default).'>'.$optionValue.'</option>';
     }
     }
   else
     echo 'No options';
?>
</select>

Tercera parte

La tercera parte, que se publicará el día 29. Estará enfocada a la inclusión de recursos y a los shortcodes. Y aún queda mucho por recorrer.

The post Cómo crear un plugin para WordPress. Making of SimTerm: pantalla de configuración (segunda parte) appeared first on Poesía Binaria.

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!

David Moreno

David Moreno
dm's blog

Cosmetic changes to my posts archive

I’ve been doing a lot of cosmetic/layout changes to the nearly 750 posts in my blog’s archive. I apologize if this has broken some feed readers or aggregators. It appears like Hexo still needs better syndication support.

Miércoles 17 de agosto de 2016

Programando para Haiku – Barras de menús – Parte III

Seguimos con los tutoriales de Haiku, hoy veremos como crear barras de menú. Partimos del código de la ventana vacía, lo tienes en la foto junto con el comando de compilación.

MiAplicacionHaikuCodigoHaz click en la imagen para verlo en grande

Debemos saber que en la API de BeOS hay tres clases que nos van a servir.

  • BMenuBar, se trata de la barra en sí, que esta pegada a la ventana. Un BMenuBar contiene BMenus.
  • BMenu, son los menús en sí. Un menú es un elemento que contiene acciones, organizadas como si fuera una lista. Los menús no definen acciones, pero sí su organización. Así, a un BMenu le tendremos que añadir BMenuItems u otro BMenus (menús anidados).
  • BMenuItem, son las acciones de los menús. Cada BMenuItem tiene la capacidad de generar un BMessage nuevo, listo para ser procesado por nuestra aplicación.

En la imagen se puede ver perfectamente

BMenu

Vamos a crear una barra de menú con dos menús, uno de ellos simple y otro con un menú anidado y un separador.

#include <AppKit.h>
#include <InterfaceKit.h>
#include <InterfaceDefs.h>

#define NEW_FILE 3
#define EXPORT_AS 5

class VentanaPrueba : public BWindow{
	public:
		VentanaPrueba() : BWindow(BRect(100,100,900,700),"Mi ventana",B_TITLED_WINDOW,0){
			AddChild(CreateMenuBar());
		}
		bool QuitRequested(){
			be_app_messenger.SendMessage(B_QUIT_REQUESTED);
			return BWindow::QuitRequested();
		}
		void MessageReceived(BMessage* msg){
			switch(msg->what){
				default:
					BWindow::MessageReceived(msg);
			}
		}
		BMenuBar* CreateMenuBar(){
			BMenuBar* bar = new BMenuBar(BRect(0,0,100,20),"MenuBar");
			
			BMenu* file = new BMenu("File");
			BMenu* help = new BMenu("Help");
			BMenu* exportMenu = new BMenu("Export");
			
			bar->AddItem(file);
			bar->AddItem(help);
			
			/* FILE */
			BMenuItem* newFile = new BMenuItem("New file",new BMessage(NEW_FILE));
			newFile->SetShortcut('N',B_COMMAND_KEY);
			file->AddItem(newFile);
			
			file->AddItem(exportMenu);
			file->AddSeparatorItem();
			
			BMenuItem* quit = new BMenuItem("Quit",new BMessage(B_QUIT_REQUESTED));
			quit->SetShortcut('Q',B_COMMAND_KEY);
			file->AddItem(quit);
			
			/* EXPORT */
			BMenuItem* exportAs = new BMenuItem("Export as...",new BMessage(EXPORT_AS));
			exportMenu->AddItem(exportAs);
			
			/* HELP */
			BMenuItem* helpVersion = new BMenuItem("Help",NULL);
			help->AddItem(helpVersion);
			
			return bar;
		}
};

class AplicacionPrueba : public BApplication{
	public:
			VentanaPrueba* ventana;
			AplicacionPrueba() : BApplication("application/x-aplicacion-prueba"){
				ventana = new VentanaPrueba();
				ventana->Show();	
			}
};

int main(int argc, char** argv){
	AplicacionPrueba app;
	return app.Run();
}

Y el resultado es el siguiente:

BMenuBar

Como vemos, SetShortcut hace que los menús sean seleccionables con combinaciones de teclado. Hay que tener en cuenta que en BeOS, la tecla que en Windows normalmente Ctrl, es Alt. Así operaciones como copiar y pegar con Alt+C y Alt+V. Para responder al evento solo hace falta escuchar en la función MessageReceived. En el caso de B_QUIT_REQUESTED, el mensaje ya está implementado en la función QuitRequested.

La entrada Programando para Haiku – Barras de menús – Parte III aparece primero en Blog - Adrianistan.eu.

Lunes 15 de agosto de 2016

Google prepara un sistema operativo basado en Linux

Se trata de un sistema operativo novedoso, el cual tendrá el nombre Fuchsia, el cual tendrá entre otras características la posibilidad de ejecutarlo desde cualquier dispositivo, ya sea una computadora o un dispositivo móvil, lo cual lo vuelve sin lugar a dudas bastante innovador. La interfaz que utilizará Fuchsia será similar al reconocido Flutter, y tendrá como lenguaje de programación primario
Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo crear un plugin para WordPress. Making of de SimTerm (primera parte)

simterm
Son muchos los plugins para WordPress disponibles hoy en día, aunque la magia de este sistema de publicación radica en sus posibilidades para extenderlo. Así que aquí contaré la historia de la primera versión de mi primer plugin más o menos serio para WordPress: SimTerm. Contando, los pasos que di, lo que pude haber hecho de otra forma y lo que debí haber hecho de otra forma.

Índice

  1. Instalación local de WordPress.
  2. Elección del nombre.
  3. Creando nuestro plugin
  4. Pequeña intro a la programación de plugins
  5. Vistas

Instalación local de WordPress

Lo primero, siempre que nos embarquemos en este tipo de proyectos será instalar WordPress de manera local, en nuestro ordenador. Así iremos mucho más rápido. En ningún caso recomiendo trabajar en remoto editando los archivos en el servidor. Conozco casos de otros desarrolladores que argumentan que así van más rápido pero:

  • Si trabajas a través de un FTP, debes contar el tiempo que tarda una conexión en establecerse y un archivo en subirse. Crear o modificar un plugin es una tarea que implica salvar muchísimas veces los archivos y tal vez eches entre 5 y 10 segundos extra cada vez que salves y tengas que probar el archivo.
  • Si trabajas con sesiones SSH, en ocasiones los servidores no responden inmediatamente como si estuvieras en local, por lo que pequeños retardos en las respuestas del editor de texto pueden causarte una pérdida grande de tiempo global.
  • Si trabajas desde un editor desde la misma web, aunque los hay muy eficientes, pero siempre hay que hacer un envío de información con los contenidos del archivo que implica un tiempo de envío.
  • Cuando pruebes la web, un servidor de Internet, tal vez tarde uno o dos segundos más (en el mejor de los casos) en responder, que suma al tiempo perdido editando.
  • Te quedas sin Internet un momento, y no puedes trabajar.
  • La depuración puede ser horrible, Muchos servidores están configurados para ocultar todos los errores. Así que sólo veremos pantallas vacías o de errores de servidor que no nos dirán nada. Por otro lado, si configuramos el servidor para poder visualizar correctamente los errores, todo el mundo podrá verlos.
  • Volviendo a lo de antes, si todo el mundo puede ver los errores, también verá los progresos, y las páginas rotas constantemente, por lo que perderemos visitas a nuestro sitio (o nuestro cliente perderá sus visitantes), lo que tampoco es recomendable.

Así que, antes de nada, instalemos en local un WordPress vacío, si nuestro plugin necesita dependencias, instalémosle también éstas. O si nuestro proyecto es para un cliente y necesitamos adaptarnos a su WordPress tal y como está ahora, siempre podemos migrar la instalación a nuestro servidor local.

Para este caso, yo utilicé WP-CLI, con el que realicé una instalación de WordPress en mi ordenador. Primero creé un usuario en MySQL (podríamos utilizar nuestro root, que es local y no pasa nada, pero yo prefiero tener todo organizado):

> CREATE SCHEMA wptest
Query OK, 1 row affected (0.00 sec)
> GRANT ALL PRIVILEGES ON wptest.* TO ‘wptest’@’localhost’ IDENTIFIED BY ‘12345’;
Query OK, 0 rows affected (0.00 sec)

Ahora, instalé WordPress de la siguiente manera:

$ wp core download –path=wptest –locale=es_ES
Downloading WordPress 4.5.3 (es_ES)…
md5 hash verified: d991b3152a1649b1286fd076658e1066
Success: WordPress downloaded.
$ wp core config –dbname=wptest –dbuser=wptest –dbpass=12345 –dbhost=localhost –locale=es_ES
Success: Generated wp-config.php file.
$ wp core install –url=”http://localhost/wptest/” –title=”WP Tests” –admin_user=”admin” –admin_password=”pass” –admin_email=”blakeyed@totaki.com”
Success: WordPress installed successfully.

Si utilizar MySQL sandbox, tendrás el motor de base de datos instalado en otro socket, o puerto diferente, en mi caso, tengo la base de datos que utilizo en /tmp/mysql_sandbox5167.sock así que, para instalar WordPress ahí, tengo que decir:

dbhost=localhost:/tmp/mysql_sandbox5167.sock

Y ya tendría la base de datos lista.

Elección del nombre

Tampoco es nada del otro mundo. Pero debemos procurar que sea descriptivo y no esté siendo utilizado por otro plugin de WordPress. En principio, ya que el plugin va a servir para simular un terminal (de Linux o de cualquier otro SO), simterm me pareció un buen nombre (porque WP-Terminal estaba cogido).
Para ver si el nombre está cogido, debemos crear un slug, o un título corto que utilice caracteres seguros, en este caso coincide con el nombre “simterm”, pero podría ser wp-simterm, wordpress-sim-term o algo así. Para ver si el slug está cogido, podemos acceder a https://wordpress.org/plugins/[slug] y ver si hay algo ahí.

El hecho de que el nombre no esté siendo utilizado por otro, es más que nada para que nos encuentren fácilmente. Si otro se llama igual, puede haber confusión por parte de los usuarios. El hecho de que el slug no esté cogido, además de para poder subirlo a WordPress.org va a hacer que no haya conflicto con otros plugins y como la vida de una página en WordPress es larga, no sabemos qué plugins vamos a instalar. Me refiero sobre todo al hecho de crear un plugin privado (que no vamos a liberar) que se llame igual que otro plugin que hay instalado.

Creando nuestro plugin

Lo primero que hacemos es crear un directorio donde estará nuestro plugin. Lo crearemos dentro de wp-content/plugins/ y se llamará simterm.
Una vez hecho esto, creamos un archivo que se llame igual que el directorio que acabamos de crear, pero con extensión php, e incluimos lo siguiente:
wp-content/plugins/simterm/simterm.php:

1
2
3
4
5
6
7
8
9
10
<?php
/**
 * Plugin Name: SimTerm
 * Plugin URI:  http://gaspar.totaki.com/en/php-project/simterm/
 * Description: Simulates terminal input/output for tutorials
 * Version: 0.1.0
 * Author: Gaspar Fernández
 * Author URI: http://totaki.com/poesiabinaria/
 * License: GPL3
 */

Será un comentario de PHP muy grande con información básica sobre el plugin.

En este mismo instante, nuestro plugin ya debe aparecer en la sección de Plugins de WordPress:
myplugin

Pequeña intro a la programación de plugins

WordPress permite hacer los plugins de la forma que queramos, podemos empezar a escribir funciones y llamadas a la API de WordPress sin parar, aunque debemos hacer el plugin también bonito por dentro. Esto es subjetivo, pero tras leer varios plugins de WordPress de otras personas, hay una forma que me parece sencilla para empezar y a la vez elegante para crear nuestro plugin.
En el mismo archivo principal del plugin (simterm.php) empezaremos creando una clase SimTermLoader, con varios métodos, uno de ellos será Enable() o Init() donde tendremos todas las llamadas necesarias a funciones de WordPress para inicializar nuestro plugin: configuración de pantallas de administración, idiomas, shortcodes, hooks, etc, así como carga de ficheros, instanciación de clases. Las funciones que llame WordPress de nuestro plugin serán ahora de una clase SimTerm que crearemos en un archivo llamado (simterm-core.php, o podremos llamarla nuestroplugin-main.php, nuestroplugin-base.php, etc.).
Y lo primero que haremos nada más cargar el plugin será llamar de forma estática a este método SimTermLoader::Init()

La estructura básica será la siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
class SimTermLoader
{
  function Init()
  {
    /* Incluimos nuestra clase */
    $path = plugin_dir_path(__FILE__);
    require_once($path.'simterm-core.php');
    $st = new SimTerm;
    /* Acciones de WordPress add_filter, add_option, register_option... */
  }
};

SimTermLoader::Init();

wp-content/plugins/simterm/simterm-core.php:

1
2
3
4
5
6
7
8
9
10
11
<?php
class SimTerm
{
  function __construct()
  {
    /* Inicialización básica de mi plugin
       (la que no tiene que ver con WordPress) */

  }

  /* funciones callback para operaciones del plugin */
};

Algunos autores prefieren que la clase principal de su plugin (SimTerm en mi caso) sea de tipo Singleton. De ese modo todas las acciones y callbacks de WordPress irán a métodos de la clase SimTermLoader y ésta obtendrá la instancia del Singleton SimTerm y llamará al método adecuado.

Vistas

Los plugins producirán una salida de cara al usuario. Y personalmente no me gusta mezclar los archivos PHP de un plugin con salidas HTML del usuario. Por eso, vamos a colocar un pequeño sistema de vistas, no muy elaborado, pero evolucionará. Con este sistema conseguiremos separar la salida del usuario de los propios archivos del plugin haciendo más fácil su mantenimiento y más ordenado.
Estas vistas, las colocaremos dentro del directorio del plugin, en un directorio llamado views. Y haremos algo muy parecido a lo que hace get_template_part() en los temas, pero para nuestro plugin. Para ello, incluiremos dentro del archivo principal del plugin (simterm.php) el archivo views.php cuyo contenido es:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php

class SimTermView
{

  public static function render($slug, $variables=array(), $name = null)
  {
    global $wp_query;

    $template = self::searchTemplate($slug, $name);

    if ( is_array( $wp_query->query_vars ) )
      {
    extract( $wp_query->query_vars, EXTR_SKIP );
      }

    extract($variables);

    ob_start();

    if ( $template )
      require( $template ); /* load_template just requires or require_once the file extracting wp_query vars */

    return ob_get_clean();
  }

  private static function searchTemplate($slug, $name)
  {
    $templateNames = array();
    $path = plugin_dir_path(__FILE__).'/views/';

    if (isset($name))
      $templateNames[] = "{$slug}-{$name}.php";

    $templateNames[] = "{$slug}.php";

    foreach ( (array) $templateNames as $template )
      {
    if (!$template)
      continue;

    if (file_exists($path . '/' . $template))
      return $path . '/' . $template;
      }

    return false;
  }

};

Por lo tanto, a partir de ahora, siempre que queramos incluir algo de HTML (un poco de PHP también se permite, pero cuidaremos que éste sea sólo para generar salidas HTML para el usuario), lo escribiremos todo en un archivo aparte que situaremos dentro de views/ y lo llamaremos:

slug.php

o

slug-name.php

Siendo slug y name dos palabras que identificarán nuestra vista. Nuestro plugin buscará la plantilla y la volcará a pantalla usando la API de WordPress.
Además, tenemos un array llamado variables, que será asociativo y contendrá las variables que representaremos más tarde dentro de la vista. Así si hacemos:

1
2
<?php
echo SimTermView::render('mivista', array('nombre' => 'Poesía Binaria', 'url' => 'http://totaki.com/poesiabinaria/'));

La vista podrá contener algo parecido a esto:

1
<a href="<?php echo $url; ?>" title="<?php echo $nombre;?>"><?php echo htmlentities($nombre); ?></a>

Preparados para la segunda parte

El 22 de agosto saldrá la segunda parte de esta introducción a la creación de plugins de WordPress con mucho más contenido, enfocado a las páginas de configuración, a la inclusión de archivos CSS y JS a la web y a la creación del shortcode que utilizará este plugin.

The post Cómo crear un plugin para WordPress. Making of de SimTerm (primera parte) appeared first on Poesía Binaria.

Sábado 13 de agosto de 2016

BlogDRAKE: Disponible OpenMandriva Lx 3.0

Domingo 07 de agosto de 2016

5 distribuciones ligeras para Linux

Si tienes un ordenador con pocos recursos y necesitas utilizarlo, te recomendamos utilizar distribuciones para Linux ligeras, las cuales te permitirán utilizar el equipo para realizar las tareas más necesarias, como navegar por Internet, leer documentos e incluso también poder modificar hojas de cálculo. Las distribuciones ligeras para Linux son ideales para quienes buscan revivir ordenadores

Sábado 30 de julio de 2016

José María Morales Vázquez

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

Aruba Cloud: Nos mudamos de hosting

hosting Pues eso, que tenemos mudanza en ciernes. Llevo ya casi cuatro años en Gigas y sigo tan contento como el primer día, conste. Más si cabe. Pero en Aruba Cloud me han ofrecido un bono gratuito de prueba y voy a aprovechar para hacer algunos cambios.

Aruba es una empresa de hosting con datacenters en Italia, Francia, Reino Unido y la República Checa y distintos niveles de servicio que empiezan desde 1€/mes por una máquina con 1 core y 1 Giga de RAM. Ya iremos contando por aquí lo que vamos haciendo, pero valga esta entrada como propósito de intenciones… 😉

NOTA: De cara al público tienen también un servicio de prueba gratuita que te permitiría probar uno de estos VPS de 1€/mes durante dos meses.

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: Aruba Cloud: Nos mudamos de hosting || Hospedado en un Cloud VPS de Gigas.

Jueves 28 de julio de 2016

Verano

En realidad, como ya comenté en su momento, más que vacaciones es por un exceso de trabajo. Y de calor, que no hay que menospreciarlo. Y de sentido común, que quién va a leer los delirios que escribo en pleno agosto. La próxima entrada está programada para el 5 de septiembre. ¡A la próxima!Archivado en: […]

Lunes 25 de julio de 2016

Disponible LyX 2.2.1

Un breve artículo para anunciar la disponibilidad de la primer versión de corrección de errores de la serie 2.2.x: [ANNOUNCE] LyX 2.2.1 Released Aparte de numerosas correcciones de error y mejoras en la interfaz gráfica (y el regreso del soporte para algo llamado «Vista»… qué será eso…😄 ) se tiene un nuevo módulo para «jugar» […]
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

Disponible LabPlot 2.3.0

El sábado se ha publicado una nueva versión de este programa de visualización y análisis de datos construido sobre tecnologías KDE: LabPlot 2.3.0 released Desde su entrada a la infraestructura de KDE, el proyecto no ha hecho más que crecer. Las novedades de esta versión son realmente impresionantes: Gracias a la integración con Cantor, ahora […]
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.

Miércoles 20 de julio de 2016

Ramón Ramón Sánchez

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

¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero.


Warning: preg_replace(): Unknown modifier '/' in /home/bftlcbcg/public_html/blog/wp-content/plugins/jetpack/class.photon.php on line 346

¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero. Tienes un ordenador al que le tienes cariño, has trabajado con él durante años, tienes en él tu software instalado, todo funciona bien para ti, no necesitas cambiarlo. Pero, la edad no perdona a los sistemas operativos, si tienes Windows XP, Windows Vista,... Leer más »

La entrada ¿Windows 10? Una última oportunidad para tu viejo ordenador, se llama Linux y no te cuesta dinero. aparece primero en Software Libre y Comunicación.

Viernes 15 de julio de 2016

José María Morales Vázquez

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

Chuletillas (y XXXXV) – Integrar comandos MySQL en un shell script

chuletaExisten diversas formas de integrar comandos de MySQL dentro de un shell script de linux. La más cómoda, creo, es utilizar el parámetro -e del cliente en línea de myql. Por ejemplo, así:

#!/bin/sh
# comandos bash...
mysql -u usuario -p -e "CREATE DATABASE ejemplo;"
#comandos bash...

Lo que pasa es que así puesto sirve de bien poco porque nos va a pedir el password de forma interactiva. Para evitarlo podemos poner la password en el propio archivo del script. No es un método elegante ni especialmente seguro, pero en entornos poco críticos sirve perfectamente:

#!/bin/sh
PASSWORD=mipassword
# comandos bash...
mysql -u usuario --password=$PASSWORD -e "CREATE DATABASE ejemplo;"
#comandos bash...

Por último, si tenemos que ejecutar varios comandos, lo más cómodo es escribirlos uno a continuación de otro en un archivo independiente (con extensión sql por claridad) y ejecutarlos usando el comando source de mysql:

#!/bin/sh
PASSWORD=mipassword
# comandos bash...
mysql -u usuario --password=$PASSWORD -e "source /opt/sripts/imysql/importar_databases.sql"
#comandos bash...
NOTA: Todo lo dicho aquí sirve igualmente para MariaDB

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: Chuletillas (y XXXXV) – Integrar comandos MySQL en un shell script || Hospedado en un Cloud VPS de Gigas.

Martes 12 de julio de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Programación orientada a objetos en PHP 5: Herencia

Otra entrega más del curso de programación orientada a objetos en PHP. Estoy trabajando en el vídeo, estará listo en un par de días.

 

Programación orientada a objetos en PHP 5: Herencia

 

Jueves 07 de julio de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Programación Bash: Variables y parámetros en un script

Estos días estoy tremendamente productivo. Estoy preparando una serie de artículos y vídeos de programación en Bash. Empiezo con éste en el que hablo de las variables:

 

Variables y parámetros de un script en bash

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 localmente PrestaShop con Vagrant

 

Domingo 03 de julio de 2016

Juanje Ojeda

Juanje Ojeda
Nada de particular

Cambio de profesión

El 8 de noviembre del año pasado cumplí 38 años y me siento mejor de lo que me sentía con 20, así que estoy muy contento :-)

Además, celebré mi cumpleaños regalándome un cambio de profesión. He vuelto a una de mis 2 grandes pasiones, el cuerpo humano y la educación física.

Después de estar un tiempo reciclándome (hace 15 años que estudié Ciencias de la Actividad Física y del Deporte y han cambiado muchas cosas desde entonces...) y dedicándome a mejorar mi salud, me decidí a tirarme a la piscina y dejar los ordenadores para dedicarme a las personas.

Hacía mucho que no estaba tan motivado con algo :-)

Ya llevo casi un año metido en esa aventura y cada día más motivado. Aprendo mucho cada día e intento compartir ese conocimiento en mi nuevo blog profesional:
Juanje Ojeda

La mayoría de mis clientes son personas con mi antiguo perfil. Personas sedentarias que trabajan todo el día con ordenadores y que les cuesta encontrar tiempo y fuerza de voluntad para tomar las riendas de su salud.
Incluso he empezado a ayudar de forma remota a antiguos compañeros de trabajo y gente del gremio. Es lo bueno de Internet y las nuevas tecnologías :-P
Entrenamiento online

Espero seguir así de contento e ilusionado con esta nueva etapa durante mucho tiempo. Pero si no es así, al menos lo intenté y lo disfrutaré mientras dure :-)

Sábado 02 de julio de 2016

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Probando Wayland en Ubuntu 16.04

Hasta ahora para dibujar ventanas en Linux usabamos X11. El protocolo X11 data de mediados de los 80. Esta escala temporal en el mundo de la informática es una barbaridad, por lo que alguien pensó que era hora de actualizarlo.

Wayland va a ser la nueva forma que vamos a tener de dibujar ventanas en Linux. Viene incluido de serie en Ubuntu 16.04 y ya puede ser probado.

Lo primero que hay que hacer es instalar los paquetes necesarios. Para ello se ejecuta:

sudo apt-get install weston 
sudo apt-get install qtwayland5 
sudo apt-get install xwayland libreoffice-gtk3

Una vez instaladas las dependencias necesarias, se procede a configurar Weston. Weston es la implementación por defecto de cómo debería ser un entorno de escritorio bajo Wayland.

Con nuestro editor de texto favorito se va a crear el archivo “~/.config/weston.ini”:

[core]
modules=xwayland.so,cms-colord.so
shell=desktop-shell.so
#gbm-format=xrgb2101010

[shell]
#background-image=/usr/share/backgrounds/gnome/Aqua.jpg
#background-color=0xff002244
#background-type=tile
#panel-color=0x90ff0000
panel-location=top
#locking=true
#animation=zoom
#startup-animation=fade
#binding-modifier=ctrl
#num-workspaces=6
#cursor-theme=whiteglass
#cursor-size=24

#lockscreen-icon=/usr/share/icons/gnome/256x256/actions/lock.png
#lockscreen=/usr/share/backgrounds/gnome/Garden.jpg
#homescreen=/usr/share/backgrounds/gnome/Blinds.jpg
#animation=fade

[launcher]
icon=/usr/share/icons/gnome/24x24/apps/utilities-terminal.png
path=/usr/bin/weston-terminal

[launcher]
icon=/usr/share/pixmaps/firefox.png
path=/usr/bin/firefox


[input-method]
#path=/usr/lib/weston/weston-keyboard
path=/bin/ls


#[output]
#name=LVDS1
#mode=1680x1050
#transform=90
#icc_profile=/usr/share/color/icc/colord/Bluish.icc

#[output]
#name=VGA1
#mode=173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync
#transform=flipped

#[output]
#name=X1
#mode=1024x768
#transform=flipped-90

[libinput]
enable_tap=true

#[touchpad]
#constant_accel_factor = 50
#min_accel_factor = 0.16
#max_accel_factor = 1.0

[keyboard]
keymap_layout=es

[screen-share]
#command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize

Ahora sí. Vamos a ejecutar Wayland. Para ello pulsamos la combinación de teclas “Ctr+Alt+F1”, entraremos en modo consola. Siempre podemos volver al modo gráfico con “Ctr+Alt+F7”. Nos autentificamos y escribimos en el terminal:

weston-launch

Por ahora sólo podemos lanzar terminales, para poder ejecutar otras aplicaciones se abre un terminal dentro de Wayland y se debe escribir:

export QT_QPA_PLATFORM=wayland-egl
export GDK_BACKEND=wayland
export QT_QPA_PLATFORMTHEME=fusion
export QT_STYLE_OVERRIDE=fusion
export SAL_USE_VCLPLUGIN=gtk3

Con esta configuración podemos lanzar aplicaciones desde ese terminal. Vamos a notar diferencia entre las aplicaciones GTK3, Qt5 y X11. Las aplicaciones GTK3 y Qt5 se ejecutarán en modo Wayland nativo. Para las X11 se creará una ventana dentro de Weston, al estilo que usan los Mac. Por ejemplo, se puede ejecutar LibreOffice con el comando “lowriter”. Se puede navegar por Internet con el comando “webbroser”.

Weston trabaja mucho con las combinaciones del teclado, al estilo de Unity. Las más interesantes son:

Ctr + Alt + borrar → Salir de Weston

Super + tab → Cambiar de ventana

Super + rueda del ratón → Zoom

Super + Alt + rueda del ratón → Cambiar opacidad de la ventana

Super + k → Cerrar ventana

Super + s → Hacer captura de pantalla

Super + r → Hacer un vídeo de la pantalla

Toda la configuración de Weston se puede encontrar en el archivo “~/.config/weston.ini”. Para ver el manual de este archivo, se puede usar el comando “man weston.ini”. Aquí se cambian cosas como pueden ser la resolución de la pantalla, el idioma del teclado o la imagen de fondo.

El consumo de RAM es bajo. Una sesión recién abierta de Weston consume 82 Mb. Comparando con X11, una sesión recién iniciada de Openbox consume 96 Mb. Para hacer esta prueba he parado lightdm usando el comando “service lightdm stop”. Como Weston es un gestor de ventanas ligero, por eso lo comparo con Openbox.

He notado que se puede trabajar bajo Wayland, llegando a lanzar documentos de LibreOffice bajo Wayland y trabajar sin problemas. Pero la integración de las aplicaciones con Wayland está todavía muy verde. Supongo que con el tiempo esto se solucionará. De hecho, no he sido capaz de ejecutar Firefox, que suelta una extraña ventana de error. Las ventanas de las aplicaciones GTK3 y Qt5 tienen decoraciones diferentes. La decoración de la ventana también es diferente cuando se lanza una aplicación X11 pura o una aplicación de Weston pura. Por ahora me voy a quedar con X11, pero Wayland será una opción interesante cuando en un futuro se mejore la integración de las aplicaciones.


Viernes 01 de julio de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Ubuntu como entorno de programación y diseño web – PARTE VII

Ubuntu como entorno de programación y diseño web - PARTE VII. Otras herramientas útiles. Palabras claves: programación web, diseño web, entorno de desarrollo, Ubuntu, front-end developer, full-stack developer.

Viernes 24 de junio de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Ubuntu como entorno de programación y diseño web – PARTE VI

Tutorial Ubuntu como entorno de programación y diseño web - Parte VI Palabras claves: programación web, diseño web, entorno de desarrollo, Ubuntu, front-end developer, full-stack developer, virtualización, LXC.

Lunes 20 de junio de 2016

Pedro L. Lucas

Pedro L. Lucas
Cartas de Linux

Mini-manual sobre el formato PDF

Este es un pequeño manual sobre el formato PDF. En la red se pueden encontrar bibliotecas para manejar dicho formato, pero el objetivo un pequeño manual es permitirnos crear nuestros propios archivos PDF usando nuestro editor de textos favorito.

Los ejemplos los podéis descargar desde el siguiente enlace:

https://drive.google.com/folderview?id=0B1x9hVRJS4GmdUZpeVpYR1YzSjQ&usp=sharing

La referencia del formato se puede encontrar en al dirección:

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

Desde ahí pos podemos descargar el manual de referencia del lenguaje. Es muy extenso. Pero en este documento vamos a ver las bases más simples y lo usaremos como apoyo.

2 La codificación: ¡No es UTF!

A la hora de escribir desde cero un archivo PDF, es necesario usar la codificación correcta. Para empezar, ¡el UTF no está soportado directamente! El formato PDF soporta varias codificaciones a la hora de escribir sus archivos. Para no complicarnos usaremos la codificación Windows-1252 que los PDF reconocen con el nombre WinAnsiEncoding.

Si usamos Gedit para editar hay que guardar el archivo con “Guardar como” y dará opción a cambiar la codificación de caracteres. Deberemos añadir la Occidental Windows-1252.

También se puede usar el comando “iconv” de Linux.

3 “Hola mundo” en PDF

Una vez puesta la codificación correcta al documento, es hora de escribir nuestro primer archivo “hola_mundo.pdf” (no os preocupéis que después se analizará línea a línea):

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj
xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000416 00000 n
trailer
<< /Size 7
/Root 1 0 R
>>
startxref
541
%%EOF

En el código del PDF se aprecia que la primera línea es “%PDF-1.4”. Debe ser siempre así e indica que la versión del formato Pdf es la 1.4. Si pusiera “%PDF-1.7”, la versión sería la 1.7.

El archivo está dividido en objetos, veremos unas líneas en las que hay escrito “1 0 obj”, “2 0 obj”, “3 0 obj”,… Estas líneas indican el comienzo de un objeto. El objeto acaba siempre con “endobj”. Los objetos están numerados y la numeración no se debe repetir. No puede haber dos objetos “1 0 obj” en el mismo documento. Después usaremos estos números para llamar a un objeto desde otro.

Los objetos pueden representar páginas, tipos de letra, dibujos, textos,…

Vamos a fijarnos en el objeto “6 0 obj”:

6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj

Este objeto contiene un stream (flujo de datos) y su sintaxis es la siguiente:

n n obj
<< /Length bytes del stream >>
stream
...
endstream
endobj

Es decir, que después de “/Length” hay que poner el número de bytes que ocupa el texto que está entre stream y endstream. En el “6 0 obj” hay 97 bytes entre stream y endstream.

Dentro del objeto “6 0 obj” hay un comando con la forma “(Hola mundo)Tj” es evidente que es el texto que se está dibujando, podríamos modificar el texto a mostrar y tocaría variar el valor de “/Length” según los bytes que ocupe el stream.

Vamos a seguir viendo los objetos de hola_mundo.pdf:

  • 1 0 obj

1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj

Es un catálogo, viene a indicar en que objeto se pueden encontrar las páginas del documento “3 0 obj”. “2 0 obj” hace referencia a un contorno (“/Outline”).

  • 2 0 obj

2 0 obj
<< /Type /Outlines /Count 0 >>
endobj

Por ahora, lo vamos a ignorar. Dentro del catálogo “1 0 obj” es opcional.

  • 3 0 obj

3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj

Este objeto del tipo “Pages”, páginas, y es un índice de los objetos en los que se representan las páginas del documento. Con “/Kids” se indican los objetos que contienen las páginas. En este caso sólo el objeto “5 0 obj” es una página. “/Count” es el número de páginas del documento. En este caso sólo hay una.

Para poner, por ejemplo, dos páginas una en el objeto “5 0 obj” y otra en el objeto “7 0 obj” se debería cambiar por:

3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
7 0 R
 ]
/Count 2
>>
endobj
  • 4 0 obj

4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj

Este es un objeto de tipo “/Font” y representa un tipo de letra. En este caso concreto es un tipo de letra “/Helvetica” al que vamos a referirnos en el documento como “/F1” (“/Name /F1”). A partir de ahora, cuando se vaya a escribir un texto y le indiquemos que es el tipo “/F1” se buscará el objeto “4 0 obj” y se pondrá un tipo de letra “/Helvetica”.

Se puede cambiar “/Helvetica” por otros tipos de letra.

Por defecto, los visores de archivos PDF deberían tener los tipos de letra:

/Times-Roman

/Times-Bold

/Times-Italic

/Times-BoldItalic

/Helvetica

/Helvetica-Bold

/Helvetica-Oblique

/Helvetica-BoldOblique

/Courier

/Courier-Bold

/Courier-Oblique

/Courier-BoldOblique

/Symbol

/ZapfDingbats

Por lo que no hará falta incrustarlos en el documento y se podrán hacer documentos más ligeros.

El formato PDF nos permite usar otros tipos de letra que se incrustan en el archivo, pero esto rebasa los límites de este manual.

Hay que definir un objeto de tipo “/Font” por cada tipo de letra que se vaya a usar en el documento.

  • 5 0 obj

5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj

Este es un objeto de tipo página (/Page). Tiene una serie de requisitos importantes:

  1. Debe indicar cuál es su objeto padre que le referencia. Es este caso es el objeto “3 0 obj”: /Parent 3 0 R

  2. Tamaño de la página en puntos. Para pasar de mm a puntos usaremos la fórmula x*210.0/74.0. De puntos a mm x*74.0/210.0. En este caso es un A4 con un tamaño de 595×842 puntos: /MediaBox [ 0 0 595 842 ]

  3. Contenidos de la página. En este caso la página va a contener al objeto “6 0 obj” que es el que va a escribir el texto: /Contents 6 0 R

  4. Por último, otros recursos que se van a necesitar para dibujar los elementos de la página como pueden ser los tipos de letra. En este caso se ha indicado que se va a usar el tipo de letra /F1 que se encuentra en el objeto “4 0 obj”:

/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>

Si se necesitasen más tipos de letra en esta página, sólo habría que añadirlos haciendo referencia a su nombre y objeto:

/Resources <<
/Font << /F1 4 0 R
/F2 9 0 R
 >>
>>
  • 6 0 obj

6 0 obj
<< /Length 97 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 283 559 Td /F1 10 Tf (Hola mundo)Tj
ET
endstream
endobj

Este es un objeto stream que ya se ha visto antes. Más adelante veremos los comandos de dibujo. No hace falta decir que es el que dibuja el texto “Hola mundo”.

  • xref

Índice de los objetos. Debe indicar el número de objetos que tiene el documento (se le va a sumar uno, por eso pone xref y a continuación 0 7). Después siempre vamos a poner “0000000000 65535 f”. A continuación se van a poner los bytes que hay desde el comienzo del archivo a la posición del objeto, por ejemplo, hasta el objeto “0 1 obj” hay 9 bytes, hasta el objeto “2 0 obj” hay 74,…

xref
0 7
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000416 00000 n
trailer
<< /Size 7
/Root 1 0 R
>>
startxref
541

Después de localizar todos los objetos, viene el “trailer” en el que se indica cuantos objetos hay “/Size 7” (recordad que en este caso son 6 más uno) y se debe indicar cuál es el objeto donde se guarda el catálogo del documento (/Root 1 0 R) que en nuestro caso es el objeto “1 0 obj”.

Las últimas líneas:

startxref
541

Indican cuántos bytes hay desde el comienzo del documento hasta la referencia de objetos xref.

Como os podéis imaginar los lectores del Pdf deberán leer el archivo de atrás a hacia delante para localizar el de xref y tener así el índice con los objetos y su posición en el documento.

  • %%EOF

La última línea indica el final del documento PDF.

Como se puede apreciar el formato Pdf no está diseñado para escribirlo a mano por un humano, pues hay que ir contando bytes. Es ideal para crear desde algún lenguaje de programación.

Truco: Para no tener que andar contando bytes se puede usar el comando “wc -c” desde un terminal lo ejecutamos en Linux y vamos pegando el texto que nos interese. Pulsando Ctrl+D nos indicará el número de bytes que ocupa el texto que hayamos pegado.

Nota: Hay que recordar que los saltos de línea también ocupan bytes.

4 Dibujando

Vamos a fijarnos ahora en el siguiente ejemplo, llamado “dibujos-1.pdf”. Concretamente nos vamos a fijar en el objeto “6 0 obj” que es el que ha incluido la página y está dibujando objetos:

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
 ]
/Count 1
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
/F2 7 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 316 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
1 0.5 0 rg 1 0.5 0 RG
 100 742 m 200 642 l S
0.5 0.5 0.5 rg 0.0 0.5 0.0 RG
5 w
20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S
BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET
BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
ET
endstream
endobj
7 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F2
/BaseFont /Helvetica-Bold-Oblique
/Encoding /WinAnsiEncoding
>>
endobj
xref
0 8
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000180 00000 n
0000000287 00000 n
0000000426 00000 n
0000000792 00000 n
trailer
<< /Size 8
/Root 1 0 R
>>
startxref
912
%%EOF

Este PDF dibuja la siguiente composición.

Vamos a analizar el objeto “6 0 obj” y concretamente el contenido de su stream que es el que realiza el dibujo:

6 0 obj
<< /Length 316 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
1 0.5 0 rg 1 0.5 0 RG
 100 742 m 200 642 l S
0.5 0.5 0.5 rg 0.0 0.5 0.0 RG
5 w
20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S
BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET
BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
ET
endstream
endobj

Dentro del stream nos encontramos los siguientes comandos que pasamos a analizar:

  • 0.0 0.0 0.0 rg 0.0 0.0 0.0 RG

rg sirve para seleccionar el color de relleno de las figuras y RG el color de la línea que dibuja el borde de la figura. Está en formato RGB de forma que el primer número indica el nivel de rojo, el segundo de verde y el tercero de azul. Cada color se expresa con un número de 0 a 1. Así “0 0 0 rg” indica que se va a rellenar de color negro, “1 0 0 rg” de color rojo y “0.3 0.3 0.3 rg” de un color gris oscuro.

  • 1 w

Ancho de línea en puntos. En este se ha seleccionado un ancho de línea de 1 punto.

  • 1 0.5 0 rg 1 0.5 0 RG

Esta línea vuelve a cambiar el color a naranja tanto en el relleno como en las líneas.

  • 100 742 m 200 642 l S

Estos comandos sirven para dibujar una línea recta o un conjunto de líneas rectas. Con “100 742 m” le estamos indicando que la línea va a partir de la posición (100,742), el origen de coordenadas se coloca en la esquina inferior izquierda del papel.

El comando “100 742 m” sólo va a colocar el primer punto de la línea, pero no va a dibujar nada. Con el siguiente comando “200 642 l” le vamos a indicar que dibuje una línea desde la posición anterior a la posición (200,642).

Es decir, el comando “m” coloca el primer punto y el comando “l” dibuja las líneas. Se pueden encadenar varios comandos “l” que irán construyendo una poli-línea. Como se ve en:

20 822 m 40 822 l 30 792 l h S
70 822 m 90 822 l 80 792 l h f
120 822 m 140 822 l 130 792 l  S

Si nos fijamos, vemos que tienen letras al final (h, S, f) cuyo significado es el siguiente:

  • h: Significa que se va a cerrar el línea uniendo el último punto dibujando con el primero.

  • f: Indica que se va a dibujar una figura rellena. Por ejemplo, si dibujamos un triángulo, este triángulo se va rellenar con el color indicado por “rg”.

  • S: Indica que se van a dibujar las líneas que se definen. El color de la línea viene dado por el comando “RG”. Podríamos rellenar una figura pero no dibujar las líneas de los bordes.

  • BT 100 642 Td /F2 12 Tf (Hola mundo)Tj
    ET

Todo los que va desde “BT” hasta “ET” indica que se va a dibujar un texto. En este caso se usará “Td” para colocar la posición del texto. “100 642 Td” coloca el texto en la posición (100,642).

“Tf” se usa para indicar el tipo de letra que previamente se habrá definido en otro objeto. El objeto que define la página tiene que hacer referencia a todos los tipos de letra que se van a usar en la página (ver el objeto “5 0 obj”). Así “/F2 12 Tf” indica que se va a usar el tipo de letra “/F2” con tamaño 12.

“Tj” dibuja el texto. “(Hola mundo)Tj” indica que el texto que se tiene que escribir es “Hola mundo”.

Si sólo se va a dibujar una línea de texto con “Tj” nos vale, pero si se van a dibujar más líneas a continuación, se usa “TD” para indicar la posición relativa respecto de la línea anterior a la que se debe dibujar la siguiente línea. Debemos recordar que si queremos dibujar una línea debajo otra deberemos poner valores negativos. Así el siguiente texto dibujará dos líneas de texto con tipografía “/F1” tamaño 10 en la posición (100,742):

BT 100 742 Td /F1 10 Tf (Hola mundo)Tj
0 -10 TD (Adios mundo)Tj
ET

Como vemos la segunda línea está a una distancia 10 hacia abajo de la primera, “0 -10 TD” indica que el desplazamiento es (0,-10).

Existen una serie de caracteres de escape. Por ejemplo, si queremos escribir un paréntesis veremos que nos dará error pues lo confunde con el paréntesis de cierre del comando “Tj”. Para ello escribiremos:

\( para el símbolo (

\) para el símbolo )

\\ para el símbolo \

En la página 224, apartado 4.4 y del manual:

http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/pdf_reference_1-7.pdf

Se pueden encontrar otras formas de dibujo como pueden ser las curvas.

5 Transformaciones

Los dibujos que se hagan se pueden transformar haciendo deformaciones, ampliaciones, reducciones,…

Se usarán matrices para realizar dichas transformaciones. Concretamente serán las matrices que tengan la forma:

a b 0
c d 0
e f 1

Claro que representar una matriz de esta forma es muy complejo a la hora de hacerlo con un texto plano, por lo que los elementos de la matriz se escribirán de la forma:

a b c d e f

Así para hacer una traslación se usará la matriz:

1 0 0 1 x y

donde x e y será la distancia que se va a trasladar.

Para una ampliación o reducción se usará:

x 0 0 y 0 0

donde x e y son los factores que se van a ampliar en el eje x y en el eje y.

Para una rotación se usará:

cos(φ) sin(φ) -sin(φ) cos(φ) x y

Donde φ es el ángulo que se va a girar y x e y son las coordenadas el origen.

Antes de hacer una transformación es necesario guardar el estado, se hace con el comando “q”, y al finalizar de realizar la transformación recuperar el estado anterior, se hace con el comando “Q”.

Se usará el comando “cm” para indicar la matriz de transformación que se va a emplear.

Por ejemplo, para dibujar un texto girado 45º:

6 0 obj
<< /Length 165 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
q
 0.7071067811865476 0.7071067811865475 -0.7071067811865475 0.7071067811865476 100 742 cm
BT 0 0 Td /F1 10 Tf (Hola mundo)Tj
ET
Q
endstream
endobj

Vemos que primero se guarde el estado con “q”. Se introduce la matriz de transformación. Hay que fijarse que se ha cambiado el origen de coordenadas, por ello el texto se dibuja en la posición (0,0), y al final aparece en la posición (100,172) que es el origen de coordenadas que se había seleccionado en la matriz. La matriz de transformación se puede apreciar que es:

0.7071067811865476 0.7071067811865475 -0.7071067811865475 0.7071067811865476 100 742 cm

que es justo la que se ha descrito para un giro. En el ejemplo, “dibujos-3.pdf” se puede ver este ejemplo de rotación.

6 He abierto un PDF cualquiera y no entiendo los contenidos de un objeto con un stream

Por lo que se ha contado hasta ahora en el manual, deberíamos poder descargar un PDF cualquiera de Internet, abrirlo con nuestro editor de texto favorito y leerlo. Pero si lo hacemos, nos encontraremos con algo similar a:

4 0 obj <<
/Length 698       
/Filter /FlateDecode
>>
stream
xÚuTÛrÚ0#}ç+ôhÏÄÂ+Ë–Õ§æB&I/¡´ÓÉäÁÁ"x‚Áµ0L~¾+­!&M##‰½œ=»:#°#?ÀÒ˜')S ¸Ò1›•ƒ°s<
 Û###ô‚N¦ƒá9¤,æZ©„Mç#N¢5—R±iÎî¼qmªºXù‘ðZ?à‚ûmå#¸˜Æ8«ò0Äy¯.Fc²4#¸4ä#Èzñ{<º¡íÏÑÍäòú»?½#Œ¦ƒ?{®;#	O

Si nos fijamos, hay una serie de diferencias en este stream. El contenido del stream es ilegible para un humano. Esto es debido a que está comprimido en formato zip para reducir su tamaño. Esto se indica en “/Filter /FlateDecode”.

A parte de “/FlateDecode” el manual de referencia describe otras codificaciones que se pueden usar, como puede ser codificación en hexadecimal,…

7 Dibujo de elipses y circunferencias

En este formato no se pueden dibujar directamente circunferencias o elipses. La siguiente función en Python muestra los cálculos necesarios para dibujarlas:

def elipse(self, x, y, w, h, stroke_ok = False, fill_ok = True):
        y = self.alto - y - h / 2
        x = x - w / 2
        kappa = 0.5522848
        ox = (w / 2) * kappa
        oy = (h / 2) * kappa
        xe = x + w
        ye = y + h
        xm = x + w / 2
        ym = y + h / 2
        text = '{x0} {y0} m {x1} {y1} {x2} {y2} {x3} {y3} c '.format(x0=x, y0=ym, x1=x, y1=ym - oy, x2=xm - ox, y2=y, x3=xm, y3=y)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xm + ox, y, xe, ym - oy, xe, ym)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xe, ym + oy, xm + ox, ye, xm, ye)
        text += '{0} {1} {2} {3} {4} {5} c '.format(xm - ox, ye, x, ym + oy, x, ym)
        if stroke_ok:
            text += b" S"
        if fill_ok:
            text += b" f"
        return text

8 Ejemplo de documento con varias páginas

Este es un ejemplo de varias páginas en el que se tratan de mostrar las diversas formas de dibujar que se pueden encontrar en un PDF (“dibujo-2.pdf”):

%PDF-1.4
1 0 obj
<< /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >>
endobj
2 0 obj
<< /Type /Outlines /Count 0 >>
endobj
3 0 obj
<< /Type /Pages
/Kids [ 5 0 R
7 0 R
9 0 R
 ]
/Count 3
>>
endobj
4 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F1
/BaseFont /Helvetica
/Encoding /WinAnsiEncoding
>>
endobj
5 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 6 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
6 0 obj
<< /Length 290 >>
stream
0.0 0.0 0.0 rg 0.0 0.0 0.0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 1:)Tj
0 -10 TD (Dibujo de líneas)Tj
ET
 150 692 m 200 642 l S
0.5 0.5 0.5 rg 0.5 0.5 0.5 RG
5 w
20 622 m 40 622 l 30 592 l h S
70 622 m 90 622 l 80 592 l h f
0 0 0 rg 0 0 0 RG
1 w
100 542 m 200 542 l 200 442 l 100 442 l h S
endstream
endobj
7 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 8 0 R
/Resources <<
/Font << /F1 4 0 R
 >>
>>
>>
endobj
8 0 obj
<< /Length 495 >>
stream
0 0 0 rg 0 0 0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 2:)Tj
0 -10 TD (Dibujo de curvas)Tj
ET
250.0 542.0 m 250.0 486.77152 272.38576 442.0 300.0 442.0 c 327.61424 442.0 350.0 486.77152 350.0 542.0 c 350.0 597.22848 327.61424 642.0 300.0 642.0 c 272.38576 642.0 250.0 597.22848 250.0 542.0 c  f
350.0 442.0 m 350.0 414.38576 372.38576 392.0 400.0 392.0 c 427.61424 392.0 450.0 414.38576 450.0 442.0 c 450.0 469.61424 427.61424 492.0 400.0 492.0 c 372.38576 492.0 350.0 469.61424 350.0 442.0 c  S
endstream
endobj
9 0 obj
<< /Type /Page
/Parent 3 0 R
/MediaBox [ 0 0 595 842 ]
/Contents 10 0 R
/Resources <<
/Font << /F1 4 0 R
/F2 11 0 R
/F3 12 0 R
/F4 13 0 R
/F5 14 0 R
 >>
>>
>>
endobj
10 0 obj
<< /Length 359 >>
stream
0 0 0 rg 0 0 0 RG
1 w
BT 100 742 Td /F1 10 Tf (Página 3:)Tj
0 -10 TD (Dibujo de Texto)Tj
ET
BT 100 642 Td /F2 12 Tf (Tipo de letra Helvetica-Bold tamaño 12)Tj
ET
BT 100 592 Td /F3 10 Tf (Tipo de letra Courier tamaño 10)Tj
ET
BT 100 542 Td /F4 10 Tf (Tipo de letra Times-Bold tamaño 10)Tj
ET
BT 100 492 Td /F5 10 Tf (Tipo de letra Times-Italic tamaño 10)Tj
ET
endstream
endobj
11 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F2
/BaseFont /Helvetica-Bold
/Encoding /WinAnsiEncoding
>>
endobj
12 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F3
/BaseFont /Courier
/Encoding /WinAnsiEncoding
>>
endobj
13 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F4
/BaseFont /Times-Bold
/Encoding /WinAnsiEncoding
>>
endobj
14 0 obj
<< /Type /Font
/Subtype /Type1
/Name /F5
/BaseFont /Times-Italic
/Encoding /WinAnsiEncoding
>>
endobj
xref
0 15
0000000000 65535 f
0000000009 00000 n
0000000074 00000 n
0000000120 00000 n
0000000192 00000 n
0000000299 00000 n
0000000428 00000 n
0000000768 00000 n
0000000897 00000 n
0000001442 00000 n
0000001616 00000 n
0000002026 00000 n
0000002139 00000 n
0000002245 00000 n
0000002354 00000 n
trailer
<< /Size 15
/Root 1 0 R
>>
startxref
2465
%%EOF

Viernes 17 de junio de 2016

Marcelo Fortino

Marcelo Fortino
Fortinux

Ubuntu como entorno de programación y diseño web – PARTE V

Ubuntu como entorno de programación y diseño web - PARTE V programación web, diseño web, entorno de desarrollo, Ubuntu, front-end developer, full-stack developer, Ruby, Rails, Node, Javascript

Jueves 16 de junio de 2016

BlogDRAKE: Pequeñas novedades

Miércoles 15 de junio de 2016

José María Morales Vázquez

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

StartEncrypt, la respuesta de StartSSL a Let’s Encrypt

seguridad StartSSL, pionera en esto de dar certificados gratutitos, ha lanzado una agresiva campaña de respuesta a Let’s Encrypt ofreciéndonos su propio servicio para automatizar la instalación, gestión y renovación de certificados: StartEncrypt. Si alguien lo ha probado ya que avise y, si no, tendremos que hacerlo por aquí en breve. Que remedio 😉

NOTA: Por si mi lector no lo recuerda, hace bien poco contamos por aquí como configurar Let’s Encrypt en una web con nginx.

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: StartEncrypt, la respuesta de StartSSL a Let’s Encrypt || Hospedado en un Cloud VPS de Gigas.

Martes 31 de mayo de 2016

GUbuntu.es: El repositorio más rápido
GUbuntu.es: Bienvenido

Viernes 27 de mayo de 2016

BlogDRAKE: Instalando Oracle 11gR2 XE y Oracle SQL Developer en Mageia, usando el escritorio XFCE

Jueves 19 de mayo de 2016

Ramón Miranda

Ramón Miranda
Ramon Miranda

BTR. Diseño de Logotipo para Grupo de deportistas.

Hola a Todos! desde hace algún tiempo que vengo interesándome por el deporte a varios niveles y de ese interés nace la colaboración con el grupo BTR para el cual diseñé este logotipo. Os dejo con el resultado final y más adelante publicaré el making off que de seguro os va a sorprender

Logotipo BTR (Bike·Trail·Run) Formato Horizontal Banner y formato vertical

Y esta es la aplicación desarrollada para la camiseta.


Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Wedding Invitations Templates For Word 2016

Wedding Invitation Templates Word   Wedding Invitation Collection S8SxdIZq

Wedding Invitation Templates Word Wedding Invitation Collection

Free Wedding Invitation Websites   Wedding Invitation Collection 9G8KhxDr

Free Wedding Invitation Websites Wedding Invitation Collection

Example Of Wedding Invitation Card   Wedding Invitation Collection PoE7HUl3

Example Of Wedding Invitation Card Wedding Invitation Collection

Free Wedding Invitations Templates For Word 2016 wwwroselliacom lxwsmhfH

Free Wedding Invitations Templates For Word 2016 wwwroselliacom

wedding invitation background free download   weddingbackgroundclub 8aEESrcD

wedding invitation background free download weddingbackgroundclub

Wedding Invitation Templates Word Wedding Invitation Collection

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut x9q76JwK

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut x9q76JwK

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations

Sábado 09 de abril de 2016

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Ubuntu está en todas partes

Lleva años con nosotros, es una de las distros Linux más populares de la historia y hace poco hizo su desembarco en Windows. Hablamos de Ubuntu, cuya nueva versión estará disponible en un par de semanas y que, como el amor y los restaurantes McDonalds, está ya en todas partes.

Lo usa Netflix, Wikipedia, Dropbox, Instragram, Reddit, Snapchat y el mayor súper computador del mundo. Está en millones de PCs y servidores, en los coches de Google, y en la órbita terrestre, en la Estación Espacial Internacional.

Infografía 'Ubuntu está en todas partes'

Viernes 08 de abril de 2016

Ramón Miranda

Ramón Miranda
Ramon Miranda

Muses DVD preset Pack in bundle format for 2.9!



It is time for an update!
Recently some people asked for a bundle format so i have been working on making a bundle. If you like it, let me know..

Download here

Want to see some examples?



For newcomers i post some images and info about the set.
Here you have it.


The colors of the squares are only for differentiating the parts,  they don’t have nothing to be with the colour coding we designed for distinguishing the presets.
– Sketching:
This first part of the set covers the sketching and dry techniques phases like pencil, charcoal and hard pastel.
Usually you’d use these presets in black and white, but the advantage of the digital painting is that with only one preset you can still use all the colors you want, for instance to simulate the effect of color pencils.





– Digital:
This part of the set covers the most common presets that you need for digital painting. The classic round brushes with a good velocity in bigger sizes, smooth contour, squared… The illustration of below, for example, makes an extensive use of the squared brush for creating the structures of the mountain. After that, you will have to do a detailing finish, of course, but is a fast way for delimiting the contours.
Personally, I use these presets all the time.
– Ink & Fx:
In principle, this presets aren’t for inking comics (for that see the presets created by Timothee Giet), they are for doing studies or fast sketches. We can emulate the markers technique very easily.
– Oils & water:
I use this presets for creating the brushstrokes of wet paint, for giving the painting the look and feel of oil paint and gouache. They create expressive effects and they are fast but I don’t recommend the using them at really big sizes: you can easily saturate the resources of even a beefy computer. They use the “ascension” sensor for the color-rate.



– Blender:
This presets mix the color that is applied in the canvas. They are quite explanatory in themselves.
– Texturing:
This presets are used for fill big parts of the image with varied shapes like leaves, clouds, etc. They simulate effects that will take a lot of time painting it directly with normal round brush, saving us a lot of time that can be spent on places where we need manual detailing.


Download here

Bundle install

To install, download the file , then import it in Krita this way : Setting > Manage Ressources > Import Bundle/Resources.


License :  the brushkit itself and thumbnails is released under the WTFPL 2.0  (compatible with Public Domain and CC-0 ).
Ramón Miranda

Ramón Miranda
Ramon Miranda

Ramon Miranda Illustration. Diseño de Logotipo. Parte 2/2


Vamos a por la segunda parte de este post sobre la creación de mi logotipo.
(si no viste la primera y te apetece leer el artículo desde el inicio Aqui. http://www.ramonmiranda.com/2016/02/ramon-miranda-illustration-diseno-de.html)


  • Fase 3. De lápiz a Vectores
  • Fase 4. Tipografía
  • Fase 5. Prueba sobre soportes. 

Fase 3. De lápiz a vectores

Ahora es momento de ponerse en el ordenador teniendo una idea sólida sobre la que trabajar.
En esta fase voy a transformar lo que he hecho con el lápiz mediante un programa de vectores como inkscape, illustrator, corel draw. en esta ocasión Inkscape.
Voy a aprovechar una función que es la de trazar imágenes.  menú Path/trace Bitmap (shift+alt+b). Lo que hace es traducir cada contorno a un trazado vectorial. Como el diseño es simple y sin color se lo ponemos muy fácil. Aunque con color también puede hacer cosas muy interesantes pero eso lo dejamos para otro momento.
Trazado de imagen a vectores
No recomiendo dejar el trazado según salga de esa operación porque suele haber un exceso de nodos. Pero sí es un buen punto de partida para empezar a limpiar el trazado. ¡130 nodos son demasiados!
Nodos sin limpiar

En este caso concreto me gusta la sensación de "orgánico". Pero aun así decido probar a hacerlo puro vectorial partiendo de un cuadrado y dibujo de nodos. Se puede ver el proceso de izq a derecha. usando primitivas básicas y operaciones de unión, resta, puedo obtener rápidamente un resultado que parece más complejo. ¿pero funciona?...hmm.

Diseño Vector desde 0
No, no funciona porque he perdido la sensación de orgánico, parece algo muy frío y no me convence tanta frialdad. Tomo la decisión de desechar este camino y depurar el trazado anterior que guarda mejor la sensación orgánica del boceto.

Zonas a limpiar y resultado

Diseño limpiado de exceso de nodos.
Más tarde veré si quito algun nodo más sin perder esa sensación de "mancha" Si quito demasiados nodos se quedan las líneas planas.
Poniéndolos cara a cara este es el resultado
Orgánico vs Lineas puras

Fase 4. Tipografía

La elección de la tipografía tiene la misma importancia que el propio diseño del "logo" . Gracias a la fase de diseño en papel, ya se lo que busco en la tipografía. así que me lanzo a ello en Dafont.com. Quiero algo limpio, moderno, y con trazos muy concretos. ¿Lo encontraré? Después de ver 55 páginas de Dafont.com bajo la categoría de básico/sans serif. he seleccionado 10 que tienen licencias para poder usarlas libremente. o bajo condiciones aceptables.
10 primeras candidatas
Tras analizar cada palo, asta, altura de la x, interlineado etc... veo 5 que pasan a la siguiente fase.
Tipografías seleccionadas
Es duro dejar atrás unas fuentes tan bonitas pero hay claros indicativos de por qué no las elegí. Demasiado ángulo en su diseño,(picos en M y R) palos no redondeados, kerning que produce espácios ópticos que no me agradan, demasiado grosor, mi propio gusto o intuición...
Con las seleccionadas sigo cribando poco a poco
Proceso de selección de tipografía
Al final la elegida en el certamen "miss tipografia RM 2016 " es...
¡La Chata!
Crédito de la tipografía "la chata" para su creador. http://defharo.com/
Grácias Fernando por tan buen trabajo. Si buscais fuentes para vuestros proyectos personales o comerciales, Fernando es todo un profesional.
Información de logotipo

Y con esto ya tengo establecido todo el diseño de mi logo. Tamaños, relaciones fuentes, kerning... ¿y el color?
Color para una tinta
En el caso del color no he tenido muchos problemas porque sabía ya que iba a ser un tono cáĺido. Si a eso le sumamos el significado simbólico que le quiero dar pues ya está  os presento a #cc7722ff más conocido como ocre.

Desde el inicio de la humanidad hemos transmitido información a través de pinturas. El pigmento de la tierra es estable, duradero, y además nos ha acompañado durante todo la historia y todo lugar. Desde Egipto hasta el renacimiento y la actualidad. Ese para mí, es el color de la ilustración donde al final lo que hacemos es comunicar.

Y después de tener el color adecuado vamos a ver qué tal queda sobre fondos que ya tengo ganas de verlo en un uso real.
 Fase 5. Prueba sobre soportes
Con la tipografía ya elegida y todos los detalles definidos, me interesa ver como queda sobre diferentes soportes como por ejemplo fondos claros, fondos oscuros, y fondo de imagen. Esto me va a dar información para saber si mi diseño es versatil o me va a presentar algún problema que hasta ahora no haya visto. 
Lo primero a probar es una camiseta. Blanca y Negra.

Prueba simulación camiseta
Lo siguiente es probar con una imágen de fondo.
Prueba de logo sobre imagen


¡Y esto es todo por hoy! si te ha gustado no olvides compartir para que más personas lo vean, quizás le quites un dolor de cabeza a alguien. Comentadme lo que querais o preguntad si veis que algo no se explicó en su justa medida. 

Martes 22 de marzo de 2016

bq Aquaris M10 Ubuntu Edition, fechas confirmadas

El pasado 22 de febrero se presentó la bq Aquaris M10 Ubuntu Edition que como sabes es la  primera tablet...

La entrada bq Aquaris M10 Ubuntu Edition, fechas confirmadas aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Sábado 19 de marzo de 2016

Juanjo Amor

Juanjo Amor
DrAmor's Blog

¡Cifremos la web!

Qué es Let’s Encrypt

Es bien sabido que conviene cifrar siempre que podamos, y la web no lo es menos. De hecho, hace tiempo que Google fomenta el uso de web cifrada amenazando con penalizar aquellas que no lo estén.

El caso es que, para tener una web cifrada, tenemos dos problemas: por un lado, comprar un certificado a una entidad certificadora reconocida, y por otro, renovarlo periódicamente (lo que suele tener un coste también). Desde hace tiempo, iniciativas como CaCert, intentaron crear una autoridad certificadora libre de costes para sus usuarios y gestionada por la comunidad, de la que, pese a ser yo mismo uno de sus notarios, tengo que decir que su éxito ha sido siempre escaso, entre otras razones porque lleva ya bastantes años con nosotros y aún no es reconocida por la mayoría de los navegadores.

Por otro lado, la renovación tiene otro problema: hay que estar pendiente de ello. Para resolver ambos problemas, ha surgido una iniciativa, llamada Let’s Encrypt.

Let's Encrypt

Lo primero que vemos es que la reconocen todos los navegadores. El coste de conseguir esto debe estar cubierto por la multitud de sponsors que tiene el proyecto.

En segundo lugar, utiliza un desafío, llamado ACME, para verificar que la web que queremos cifrar es la dueña del dominio a usar (por ejemplo, https://dramor.net/). Con esta verificación, se pueden emitir sin problemas, certificados sin coste (al ser generados automáticamente), siempre que no necesitemos otras características como la validación de identidad.

Veremos que con este proyecto, se pueden conseguir certificados de sitio web de forma bastante sencilla. Por ejemplo, veamos cómo se resuelve para Nginx.

Implementación en los sitios de DrAmor.net

Antes de nada, decir que no voy a dar la configuración completa de nginx, entendiendo que el lector sabrá de lo que hablo, o podrá ayudarse de los tutoriales mencionados en este artículo.

En general, lo que veremos nos vale en cualquier Linux o Unix que pueda ejecutar git, python y nginx. Lo primero que haremos es bajarnos el repositorio de Let’s Encrypt:

$ git clone https://github.com/letsencrypt/letsencrypt

Este repositorio trae plugins para varios servidores web, pero como Nginx no está aun bien soportado, debemos usar el plugin webroot.

Hemos seguido la documentación oficial y el tutorial de Digital Ocean para hacernos una idea, aunque los pasos seguidos fueron, en primer lugar crear un fichero de configuración llamado /etc/letsencrypt/letsencrypt-dramor.net.ini:

rsa-key-size = 4096

email = Direccion-email-valida@gmail.com

webroot-map = {"dramor.net,www.dramor.net":"/var/www/dramor.net", "blog.dramor.net,www.blog.dramor.net":"/var/www/dramor_blog", "home.dramor.net":"/var/www/dramor_home"}

Por supuesto, el e-mail debe ser correcto. Lo oculto con el ánimo de evitar un poco el spam, claro. Y el webroot-map no es más que un formato json donde especifica los dominios a firmar, junto con la carpeta raíz de cada sitio, que debe incluir una subcarpeta publicada por nginx, para poder ejecutar el desafío ACME.

La carpeta a publicar en nginx se debe llamar .well-known. Por ejemplo, la podemos publicar en los sitios virtuales nginx con:

location ~ /.well-known {
    allow all;
}

Una vez configurado nginx, ya podemos generar los certificados:

$ cd letsencrypt

$ sudo ./letsencrypt-auto certonly -a webroot --renew-by-default --config /etc/letsencrypt/letsencrypt-dramor.net.ini
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/jjamor/.local/share/letsencrypt/bin/letsencrypt certonly -a webroot --renew-by-default --config /etc/letsencrypt/letsencrypt-dramor.net.ini

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/dramor.net/fullchain.pem. Your cert will
   expire on 2016-06-16. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

La primera vez creará un virtualenv de la versión de Python requerida, y actualizará algunos paquetes. Una vez generados los certificados, se instalan en: /etc/letsencrypt/live/dramor.net. Si dio algún error, debemos revisar que esté accesible .well-known en los sitios virtuales de nginx, y que los DNS del dominio deseado apunten correctamente al servidor web, entre otras cosas. Los mensajes de error siempre son lo suficientemente descriptivos como para no requerir más explicación. Por ejemplo, nos puede avisar de que algún nombre DNS del dominio a asegurar no resuelve correctamente el registro A o CNAME, o no apunta a nuestro servidor.

Usar los certificados en Nginx ya es cosa de usar las líneas de configuración de nginx similares a:

ssl_certificate /etc/letsencrypt/live/dramor.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/dramor.net/privkey.pem;

Renovación automática

Los certificados así generados tienen una vigencia de solo tres meses. Pero renovarlos consiste simplemente en volver a ejecutar el desafío ACME.

Para ello, solo hay que llamar a letsencrypt-auto con otro parámetro:

$ ./letsencrypt-auto renew

Podemos hacer un script a ejecutar periódicamente (por ejemplo, un cron semanal), que realice esta acción y a continuación ejecute un reload de nginx. De este modo, podemos olvidarnos de las renovaciones: tendrán lugar cuando hagan falta.

Conviene probar todos los scripts antes de automatizarlo con el cron. Por ejemplo, si nada más generar los certificados intentamos renovarlos:

$ ./letsencrypt-auto renew
Checking for new version...
Requesting root privileges to run letsencrypt...
   sudo /home/jjamor/.local/share/letsencrypt/bin/letsencrypt renew
Processing /etc/letsencrypt/renewal/dramor.net.conf

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/dramor.net/fullchain.pem (skipped)
No renewals were attempted.

Podemos forzar la renovación para verificar que funciona, con:

$ ./letsencrypt-auto renew --force-renewal

Por último, indicar que si vamos a hacer muchas pruebas, mejor generemos los certificados con la opción staging, para que que se generen certificados no válidos. Si hacemos muchas pruebas seguidas, alcanzaremos fácilmente el límite diario y no podremos generar más hasta el día siguiente.

Si hemos hecho todo correctamente, podremos navegar por el sitio web con cifrado; y si queremos, podemos comprobar la calidad del mismo aquí: SSLLabs. Conseguir una buena puntuación ya es cosa de seguir determinadas buenas prácticas con el servidor web, que no cubriré aquí.