Martes 26 de julio de 2016

Subir APK a Google Play automáticamente

Hoy vamos a ver como subir un APK a Google Play directamente, usando la línea de comandos, sin pasar por el navegador. Perfecto para automatizar la publicación de actualizaciones.

desarrollador-android-680x394

 

Google Play, como muchos otros servicios de Google, dispone de una API. Gracias a ella podemos interactuar con los servicios de Google directamente desde nuestro código. Para ello necesitaremos un Client ID, un Client Secret y un refresh_token. En mi entrada sobre como crear credenciales OAuth2 para Google sabras como hacerlo. Busca la API de Google Play Android Developer API y actívala. Anota el client ID, el client secret y el refresh_token. Además es necesario que entres a la consola de desarrollo de Google Play y autorices tus credenciales en Configuración -> Acceso a API

screenshot-play google com 2016-07-26 17-23-56

Ahora podemos pasar a escribir nuestro script de subida de APK. Para ello usaremos Node.js y el fantástico paquete googleapis, que se encuentra en npm.

Iniciar sesión en googleapis

Primero instala el paquete con npm.

npm install googleapis

Teniendo a mano el client ID, el client secret y el refresh_token podemos iniciar sesión.

var CLIENT_ID="";
var CLIENT_SECRET="";
var REFRESH_TOKEN="";

var fs = require("fs");
var google = require("googleapis");
var androidpublisher = google.androidpublisher("v2"); // Esta es la API que vamos a usar, AndroidPublisher v2
var OAuth2 = google.auth.OAuth2;

var auth = new OAuth2(CLIENT_ID,CLIENT_SECRET,"");
auth.setCredentials({
	refresh_token: REFRESH_TOKEN
});

auth.refreshAccessToken(function(err,tokens){
	google.options({auth: auth});
	// Ya estamos dentro
});

Crear y publicar una edición

¿Cuál es el procedimiento para subir un APK a Google Play usando la API?

  1. Crear una nueva edición
  2. Subir un APK a esa edición
  3. Asignar el APK a algún canal de distribución
  4. Guardar y publicar los cambios de la edición

Cuando creemos una edición se nos dará un ID de edición. Lo usaremos en el resto de llamadas. También cuando subamos un APK nos darán un versionCode que usaremos para asignar a uno de los canales de distribución. Google Play dispone de 4 canales de distribución:

  • alpha: Solo para los usuarios que hayas autorizado explícitamente
  • beta: Solo para los usuarios que hayas autorizado explícitamente
  • production: La versión que tienen todos los usuarios que no están registrados en alpha y beta.
  • rollout: Similar a production. Se indica un procentaje y Google se encargará de que solo el porcentaje de usuarios indicado tengan la actualización. Es ideal para probar nuevas características sin involucrar a todos tus usuarios.

Finalmente el código final del script queda así.

var CLIENT_ID="";
var CLIENT_SECRET="";
var REFRESH_TOKEN="";

var fs = require("fs");
var google = require("googleapis");
var androidpublisher = google.androidpublisher("v2");
var OAuth2 = google.auth.OAuth2;

var auth = new OAuth2(CLIENT_ID,CLIENT_SECRET,"");
auth.setCredentials({
	refresh_token: REFRESH_TOKEN
});

auth.refreshAccessToken(function(err,tokens){
	google.options({auth: auth});
	androidpublisher.edits.insert({
		packageName: "ga.yayeyo.cronoquiz.historia"
	},function(err,edit){
		console.dir(err);
		androidpublisher.edits.apks.upload({
			packageName: "ga.yayeyo.cronoquiz.historia",
			editId: edit.id,
			uploadType: "media",
			media: {
				mediaType: "application/vnd.android.package-archive",
				body: fs.createReadStream("platforms/android/build/outputs/apk/android-release.apk")
			}
		},function(err,req){
			console.dir(err);
			var versionCode = req.versionCode;
			androidpublisher.edits.tracks.update({
				packageName: "ga.yayeyo.cronoquiz.historia",
				editId: edit.id,
				track: "production",
				resource: {
					versionCodes: [versionCode]
				}
			},function(err,req){
				console.dir(err);
				androidpublisher.edits.commit({
					packageName: "ga.yayeyo.cronoquiz.historia",
					editId: edit.id
				},function(err,req){
					console.dir(err);
				});
			});
		});
	});
});

La entrada Subir APK a Google Play automáticamente aparece primero en Blog - Adrianistan.eu.

Crear credenciales OAuth2 para Google

Google dispone de muchas APIs a nuestra disposición de forma gratuita. Para poder usarla es necesario que hayamos iniciado sesión. Desde un navegador como Firefox o Chrome es muy sencillo, introducimos nuestro usuario y contraseña y ya podemos acceder a Gmail, YouTube, etc. Si queremos hacerlo desde nuestro propio programa también es posible, pero el procedimiento es distinto. Una vez hagamos esto podremos hacer lo mismo que haría un usuario, lo único que programándolo (leer los contactos, leer el correo, modificar suscripciones de YouTube, publicar en Blogger, etc).

Crea un proyecto de API

Crea un proyecto de Google y crea unos credenciales nuevos en la consola de APIs de Google.

screenshot-console developers google com 2016-07-26 14-52-43

Los credenciales pueden ser de varios tipos: clave de API, ID de OAuth y cuenta de servicio. La clave de API solo funciona en algunas API, el ID de OAuth es el sistema universal y la cuenta de servicio es para APIs de desarrollo. Creamos un ID de OAuth, pues es el método más universal.

screenshot-console developers google com 2016-07-26 16-29-16

Dependiendo de dónde opere nuestra aplicación tendremos un método u otro. El método Web requiere disponer de un servidor web y es el sistema óptimo si tenemos una aplicación Web (por ejemplo, tenemos una red social y queremos una opción de leer contactos de Gmail, usaríamos Web, pues es el procedimiento más cómodo). Si tu programa no tiene un servidor web detrás (es un programa normal de Windows, una herramienta de línea de comandos, un plugin de Firefox,…) usa Otro. Voy a explicar como funciona Otro.

screenshot-console developers google com 2016-07-26 16-30-31

Obtendremos un ID de cliente y un secreto de cliente. Guardamos esas dos claves, son muy importantes. Ahora vamos a activar las APIs. A la izquierda accedemos a Biblioteca. Buscamos la APIs que queramos usar y las activamos.

screenshot-console developers google com 2016-07-26 16-36-27

Obteniendo un access_token y un refresh_token

Para poder llamar a la API de Google es necesario tener un access_token. Los access_token caducan a las pocas horas. Para poder seguir realizando operaciones en la API pasado ese tiempo necesitamos un refresh_token. El refresh_token sirve exclusivamente para pedir un access_token nuevo. Este no caduca, pero no garantiza que siempre nos devuelva un access_token pues puede que el usuario haya decidido eliminar el permiso a nuestro programa.

El procedimiento de OAuth2 es el siguiente:

  1. Nuestra aplicación quiere autenticar al usuario en Google
  2. Nuestra aplicación genera una URL especial que debe abrir el usuario en el navegador
  3. En esa URL inicia sesión en Google el usuario, igual que si fuera a iniciar sesión en Gmail
  4. Se le informa al usuario de los permisos/APIs que nuestro programa quiere usar
  5. El usuario acepta o rechaza
  6. Si acepta ocurren varias cosas dependiendo del método. Si elegiste Otro se mostrará un código que deberás copiar en la aplicación.
  7. Ese código la aplicación lo envía a Google junto a nuestros datos de client ID y client secret.
  8. Google nos envía el access_token y el refresh_token.

Elaborar la URL de inicio de sesión

En la URL de inicio de sesión figuran varios datos.

  • El tipo de petición
  • Los permisos o APIs a las que queremos acceder (scopes)
  • Nuestro ID de cliente
  • Y la URL de redirección, que en nuestro caso, es especial.

En este ejemplo vemos una petición, con dos APIs o permisos, Chrome WebStore y Google Play.

https://accounts.google.com/o/oauth2/auth?response_type=code&scope=https://www.googleapis.com/auth/chromewebstore+https://www.googleapis.com/auth/androidpublisher&client_id=AQUI EL ID DE CLIENTE&redirect_uri=urn:ietf:wg:oauth:2.0:oob

Validar el código

El usuario nos dará el código que le haya dado Google. Nosotros ahora para obtener el access_token y el refresh_token tenemos que enviarlo de vuelta. En Curl el comando sería el siguiente:

curl "https://accounts.google.com/o/oauth2/tken" -d "client_id=AQUI EL ID DE CLIENTE&client_secret=AQUI EL CLIENT SECRET&code=ESTE ES EL CÓDIGO QUE NOS DA EL USUARIO&grant_type=authorization_code&redirect_uri=urn:ietf:wg:oauth:2.0:oob"

La respuesta, en un fichero JSON, contendrá el access_token y el refresh_token. En las librerías de APIs de Google muchas veces basta con especificar el client ID, el client secret y el refresh_token, pues se encargan de pedir automáticamente el access_token.

La entrada Crear credenciales OAuth2 para Google aparece primero en Blog - Adrianistan.eu.

Liher Sanchez

Liher Sanchez
El blog de Liher

Un saludo a todos

Hace mucho tiempo que no escribo nada en el blog, aproximadamente unos 3 meses y ya va siendo hora. Nunca había estado tanto tiempo sin escribir, tengo muchos temas pendientes y tengo que reconocer que me costaba mucho arrancarme. Me he planteado hacer muchas cosas con el blog, series de artículos, plantilla nueva, app para móvil, reorganización general, y quizás el intentar ponerme con todo me ha abrumado un poco, son demasiadas cosas. Intentare ir centrándome en una cada vez y eso voy a intentar.

En este articulo os quiero hablar un poco sobre algunos temas en general, uno de ellos es Ubuntu 16.04, por cierto ya salio Ubuntu 16.04.1, también sobre la distro que uso desde hace unos 3 o 4 meses y como me va con ella y algunas cosas mas.

Desde hace bastante tiempo he tenido varios coqueteos con varias distros Linux, aunque mi distro principal siempre era Ubuntu, eso si solo las versiones LTS, lo cual recomiendo a todos los usuarios por ser las mas estables y pulidas. Os voy a comentar un poco las distros que he probado y las ventajas e inconvenientes que encontrado ellas y con cual me he quedado como principal.

La que usaba era Ubuntu 14.04 LTS, estuve casi dos años con ella y el rendimiento era muy bueno, aunque tengo que reconocer mi portátil actual es un equipo “potente” y no tiene ningún problema con ninguna distro pero si que es cierto que se nota la diferencia de unas distros a otras. Ubuntu es una de las “pesadas”, por así decirlo, aunque no es la que mas. Su estabilidad es muy buena y ¿que voy a decir de nuevo sobre ella? pues la verdad es que poco o nada. Me parece una muy buena alternativa para los usuarios que llevamos un tiempo en Linux, es muy cómoda por el echo de que hay mucha información disponible en Internet sobre ella y es difícil no encontrar solución a casi cualquier problema que podamos tener con ella. Ademas, entre los repositorios oficiales y los PPA tenemos nuestras necesidades mas que cubiertas.

Una de las distros con las que me metí fue Debian, para mi la combinación ideal era Debian 8 con XFCE o Cinnamon, ambos entornos de escritorio son de estilo clásico tipo Gnome 2.x y con ellos me encontraba muy a gusto trabajando, me desenvolvía muy bien. Probé KDE, pero no me termina de convencer, nunca ha sido un escritorio de mi agrado, aunque no puedo negar su increíble calidad, pero cada usuario es un mundo y KDE no es para mi. Debian es una distribución muy buena, es muy estable y hace que puedas confiar plenamente en tu ordenador, pero requiere de mucho mas trabajo que otras distros y tengo que reconocer que me he vuelto un poco cómodo. No renuncio a ella, siempre tendrá hueco en mi disco duro, pero no se si algún día la convertiré en mi distro principal. Tuve muchos problemas con Cinnamon, siempre se me bloqueaba al de un par de minutos de iniciar sesión y no di con la solución, lo cual es algo curioso por la siguiente distro que probé y que os voy a comentar.

Estuve probando LMDE con Cinnamon, y tengo que reconocer que me gusto gusto mucho, reunía todo lo que quería de Debian con la ventaja de tener Cinnamon preparada para trabajar desde el principio, pero ahí es donde se manifestó una de mis manías, no usar una distro a no ser que me guste su entorno de escritorio principal. Se que es una tontería, pero pienso que si tu entorno gráfico preferido es XFCE no tiene sentido instalar Ubuntu y luego instalar XFCE, me parece mas lógico instalar Xubuntu, ya que su trabajo y desarrollo va enfocado a mejorar XFCE, pero como digo es mas una mania, aunque no me la pueda quitar, ¿que le voy a hacer? me estoy volviendo viejo ;D. Entonces deseche LMDE, eso si, me parece una distro genial.

Y llego a la distro con la que llevo funcionando 3 o 4 meses Linux Mint 17.3 Cinnamon, estoy tremendamente contento con ella, de echo se la instalo a la gente que me pide que le instale Linux por muchas razones, pero la principal es por su estabilidad y como viene preparada nada mas instalarla, apenas hay que hacerla nada, es la mejor distro que encontrado en ese aspecto y no solo he probado las que os he mencionado, he probado muchas mas, aunque estas tres son las que mas he usado con diferencia. Linux Mint Cinnamon es muy estable, es segura, no me ha dado ningún problema y vuela en mi Lenovo T420, hacen una combinación perfecta para mi. Cinnamon esta camino de convertirse en uno de los grandes, si no lo es ya, es sencillo a la vez que altamente configurable, y a los usuarios que se inician en Linux es la distribución que recomiendo. Todavía no he instalado la nueva versión, la 18, pero ya la tengo descargada y preparada en un pendrive para instalarla, posiblemente esta semana.

He hecho algún cambio en mi portátil, como ya sabéis tengo un Lenovo Thinkpad T420, es un Intel i5 de segunda generación con 8Gb de RAM y ahora mismo lo tengo con tres discos duros, el principal es un Samsung de 250 GB SSD, luego tengo una bahía con un disco duro normal de 1TB para datos y le he puesto un tercer disco duro MSata SSD de 60 Gb, en el cual voy a instalar Debian 8, Ubuntu 16.04 y posiblemente una derivada de Arch Linux, aunque todavía no se cual. Con Linux Mint 17.3 mi portátil tiene un rendimiento excelente y estoy mas que contento con el, ni siquiera me he planteado cambiarlo, espero que me dure mucho tiempo.

Os voy a dejar una captura de mi actual escritorio, estoy usando un fondo de escritorio modificado en el cual he puesto las fotos de mis hijas jugando un poco con el Gimp, tengo un tema de ventanas llamado NumixBlue que ofrece una integración perfecta con todos los programas, el tema de iconos es Vibrancy Colors, sencillo y elegante:

 

mi-escritorio

 

Como podéis ver el Conky siempre esta en mi ordenador, no puede faltar, y sigo usando el diseño que hice yo mismo personalizado, me parece indispensable, si no esta me falta algo.

Bueno, y eso es todo por ahora, quiero agradecer todos los mensajes que me habéis escrito y espero escribir mas tutos y artículos próximamente, un saludo a todos.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Plasma en las distintas distribuciones, tema del próximo podcast de KDE España

El pasado martes se inició una encuesta en la que se pedía a los simpatizantes del proyecto KDE sus preferencias temáticas para el próximo podcast. Tras una semana de votaciones ya tenemos tema “Plasma en las distintas distribuciones”, fecha definitiva (17 de julio), e invitación para la visualización en directo. Si quieres detalles, sigue leyendo.

Plasma en las distintas distribuciones, tema del próximo podcast de KDE España


El pasado martes 19 de julio, en la cuenta de KDE España en Twitter (@KDE_Espana) abrimos una encuesta para decidir cual sería el tema del próximo video podcast. Las opciones eran 3: KDE Neon y otras Distros, Flatpak y Snappy y Qt y KDE.

Tras una semana de votaciones ya tenemos los resultados definitivos:

Plasma en las distintas distribuciones

 

Como podéis ver la imagen superior el tema más votado ha sido KDE Neon y otras Distros, tema que hemos rebautizado como “Plasma en las distintas distribuciones” aunque hablaremos de lo mismo.

Así que el próximo 27 de julio a las 18:00 a escucharnos (y vernos) en directo hablar sobre como se relaciona el escritorio Plasma con un buen número de distribuciones GNU/Linux y, por supuesto, del estado actual del proyecto KDE Neon.

Solo me queda invitaros al evento, que si no hay problemas técnicos, realizaremos utilizando los servicios de Hangout de Google+ y contestaremos, si podemos, vuestras preguntas en directo.

¡Os esperamos el 27 de julio a las 18:00!

Los podcast de KDE España

Ayúdanos a decidir el temaEn un afán de acercarnos más a todos los simpatizantes de KDE hace un tiempo que empezamos a realizar podcast. En ellos varios miembros de la Comunidad KDE de España nos reunimos para hablar un poco de los diversos proyectos.

Hemos hablado de muchos temas como por ejemplo Akademy, KDE Connect, Plasma Mobile, etc.

Podéis seguirnos en  el canal de Youtube de KDE España o en Ivoox, donde estamos subiendo poco a poco los audios emitidos. Esperamos que os gusten.

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

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.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Camisetas para Akademy 2016 de Berlín

Como ya hemos comentado en el blog, este año  Akademy 2016 se celebrará en Berlín, Alemania. A la espera del programa es el momento de ir comentando algunos detalles se van generando alrededor del evento, como que ya tenemos los bocetos de las Camisetas para Akademy 2016 de Berlín. Si te gustan, no dudes en reservarlas.

Camisetas para Akademy 2016 de Berlín

akademy2016-tshirt-sleeveDel 2 al 8 de septiembre la Comunidad KDE va a celebrar su gran evento internacional en Berlín, Alemania. Es esta ocasión me va a resultar imposible asistir por dos razones: distancia y fechas (septiembre es un mes horrible para los docentes como yo).

Recordenamos que esta Akademy 2016 será muy especial ya que en ella se celebrarán los 20 años del Proyecto KDE. Además, hay que destacar que el evento formará parte de la QtCon ( unión de evento de Qt, FSFE, VideoLAN, KDAB y, por supuesto, la Akademy de KDE.) en Berlin a partir del 2 de septiembre, con 3 días de conferencias compartidas y seguidas de 4 días de Bird of a Feather (BoF) y  sesiones de código.

QtConInfo_v4_wee

Hoy me gustaría comentar que  ya tenemos el boceto de la  camiseta oficial de Akademy 2016, que este año viene con la posibilidad de adquirir una sudadera con capucha. Ambas piezas se pueden reservar a un precio reducido de 18€ (el precio de venta en el evento será de unos 20€) y de 35€ (el precio de venta en el evento será de unos 40€) . El hecho de hacer la pre-reserva es para poder ajustar el numero y tallas de las camisetas y que sobren las mínimas posibles.

Camisetas para Akademy 2016

Boceto de Jens para las camisetas de Akademy 2016

akademy2016-hoodie

Boceto de Jens para las sudaderas de Akademy 2016

El diseño de esta año ha sido realizado por  Jens Reuterberg,  miembro muy activo del KVDG (KDE Visual Design Group) y ha sido inspirado en el famoso Trabant, coche típico de Berlín.

Es una buena oportunidad para asegurarte que te llevarás la camiseta de tu talla, cuyas medidas y modelos se pueden ver en la página oficial Akademy. Se pueden realizar pedidos hasta el 27 de julio, así que no os despistéis. Una vez comprada se puede pagar y recoger durante la conferencia.

 

Más información: Akademy 2016 | Camiseta de Akademy 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo localizar ese script en PHP que no para de enviar spam…

photo-1424296308064-1eead03d1ad9

Si administras un servidor en el que hay varias webs alojadas, tal vez te hayas encontrado alguna vez con envíos de correos indiscriminados en el servidor. O tal vez, tu proveedor de hosting te haya avisado de actividad maliciosa o ilegal por tu parte. Muchas veces se trata de un script malicioso que se ha instalado en el servidor que utiliza la función mail() de PHP, que a su vez llama al programa sendmail del sistema para el envío masivo de correos electrónicos.

Posibles causas de la infección

Puede ser porque:

  • No nos hemos dado cuenta y nos hemos descargado una aplicación con malware.
  • Una aplicación de nuestro servidor es vulnerable y alguien con malas intenciones ha podido subir un archivo en el sistema, tanto a través de un script como por FTP o utilizando cualquier otra técnica.
  • Alguna de las aplicaciones de nuestro servidor ha sido vulnerable y el código malicioso se ha propagado a todos los directorios visibles.

Lo bueno es que, si el script es accesible por web, los privilegios con los que se ejecutará el código malicioso serán los que tenga el usuario del servidor web (www-data, por ejemplo), por lo que si nuestro servidor está bien configurado, dicho programa no podrá acceder a sitios a los que el usuario del servidor web no pueda, y eso es bueno. Al menos, no podrá acceder fácilmente a ciertas contraseñas, archivos de sistema, incluso propagarse por scripts de otros usuarios.

Puede hacer muchas más causas, el caso es que el código malicioso suele estar cifrado, y el archivo se descifra siempre que se ejecuta, como esto que pongo a continuación (hay muchos scripts como este, más o menos dañinos, pero la forma suele ser parecida):
Screenshot 17-07-2016-210706

Casi siempre, el único cometido del script es propagarse por el servidor y enviar correo basura desde la máquina actual.

Repercusiones de todo esto

Bueno, no está bien que alguien coja nuestro ordenador para sus fines y si utilizan nuestro servidor para enviar correo, normalmente notaremos:

  • Menor rendimiento en el servidor (tanto CPU como ancho de banda)
  • Los archivos de log crecerán mucho
  • En ocasiones recibiremos mucho más correo no deseado de lo normal
  • Puede que nuestro proveedor de hosting contacte con nosotros en todo amenazante (por si somos nosotros los que lo causamos)
  • Si tenemos un servidor de correo legítimo en dicha máquina, los mensajes que se manden desde ahí poco a poco serán detectados como no deseados por los demás servidores.

Lo malo, es que si hay varias decenas de aplicaciones web en el servidor, es muy difícil detectar dónde está el problema (porque se pueden llevar a enviar varios mails por segundo y afectar a todas las webs de un servidor).

Medidas que podemos tomar: Desactivar el correo saliente

Si utilizamos postfix, podemos tomar una medida preventiva, para evitar que sigamos haciendo daño enviando correo no deseado. También es verdad que con esto evitaremos que se envíen correos originarios del servidor web por lo que tal vez otras webs también se vean afectadas por esto. Aunque es una buena medida para evitar un mal mayor.
Para este ejemplo el usuario del servidor web es www-data. Debemos editar /etc/postfix/main.cf y añadir al final la siguiente línea:

authorized_submit_users = !www-data, static:all

Tras esto, reiniciamos el servidor postfix. Al menos evitamos que se sigan enviando correos. Ahora deberíamos ver que Apache en su log de errores tendrá muchos errores como este:

sendmail: fatal: User www-data(33) is not allowed to submit mail

Medidas que podemos tomar: pasar un antivirus

Si disponemos de él, nunca está de más pasar un antivirus por nuestro servidor, ya que son capaces de detectar varios tipos de amenazas, incluso scripts maliciosos, aunque otras veces esto no tiene ningún efecto. Yo he probado con clamav, es importante tenerlo actualizado. Fue capaz de detectar muchos de los scripts maliciosos que había alojadas, aunque no todos.

$ clamscan -r –quiet /ruta/a/explorar/

Si no dice nada, no hay nada, cuando se queja es cuando encuentra cosas.

Medidas que podemos tomar: localizar el script malicioso

Para ello, debemos editar el archivo php.ini que utilice nuestro servidor (depende de si estamos utilizando módulo de Apache, CGI, FPM…), suelen estar en /etc/php/ , /etc/php5/ o rutas similares.
Ahí, podemos añadir al final unas líneas, o también buscar y modificar la configuración:

mail.add_x_header = On
mail.log = /tmp/phpmail.log

Con mail_add_x_header, el correo añadirá una línea X-PHP-Originating-Script en el que se indica qué script es el culpable. Y con mail.log escribimos un informe de todos los correos enviados por PHP. Este los podríamos ponerlo en /var/logs/ aunque tal vez el servidor web no tenga permiso para escribir ahí, por lo que podemos optar por crear un directorio en el que sí tenga permisos, o directamente ir a /tmp/ puesto que es una solución temporal.

Con esto, PHP generará un mensaje como este cada vez que se vaya a enviar un mensaje:

[24-Jul-2016 21:16:49 Europe/Berlin] mail() on [/ruta/del/script/nodeseado.php:2]: To: uncorreo@unserver.com — Headers:

Y con esta información, ya tenemos lo necesario para detectar dónde está el malo (o los malos). Sólo nos queda tomar las medidas pertinentes, borrar los scripts, aplicar cuarentena, etc.

Foto principal: Nicolai Berntsen

The post Cómo localizar ese script en PHP que no para de enviar spam… appeared first on Poesía Binaria.

Asociación LiGNUx: Dia es una aplicación de diagramas desarrollada por Gnome

Domingo 24 de julio de 2016

David González

David González
Blog Bitix

Las cabeceras de cache del protocolo HTTP

Establecer directivas de cacheo en los recursos devueltos en una página o aplicación web tiene las ventajas de reducir el número de peticiones que llegan al servidor mejorando la latencia y el rendimiento pudiendo atender a más usuarios y mejora los tiempos de carga de las páginas. Usando varias directivas de cacheo la aplicación es capaz de determinar cómo quiere que el contenido devuelto o los recursos sean cacheados por los clientes o servidores de cache intermedios.

HTML

Cachear aquella información que es costosa de generar y es muy solicitada consigue por un lado evitar que el servidor sea capaz de atender todo el tráfico reduciendo la cantidad de capacidad necesaria del servidor y por otro lado consigue que la información sea devuelta en menor tiempo. Para aquella información que no necesite estar completamente actualizada o que no cambia cada poco tiempo es candidata a cachearla en caso necesario. La cache se puede realizar en los navegadores guardando estos recursos como imágenes y hojas de estilos que consiguen reducir el número de peticiones al servidor y mostrando la página más rápidamente al usuario. La cache también se puede hacer en el lado del servidor usando soluciones específicas como Varnish, memcached o para los casos más habituales que serán la mayoría las funcionalidades incorporadas en el servidor web como en el caso de Nginx.

El cacheo o almacenamiento temporal de datos puede hacerse a diferentes niveles sin ser exclusivos y de diferentes tipos de información. En la base de datos, en la aplicación, a nivel de página, con servidor intermedio o en el cliente.

Según la cantidad de tiempo de expiración que establezcamos como cache para el contenido conseguiremos variar el número de aciertos en la cache, aumentando el tiempo unos pocos segundos el tiempo que almacenamos en la cache el contenido conseguimos aumentar el porcentaje de aciertos en mayor medida. Con un tiempo de cache de un minuto ya se consiguen porcentajes elevados de aciertos según el número de peticiones realizadas en ese periodo de tiempo.

Petición con acierto y fallo en la cache

En el protocolo HTTP 1.1 se definieron tres mecanismos para las caches:

  • Validez: permite usar un recurso sin hacer ninguna comprobación con el servidor ni para revalidarlo. Por ejemplo, la cabecera Expires indica en que momento el recurso puede haberse quedado obsoleto y se debería revalidar. La cabecera Cache-Control: max-age indica durante cuanto tiempo el recurso puede considerarse válido. Esto evita hacer peticiones al servidor si los recursos se consideran válidos.
  • Validación: una vez que un recurso se considera que puede ser obsoleto se debería comprobar haciendo una petición al servidor para conocer si sigue siendo válido y si no lo es obtener una nueva versión. Usando las cabeceras If-Modified-Since o Etag puede comprobarse si el recurso ha sido modificado con posterioridad a una fecha o ha variado. Se ha de hacer una petición para comprobar la validez del recurso pero los casos que sigan siendo válidos no hará falta descargarlos de nuevo. Si el recurso sigue siendo válido el servidor responde con el código de estado 304 y sin el contenido en la respuesta.
  • Invalidación: las peticiones que usen los métodos PUT, POST y DELETE pueden invalidar recursos ya que modifican el estado del servidor.

El servidor especifica como quiere que el contenido o recursos que devuelve sean cacheados a través de varias directivas del protocolo HTTP, establecidas como cabeceras en la respuesta cuando se solicita el contenido o recurso. Algunas cabeceras realizan funciones similares habiendo cierto solapamiento de funcionalidad. Son las siguientes:

  • Cache-Control: private | public, no-cache, no-store, max-age, s-maxage, must-revalidate, no-transform, proxy-revalidate
    • El valor private indica que el recurso es privado para el usuario y no debería ser cacheado. Esto no hace el recurso más seguro ya que la información no se transmite cifrada para ello hay que usar un protocolo seguro con TLS/SSL.
    • no-cache el recurso no debería ser cacheado.
    • no-store el recurso no debería ser almacenado.
    • max-age normalmente se ha usado la directiva Expires pero esta permite establecer el máximo tiempo especificado en segundos a cachear un recurso.
    • s-maxage similar a max-age pero para las caches intermedias entre el cliente y el servidor.
    • must-revalidate cuando un recurso se queda obsoleto no se debe usar sin antes validar contra el servidor si sigue siendo válido.
    • no-transform indica que el contenido original no debe ser modificado, por ejemplo, modificando el recurso para optimizarlo si por ejemplo se trata de una imagen.
    • proxy-revalidate lo mismo que must-revalidate pero para las caches intermedias.
  • If-Modified-Since: si el recurso solicitado con su variante no ha sido modificado con posterioridad a una fecha se devolverá un código de estado 304 sin el contenido.
  • Expires: es una marca de tiempo que indica cuando el recurso expira, dado que se basa en el tiempo no es muy precisa ya que los relojes de cada ordenador no están perfectamente sincronizados y hay variaciones incluso de minutos. Preferiblemente es mejor usar Etag o max-age.
  • Etag: entity-tag o etag es un código hash único del contenido que permite conocer si el recurso ha cambiado. Si el recurso no ha cambiado no hace falta devolver el recurso, si ha cambiado se devuelve en la misma petición. Al no depender de una marca de tiempo como Expires o max-age es más fiable.
  • Vary: indica que el recurso varía según alguna cabecera proporcionada por el cliente como por ejemplo User-Agent o Accept-Encoding.
  • Pragma: esta es una directiva antigua que indicada como pragma: no-cache, se interpreta como cache-control: no-cache.
Asociación LiGNUx: Vamos a instalar LibreBoot en una ThinkPad

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 […]
Baltasar Ortega

Baltasar Ortega
KDE Blog

Lanzada la beta de KDE Aplicaciones 16.08

Nos acercamos a agosto mes que el equipo de desarrollo de KDE ha marcado para el lanzamiento de su gran revisión de sus aplicaciones. Pero antes de este gran actualización siempre hay que probar. Por eso me complace anunciar que ha sido lanzada la beta de KDE Aplicaciones 16.08. ¡Esto no para! ¡KDE Rocks!

Lanzada la beta de KDE Aplicaciones 16.08

 

El pasado 22 de julio el equipo de desarrollo de la Comunidad KDE anunció la beta de KDE Aplicaciones 16.08, otro paso más en la evolución de su ecosistema de programas que tiene dos objetivos fundamentales: seguir mejorando las aplicaciones KDE y continuar la migración de más aplicaciones al entorno de trabajo Qt5/KF5.

Tras un trabajo que se inició el mismo día que se lanzó KDE Aplicaciones 16.04, los desarrolladores han estado trabajando de forma silenciosa pero coordinada y constante preparando las nuevas funcionalidades que nos esperan en agosto

Ahora es el momento de congelar las funcionalidades y las dependencias, y que el equipo de desarrollo (y todas aquellas personas que así lo deseen) se centren en corregir errores y pulir las aplicaciones.

Más información: KDE.org

Pruébalo y reporta errores

Lanzada la beta de KDE Aplicaciones 16.08Todas las tareas dentro del mundo del Software Libre son importantes: desarrollar, traducir, empaquetar, diseñar, promocionar, etc. Pero hay una que se suele pasar por alto y de la que solo nos acordamos cuando las cosas no nos funcionan como debería: buscar errores.

Desde el blog te animo a que tú seas una de las personas responsables del éxito del nuevo lanzamiento de las aplicaciones de KDE. Para ello debes participar en la tarea de buscar y reportar errores, algo básico para que los desarrolladores los solucionen para que el despegue de KDE Aplicaciones 16.04 esté bien pulido. Debéis pensar que en muchas ocasiones los errores existen porque no le han aparecido al grupo de desarrolladores ya que no se han dado las circunstancias para que lo hagan.

Para ello debes instalarte esta beta y comunicar los errores que salgan en bugs.kde.org, tal y como expliqué en su día en esta entrada del blog.

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.

David González

David González
Blog Bitix

Jugar al clásico de estrategia de tablero Go en GNU/Linux

En esta serie de artículos sobre juegos vamos a ver que en GNU/Linux también hay juegos a los que podemos jugar en nuestra plataforma preferida. Otro de ellos es el clásico de estrategia Go.

Linux
GNU

Otro de los juegos clásicos junto con el ajedrez también para dos personas que requiere pensar y evaluar gran cantidad de posibles movimientos es el juego de origen chino Go. En GNU/Linux e instalado el paquete gnugo podremos jugar a este antiguo juego de estrategia tan o más complicado que el propio ajedrez por las diferentes estrategias que se pueden desarrollar.

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

Dado que en esta versión para computadora el juego Go se basa en modo texto podremos jugarlo en cualquier sistema GNU/Linux dados su bajos requerimientos que son despreciables para cualquier computadora actual, incluso para una Raspberry Pi u otros sistemas como la familia BSD e incluso Minix.

El tablero clásico se compone de una matriz de 19 por 19 en el que en las intersecciones se irán colocando las fichas de forma alternativa entre cada jugador tratando de capturar las fichas del oponente rodeándolas con las que nosotros pongamos o de dominar la mayor cantidad del tablero. Cuando se da el juego por terminado se realiza el cálculo del marcador según el territorio dominado por las fichas y las piezas capturadas del oponente en el transcurso del mismo.

En el juego de computadora el siguiente movimiento se hace introduciendo la coordenada del tablero donde queremos colocar la siguiente piedra que se compone de una letra para la coordenada horizontal y un número para la coordenada vertical.

Tablero tradicional de juego y tablero de Gnugo

En la wikipedia está documentado de forma bastante extensa las reglas del juego Go, las diferentes formas de calcular el marcador al final del juego y las tácticas y estrategias para jugar de la forma más efectiva que podamos.

Como una partida puede durar una buena cantidad de tiempo podemos salvar una partida a medias y cargarla de nuevo con los siguientes comandos:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/8c078a5ff56706bdc066311218935b76/raw/save-commands.txt">save-commands.txt</pre></a></noscript>

Con el comando help obtendremos una lista completa de los comandos a nuestra disposición como volver un movimiento hacia atrás si nos hemos equivocado al introducir el siguiente movimiento.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/8c078a5ff56706bdc066311218935b76/raw/help.out">help.out</pre></a></noscript>

En Amazon hay algunos libros como El Go, un juego oriental milenario y GO para principiantes, en la librería libre también hay algunos como Manual del Juego del Go y GO: Utilizando las 36 estrategias chinas.

Viernes 22 de julio de 2016

MiniTutorial para Novatos - Primeros pasos en Pokémon Go

Bien, ya estoy dentro de Pokémon GO ¿Ahora qué hago? No te preocupes, si no sabes qué hacer o si estás perdido, muchos también lo estuvimos al jugar por primera vez, por lo que hoy te traemos los primeros pasos en Pokémon Go. Configurar las opciones/ajustes y el modo de ahorro de batería Una vez que instalemos Pokémon GO, debemos proceder a realizar unos ajustes, ya que estaremos en la calle

Jueves 21 de julio de 2016

LyX: sub- y superíndices en modo texto

En modo matemático es fácil: el guión bajo para para subíndices, el acento circunflejo para los superíndices y a otra cosa. Ahora bien, tener sub- y superíndices en modo texto también es necesario[citation needed], ¿cómo los logramos? Antes de seguir tenemos que distinguir entre sub- y superíndices reales y simulados. Los sub- y superíndices reales […]

Miércoles 20 de julio de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

¿Cómo filtrar llamadas molestas? Esas que destrozan tus mejores momentos.

Sinceramente, estoy harto del acoso telefónico que recibo a diario por parte de las contact center ofertando todo tipo de promociones. Y parece que va por épocas. Hay meses que cero llamadas y hay días que recibo una media de 4 llamadas ofertando seguros, créditos, ofertas telefónicas… etc.

Ya no sólo lo molesto que puede ser, es también el inmenso tiempo que suele perderse y ya conocemos el dicho “el tiempo es oro”. Por supuesto no me considero la persona más ocupada del mundo, ni José María Álvarez-Pallete, presidente de la telefónica, ni juez, ministro o diputado, ni Fernando Pons jugándome 35 millones durante el campeonato del mundo de póker ¿Te imaginas el desastre de una llamada inoportuna en un momento de máxima concentración? Ni en “Pasapalabra”.  Mejor apagar el móvil.

Y es que estar de vacaciones, en mitad del jet-lag y de solo haber dormido 5 horas… que suene el teléfono justo en ese momento en donde estás cumpliendo tu sueño del año y que sea para venderte algo… es de un grrr en donde todo puede suceder. ¿no?

Volviendo al tema. Últimamente estoy probando algunas soluciones para mi móvil y por el momento “Deberería responder?” de Mister Group me parece una de las mejores propuestas para evitar las molestas llamadas comerciales.

Se basa en un principio de confianza en donde los usuarios van engrosando sus valoraciones en una base de datos. De esta forma se mantiene un registro fiable que se actualiza a diario. Así al entrar una llamada de número desconocido aparece un aviso; en verde para una llamada segura y rojo para aquellas que resultan molestas. Su punto fuerte es que además puedes crear una lista personal y colgar la llamada inmediatamente.

La aplicación es completamente gratuita y por el momento me ha ahorrado mucho tiempo y molestia.

Puedes descargar desde el siguiente enlace.

La entrada ¿Cómo filtrar llamadas molestas? Esas que destrozan tus mejores momentos. aparece primero en Ubuntizando.com.

Miguel Parada

Miguel Parada
Ubuntizando.com

Una mirada al futuro de la Hiperrealidad

Es increíble el impacto que el nuevo Pokemon Go está teniendo en nuestra sociedad. No solo es el juego de moda que todos los chavales están jugando, también es el desembarco de la realidad aumentada en nuestras vidas. Si bien es cierto que ya estaba ahí desde mucho tiempo atrás es ahora con el juego de Nintendo que parece cierta la frase “llegar para quedarse”.

Este futuro inmediato que nos espera despierta muchas preguntas. ¿Cómo será? ¿Afectará nuestras vidas? El realizador, diseñador y artista Keiichi Matsuda, intenta responder a estas preguntas a través de un corto de seis minutos totalmente financiado a través de Kickstarter. Hiperrealidad se trata de una mirada satírica y provocadora de lo digital nos rodea como una superposición de nuestra realidad. Simplemente genial.

La entrada Una mirada al futuro de la Hiperrealidad aparece primero en Ubuntizando.com.

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.

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo extraer ruta, nombre de fichero y extensión en Bash de forma nativa para nuestros scripts

7959831794_e5699df68b_k
Bash tiene infinidad de opciones, y en los últimos años se ha extendido muchísimo y nos permite hacer cosas muy chulas. Aunque un sistema con tantas opciones como este, es también un poco lioso y difícil de aprender. Por eso en ocasiones viene bien una chuleta para realizar operaciones sencillas que pueden llegar a ser un poco rebuscadas como obtener el nombre de un fichero y su extensión.

Bash, al ser un intérprete de comandos de consola, una de sus principales funciones es trabajar con archivos y cuando queremos utilizar archivos, tenemos que jugar con sus posibles nombres, para ello, deberíamos poder extraer fácilmente la ruta de un archivo, su nombre y separarlo de la extensión. Por ejemplo, si queremos transformar varios archivos de un directorio de jpg a png, o hacer un script que trate de forma los archivos de imagen y de otra los vídeos, o incluso contar cuántos archivos tienen qué extensión…

Para ello, y a modo de autochuleta también, vamos a plantear varios ejemplos en los que se utilizan los modificadores # y % de expansión de parámetros en Bash:

1
2
3
4
5
6
7
#!/bin/bash
FICHERO="archivo.txt"
NOMBRE="${FICHERO%.*}"
EXTENSION="${FICHERO##*.}"

echo $NOMBRE
echo $EXTENSION

Si ejecutamos esto veremos que primero se mostrará el nombre (archivo) y luego la extensión (txt), aunque, esto deberíamos complicarlo un poco más, y plantearnos preguntas para verificar que funciona en todos los casos, por ejemplo, ¿qué pasaría si el archivo no tiene extensión? En este caso, devolvería el mismo nombre del archivo, y eso puede darnos problemas, para solucionarlo, plantearemos EXTENSION de la siguiente forma:

1
EXTENSION=$([[ "$FICHERO" = *.* ]] && echo "${FICHERO##*.}")

Ahora bien, ¿qué pasaría si nos pasan un archivo con doble extensión? Como “archivo.tar.bz2″, la variable NOMBRE contendría (archivo.tar) y EXTENSION contendría (bz2). Esto puede ser útil en ciertas ocasiones, por ejemplo, podríamos recorrer todas las posibles extensiones del archivo:

1
2
3
4
5
6
7
8
9
10
11
FICHERO="archivo.tar.bz2"
NOMBRE="${FICHERO%.*}"
EXTENSION="${FICHERO##*.}"

echo $EXTENSION

while [ -n "$EXTENSION" ]; do
   FICHERO="${FICHERO%.*}";
   EXTENSION=$([[ "$FICHERO" = *.* ]] && echo "${FICHERO##*.}");
   echo $EXTENSION;
done

Pero si queremos extraer todas las extensiones juntas del archivo, deberíamos hacer:

1
EXTENSION=$([[ "$FICHERO" = *.* ]] && echo "${FICHERO#*.}")

Y si queremos el nombre sin ninguna extensión:

1
NOMBRE="${FICHERO%%.*}"

Lo que variamos es el número de % y de # que colocamos. En este caso, si utilizamos # estaremos eliminando el prefijo de un patrón, es decir, la parte a la izquierda, y como eliminamos *. queremos decir que eliminamos todo lo que hay delante del punto, ahora si usamos un sólo # estaremos eliminando lo menor posible y si usamos dos, lo mayor posible. De esta forma ${FICHERO#*.} al eliminar poco, nos devuelve todas las extensiones y ${FICHERO#*.}, al encontrar el patrón más grande posible, muestra sólo la última extensión.

De esta forma, nos podemos crear nuestras propias funciones:

1
2
3
4
5
6
7
8
9
10
11
function my_filename()
{
  local FILE="$1"
  [[ "$2" = "1" ]] && echo "${FILE%.*}" || echo "${FILE%%.*}"
}

function my_extension()
{
  local FILE="$1"
  [[ "$FILE" = *.* ]] && ( [[ "$2" = "1" ]] && echo "${FILE#*.}" || echo "${FILE##*.}")
}

Así si hacemos varias llamadas:

$ my_filename archivo
archivo
$ my_filename archivo.tar
archivo
$ my_filename archivo.tar.bz2
archivo
$ my_filename archivo.tar.bz2 1
archivo.tar

$ my_extension archivo

$ my_extension archivo.tar
tar
$ my_extension archivo.tar.bz2
bz2
$ my_extension archivo.tar.bz2 1
tar.bz2

Incluyendo directorios

Si queremos que estas funciones separen también nombres de archivo de directorios tenemos varias opciones. Una de ellas es utilizar basename y dirname, que son dos comandos que muchas veces están disponibles para extraer nombres de archivos y nombres de directorios, así:

$ basename /usr/share/sane/xsane/archivo.tar.bz2
archivo.tar.bz2
$ dirname /usr/share/sane/xsane/archivo.tar.bz2
/usr/share/sane/xsane

Aunque si queremos una solución puramente hecha en Bash, y así evitar hacer llamadas externas y ganar algo de rendimiento podemos utilizar las mismas técnicas anteriores. Es más, primero, vamos a incluir rutas de archivo con las funciones anteriores, a ver qué pasa:

$ my_filename “/usr/share/sane/xsane/archivo.tar.bz2″
/usr/share/sane/xsane/archivo
$ my_extension “/usr/share/sane/xsane/archivo.tar.bz2″
bz2

En principio el nombre incluye la ruta completa, pero la extensión se comporta bien, aunque si el directorio contiene un punto también…

$ my_extension /etc/init.d/lm-sensors
d/lm-sensors

Por tanto, primero vamos a intentar eliminar las rutas, y extraer el nombre de archivo base. Esto lo podemos hacer basándonos en el patrón entre la última barra y el final del nombre, o lo que es lo mismo, eliminando desde el principio del nombre hasta la última barra:

$ echo “${FICHERO##*/}”

y para extraer la ruta solamente, podremos utilizar algo similar a la extensión:

$ $([[ “$FICHERO” = */* ]] && echo “${FICHERO%/*}”)

Esto mismo, lo podemos trasladar a las funciones, de la siguiente forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function my_filename()
{
  local FILE="$1"
  FILE="${FILE##*/}"
  [[ "$2" = "1" ]] && echo "${FILE%.*}" || echo "${FILE%%.*}"
}

function my_extension()
{
  local FILE="$1"
  FILE="${FILE##*/}"

  [[ "$FILE" = *.* ]] && ( [[ "$2" = "1" ]] && echo "${FILE#*.}" || echo "${FILE##*.}")
}

function my_dirname()
{
  local PATH="$1"

  [[ "$PATH" = */* ]] && echo "${PATH%/*}"
}

Con las que tendremos un acceso más fácil y amigable para nuestros scripts.

Foto principal: Christopher Adams

The post Cómo extraer ruta, nombre de fichero y extensión en Bash de forma nativa para nuestros scripts appeared first on Poesía Binaria.

Lunes 18 de julio de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

Ahorra batería en tu móvil con Pixoff

pixoffLos que me conocen saben que me paso el día pegado al móvil. Si no es por trabajo es por estar al tanto de las noticias que me interesan. Así que es fácil que antes de acabar el día me encuentre sin una gota de batería por eso creo que Pixoff es todo un regalo para nuestros smartphone.

Hasta el momento la mayoría de apps que he instalado y probado se limitaban a bajar la intensidad de brillo de la pantalla, cerrar tareas en segundo plano y a lo sumo, siendo root,  bajar la velocidad de nuestro procesador con tal de exprimir cada amperio de nuestra batería. Pixoff va un poco más allá, en realidad es un complemento de lo anterior, al apagar de manera selectiva pixels de nuestra pantalla de manera que, sin perder demasiada calidad, podamos arañar autonomía justo donde más energía gasta nuestro teléfono.  Eso sí, necesitamos que nuestra pantalla sea AMOLED.

Pixoff  cuenta con dos versiones, una gratuita con opciones básicas y la versión premium con la que podemos sacarle todo el potencial a esta aplicación. La primera puede ser suficiente para la mayoría de nosotros pero la opción premium, que solo cuesta 0.99€, permite cosas como crear nuestro propio patrón personalizado o desactivar nuestro fondo de escritorio cuando las cosas se ponen feas para nuestra batería.

El resultado es que al final del día contamos con algo más de autonomía y no hemos sacrificado gran cosa. Los iconos se ven algo más feos y dentados, sí, pero es el precio que debemos pagar por un poco más de batería al final del día y realmente vale la pena. 🙂

 

La entrada Ahorra batería en tu móvil con Pixoff aparece primero en Ubuntizando.com.

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo aplicar filtros de GIMP a un vídeo

photo-1464602083226-de2c1675e946

Estoy subiendo vídeos a mi canal personal de Youtube. Aunque sólo tengo algunos pequeños tutoriales, postales de navidad y cosas así. He decidido subir algunos vídeos y cortos antiguos. Aunque están grabados con una cámara analógica y en cinta magnética, lo que significa que el vídeo tiene mucha pérdida y poca calidad. En un intento por darle algo más de definición, o al menos que el visionado sea algo más agradable, pensé en un filtro de Gimp (Desenfocado Gaussiano Selectivo), y estaría muy bien poder aplicarlo a todos los fotogramas.

En principio, ya que GIMP es un programa para edición de imágenes, no puedo pasarle un vídeo completo, tendré que pasarle fotogramas sueltos para que él los trate Lo que no quería yo era perder mucho tiempo, aunque si tengo que dejar el ordenador varias noches encendido no me importa. Por otro lado, tampoco me gustaría necesitar gran cantidad de disco, como experimento, convertí un vídeo de 3 minutos a imágenes fijas y ocupó más de 2Gb, no quiero saber lo que podría pasar con un vídeo de 1h de más resolución, por lo que tendremos que gestionar el uso de disco.

Por otro lado, y como dije antes, la velocidad es lo de menos, se puede tirar varios días si es necesario. No he utilizado técnicas multi-hilo, para procesar los fotogramas, y supongo que si necesito hacerlo con muchos vídeos, tarde o temprano tendré que hacer que se puedan ejecutar varias instancias de GIMP para procesar varios fotogramas a la vez, aunque también estaría bien evitar la carga del programa una y otra vez.

Para empezar, debemos tener unas nociones de Scheme, el lenguaje utilizado por las extensiones Script-fu de Gimp. Para empezar te recomiento este post.
En el script que vamos a hacer ahora, nos centraremos en abrir la imagen, obtener un drawable (algo así como un lienzo a partir de la imagen) y salvar dicho lienzo en un archivo. Para estas operaciones he optado por utilizar el formato PNG, aunque podríamos haber utilizado lossless jpeg, tiff, o cualquier otro formato que aplique compresión de imagen sin pérdidas. Es importante esto, porque la compresión de vídeo normalmente también tiene pérdida y siempre que extraemos y volvemos a grabar se producen, por lo tanto no queremos que en la aplicación del efecto ocurran más pérdidas por otro lado.

Script para GIMP

El script que guardaremos en .gimp-2.x/scripts/ se llamara gaussblursel.scm (donde 2.x es vuestra versión de GIMP), y contendrá lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(define (gaussblursel infile outfile radius max-delta)
    (let*
        (
            (image (car (file-png-load 1 infile infile)))
            (drawable (car (gimp-image-active-drawable image)))
        )
    (plug-in-sel-gauss 1 image drawable radius max-delta)

    (file-png-save 1 image drawable outfile outfile
          1 9 0 0 0 0 0)   
            ; 1 Adam7 interlacing?
            ;   0 deflate compression factor (0-9)
            ;     0 Write bKGD chunk?
            ;       0 Write gAMMA chunk?
            ;         0 Write oFFs chunk?
            ;           0 Write tIME chunk?    ?? backwards in DB Browser
            ;             0 Write pHYS chunk?  ?? backwards in DB Browser
    )
)

Aquí abrimos, procesamos el archivo y lo salvamos, utilizamos plug-in-sel-gauss que es la función que nos proporciona el desenfoque gaussiano selectivo y es el script que ejecutaremos para cada fotograma de vídeo.

Shell script

Ahora, crearemos un shell script que extraiga fotogramas del vídeo, los procese (con el script de GIMP), y los vuelva a meter en el vídeo. Para ello, extraeremos del vídeo intervalos de un segundo (suelen ser unos 25/30 fotogramas), lo que ocupa poco espacio en disco duro. Una vez ha extraído los fotogramas, llama varias veces a gimp en modo no-interactivo (desde consola, sin necesidad de abrir ventanas), procesa todos los fotogramas con el script anterior, los salva y los va metiendo todos en un vídeo llamado resultado.mp4; eso sí, para que no haya problema con el audio, cogeremos la misma pista de audio del vídeo original y la implantaremos en el vídeo destino.
Este script, para calcular la duración del archivo de vídeo y los fotogramas por segundo del mismo utiliza el script videoinfo.
Allá va la primera versión del script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash

VIDEO="$1"
SECS=$(videoinfo seconds "$VIDEO")
FPS=$(videoinfo fps "$VIDEO")
TEMPNAME=$(tempfile)
rm "$TEMPNAME"

for ((i=0;i<$SECS;i++)); do
    echo "SEGUNDO: $i de $SECS" >&2
    avconv -i "$VIDEO" -an -q:v 1 -ss $i -t 1  -f image2 $TEMPNAME%05d.png
    for img in $TEMPNAME*.png; do
    gimp -i -b "(gaussblursel \"$img\" \"$img\" 8 40)" -b '(gimp-quit 0)'
    cat $img
    rm $img
    done
done | avconv -r $FPS -f image2pipe -c:v png -i pipe:0 -i "$VIDEO" -c:v h264 -c:a mp3 -map 0:v:0 -map 1:a:0 resultado.mp4

Al final del post, optimizaremos un poco y sólo un poco el script, para no cargar tantas veces gimp, aunque se cargará el programa al menos una vez por segundo.

Análisis del script

En principio, una vez extraídos SECS (segundos de duración) y FPS (fotogramas por sengundo), obtenemos un nombre de fichero temporal (para almacenar los fotogramas del segundo con el que trabajaremos cada vez.
En cada segundo que recorramos con el bucle for, extraeremos todos los fotogramas en archivos PNG cuyo nombre finalizará con números consecutivos. Una vez extraído ese segundo, proceso que suele durar poco (si el vídeo tiene los índices bien hechos). Con esta serie de ficheros (tantos como fotogramas por segundo tenga nuestro vídeo) llamaremos al script que hace el desenfoque y con cat, pondremos el contenido del archivo por la salida.
La salida combinada de todos los archivos procesados la cogerá avconv, cuya entrada es la pipe de salida del for, combinará el vídeo con el audio y listo. Podremos elegir los códecs que queramos. En mi caso, preferí hacerlo con h264 para vídeo y mp3 para el audio.

Primeros pasos

El primer paso para un buen resultado, es extraer varios fotogramas de muestra del vídeo y aplicar el efecto que queremos, para elegir los parámetros de radio de desenfoque y delta perfectos para todo el vídeo.
sentada_frame
A primera vista no apreciamos mucho, ya que lo que quería, sobre todo era quitar algo de granulado de los soportes y de las varias compresiones que lleva el vídeo (los vídeos tienen ya un tiempo y en aquellos comprimía los vídeos con gran pérdida, y en ocasiones cuando había que aplicar algún efecto, había que pasar por varios programas comprimiendo y descomprimiendo vídeo, por lo que el resultado siempre estaba algo más deteriorado.

Si ampliamos un área de imagen sí que podremos ver que se ha mejorado:
sentada_frame_g

Revisión del script

Esta es una versión que hice para que GIMP no se ejecutara tantísimas veces y es que la carga y descarga contínea del programa puede hacernos perder muchísimo rendimiento. En mi equipo, la ejecución del script tarda menos de la mitad con esta pequeña modificación:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

VIDEO="$1"
SECS=$(videoinfo seconds "$VIDEO")
FPS=$(videoinfo fps "$VIDEO")
TEMPNAME=$(tempfile)
rm "$TEMPNAME"

for ((i=0;i<$SECS;i++)); do
    echo "SEGUNDO: $i de $SECS" >&2
    avconv -i "$VIDEO" -an -q:v 1 -ss $i -t 1  -f image2 $TEMPNAME%05d.png
    SEQUENCE=()
    for img in $TEMPNAME*.png; do
    SEQUENCE+=(-b "(gaussblursel \"$img\" \"$img\" 2.50 12)")
    done

    gimp -i ${SEQUENCE[@]} -b '(gimp-quit 0)'

    for img in $TEMPNAME*.png; do
    cat $img
    rm $img
    done
done | avconv -r $FPS -f image2pipe -c:v png -i pipe:0 -i "$VIDEO" -c:v h264 -c:a mp3 -map 0:v:0 -map 1:a:0 resultado.mp4

En este caso, lo primero que hacemos es generar los argumentos del comando GIMP que ejecutaremos (será un script por cada fotograma, pero se los pasaremos todos juntos), una vez generado ejecutamos gimp y cuando terminemos, pondremos el contenido de los frames a la salida e iremos borrando archivos.

Listos para ejecutar

Una vez lo tengamos, todo listo, en el script editamos los parámetros del efecto (en la línea de llamada a gimp) y ejecutamos. Tardará un tiempo, pero obtendremos nuestro resultado.
Al final, obtenemos un vídeo que se ve un poco mejor que el original, tampoco se pueden hacer milagros, pero las texturas son un poco más suaves (el vídeo es muy antiguo):

Ideas para el futuro

Como idea, lo que podríamos hacer será generar varias secuencias de archivos y ejecutar varias instancias de gimp con scripts diferentes. Si tienes un equipo con varios núcleos, podrás aprovecharlos todos para procesar fotogramas de vídeo y terminar mucho antes, utilizando herramientas de bash para ejecución en segundo plano, o herramientas propias para ejecutar tareas concurrentemente en shell scripts.

Foto principal: Sergey Turkin

The post Cómo aplicar filtros de GIMP a un vídeo appeared first on Poesía Binaria.

Microsoft anunció nuevo Skype para Linux

La nueva versión de Skype para Linux tendrá grandes mejoras, como es el caso de nuevos emoticones, una interfaz diferente y funciones extraordinarias, como las que nos permite compartir archivos de una manera rápida y sin demoras. La intención de Microsoft es el hecho de permitir mayor conectividad en su plataforma de videollamadas, la cual es muy utilizada a pesar de que ya existen muchas

Domingo 17 de julio de 2016

David González

David González
Blog Bitix

Cómo crear vistas previas de imágenes con ImageMagick

Linux
GNU

En una página web es útil utilizar imágenes más pequeñas en tamaño que las originales para reducir la cantidad de kilobytes transferidos al acceder a una página consiguiendo además que cargue más rápido en conexiones lentas. Algunas imágenes en alta calidad pueden ocupar varios megas, es poco eficiente cargar una imagen que posteriormente en el navegador se visualizará en un tamaño más pequeño, ya que la imagen se descargará en su tamaño original pero posteriormente el navegador al visualizarla la escalará al tamaño en que la muestre.

Si previamente hacemos el escalado podremos ahorrar una buena cantidad de ancho de banda que se notará en mayor medida en los dispositivos móviles que usen las redes de operadores de telefonía y ahorrará datos en aquellos usuarios que tengan algún límite de transferencia mensual en su tarifa. También afecta al SEO, el tiempo de carga de una página Google es un criterio que tiene en cuenta su algoritmo para ordenar los resultados en su página.

Si tenemos unas pocas imágenes y no es algo que hagamos a menudo podemos usar una herramienta de retoque fotográfico como GIMP pero si tenemos muchas imágenes o es algo que hacemos de forma regular es conveniente automatizar la tarea, nos ahorraremos bastante tiempo de algo que es tedioso hacer de forma manual.

Al igual que podemos convertir imágenes entre diferentes formatos o añadir marcas de agua a imágenes de forma automatizada con Image Magick podemos escalar imágenes para generar vistas previas o thumbnails más pequeñas para que ocupen menos. El comando para escalar todas las imágenes de una extensión jpg en este caso a un tamaño original de 1600 de ancho y 1067 de alto en pixeles conservando la proporción de la imagen es el siguiente:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/e09f72974e4fe881019837fdd3be2836/raw/convert.sh">convert.sh</pre></a></noscript>

El primero de los comandos sirve para haceer cambios de tamaño de forma individual a cada foto y el segundo de forma masiva usando Bash. Crean nuevos archivos con las vistas previas añadiendo al nombre de cada vista previa la terminación _thumb, además con la opción -strip elimina la metainformación de la foto o imagen que se hubiera almacenado junto con ella como hacen los teléfonos móviles y cámaras.

En Blog Bitix para mostrar la vista previa uso la librería de JavaScript Bootstrap Image Gallery. Este sería una ejemplo de la imagen que tengo como fondo de escritorio. Su tamaño original ocupa 1 MB, la vista previa aproximadamente 210 KB en tamaño 650x450 y 50 KB en tamaño de 300x200. Una reducciónd de tamaño considerable.

Previsualización de imagen en tamaño 650x450 y 300x200 del original 1600x1067

Viernes 15 de julio de 2016

Las mejoras de la última versión de GIMP

La aplicación de desarrollo gráfico GIMP se actualizó nuevamente y trajo una gran cantidad de mejoras, las cuales son muy valoradas por los usuarios de equipos con Linux, puesto que las mismas ayudan a que un usuario que utiliza un ordenador basado en un sistema operativo libre pueda tener las mismas oportunidades que el usuario de herramientas pagas como Photoshop o Illustrator, ambas
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.

Sábado 04 de junio de 2016

Programando para Haiku – File panel – Parte II

Continuamos los tutoriales de programación en Haiku. Hoy veremos como usar el File Panel. ¿Qué es el File Panel? El File Panel es el diálogo que nos aparece cuando queremos abrir o guardar un archivo o carpeta. En todos los sistemas operativos gráficos es similar.

File Panel de Windows

BFilePanel

La clase básica es BFilePanel. Esta clase se encarga de mostrar esa ventanita que nos deja elegir el archivo o carpeta para abrir o para guardar. Lo primero que tenemos que saber si queremos hacer un File Panel es si va a ser para abrir un archivo existente o para guardar un nuevo archivo. Así, distinguimos entre B_OPEN_PANEL y B_SAVE_PANEL. Si estamos dentro de un B_OPEN_PANEL además indicaremos si aceptamos archivos, carpetas, enlaces simbólicos o alguna combinación de estas cosas. Por último, ¿cómo recibimos la información del panel? Pues usando BMessage, como es habitual en Haiku/BeOS. Pero hay que indicar quién va procesar el mensaje, el conocido como BMessenger. Veamos código:

const uint32 OPEN_FILE = 42;
BFilePanel* filepanel = new BFilePanel(B_OPEN_PANEL,new BMessenger(this),NULL,B_FILE_NODE,new BMessage(OPEN_FILE));
filepanel->Show();

En este código creamos un file panel para abrir un archivo. El BMessenger encargado de procesarlo será el del mismo contexto en el que se ejecute este código. Hay que tener en cuenta que tanto BApplication como BWindow heredan de BMessenger y por tanto cualquier objeto de estas clases es apto. El siguiente parámetro es la carpeta por defecto, que con NULL la dejamos a elección de Haiku. Luego indicamos que queremos abrir archivos, no carpetas ni enlaces simbólicos. Por último especificamos el ID del BMessage que enviará el panel. Esto nos servirá para después saber que ID tenemos que leer dentro de la función MessageReceived del BMessenger. Por último mostramos el panel para que el usuario decida el archivo a abrir. Si la acción es cancelada también será disparado el mensaje, tendremos que comprobar si el usuario eligió el archivo o cerró el diálogo.

Haiku File Panel

Leer la respuesta

Dentro de la función MessageReceived del BMessenger tenemos que accionar un caso especial si el ID del BMessage es el que hemos especificado en el panel.

void MiVentana::MessageReceived(BMessage* msg)
{
	switch(msg->what){
    	case READ_FILE: {
			if (msg->HasRef("refs")) {
	  			entry_ref ref;
	  			if (msg->FindRef("refs", 0, &ref) == B_OK) {
					BEntry entry(&ref, true);
					BPath path;
					entry.GetPath(&path);
					std::cout << "El archivo es " << path.Path() << std::endl; 
			 	}
			}
			break;
  		}
    }

}

Tenemos que comprobar si el mensaje tiene la propiedad “refs”. La propiedad “refs” la ajusta el File Panel cuando se ha seleccionado un archivo. Si la propiedad existe entonces lo leemos. Leeremos una entryref. Un entryref es una entrada dentro del sistema de archivos. Sin embargo esta estructura es de bajo nivel y no sabe exactamente donde se ubica. BEntry representa localizaciones dentro del sistema de archivos. Se construye con un entry_ref y esta clase ya sabe donde se ubica de forma legible por un humano (o un programador perezoso). Si queremos saber la ruta del archivo antes tendremos que crear un objeto vacío BPath que llenaremos con contenido. Finalmente la ruta, como string, la podremos leer llamando a la función Path dentro del objeto BPath.

Ya hemos visto como se usan los file panel en Haiku. Los file panel de guardar archivo se programan exactamente igual cambiando esa pequeña flag al principio.

La entrada Programando para Haiku – File panel – Parte II aparece primero en Blog - Adrianistan.eu.

Martes 31 de mayo de 2016

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

Viernes 27 de mayo de 2016

José María Morales Vázquez

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

Cuentas de correo de “usar y tirar” o de un solo uso

correo Los correos electrónicos de un sólo uso son una gran herramienta para evitar el spam. Cuando queremos probar o evaluar un servicio para el que nos exigen una cuenta de correo electrónico y la evaluación no se hace efectiva mientras que no validemos dicha cuenta (por regla general haciendo click en un link que recibimos en la misma) lo más cómodo y práctico es recurrir a una de estas cuentas. Tienen, por supuesto, otros usos, pero mejor no te doy ideas por si acaso… 😉
Este tipo de correos tienen también una parte negativa, no lo olvides: la privacidad de lo que recibes en ellos es nula, puede que no puedas volver a usarlos en el futuro para recuperar la contraseña del servicio o, por el contrario, puede que alguien que no seas tu “suplante” tu personalidad a través de dicho correo y te robe la identidad en el servicio para el que la utilizaste en primer lugar… Así que ten mucho cuidado donde y para que las usas y trata de ser consciente de los riesgos que corres.

Allá por el año 2000 que fue cuando empecé a usar este tipo de cuentas e hice mi primera lista había apenas cinco servicios de este tipo. Ahora tengo listados más de 30. El único que sobrevive de aquellos tiempos es Mailinator…

No te voy a recomendar ninguno. Échales un vistazo por ti mismo. En esta lista encontrarás de todo: servicios con registro, sin él, que destruyen los correos en unos minutos, que los guardan para siempre, que te permiten elegir la cuenta o que la generan de forma aleatoria… Lo dicho, si necesitas algo así busca por ti mismo que es lo que mejor se ciñe a lo que quieres:

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: Cuentas de correo de “usar y tirar” o de un solo uso || Hospedado en un Cloud VPS de Gigas.
BlogDRAKE: Instalando Oracle 11gR2 XE y Oracle SQL Developer en Mageia, usando el escritorio XFCE

Miércoles 25 de mayo de 2016

BlogDRAKE: Se extiende el plazo para el concurso de arte

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

Domingo 17 de abril de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

Que son los paquetes Snap en Ubuntu

Hoy he estado revisando varias noticias que tenia almacenadas en mis cuentas de email y me he encontrado con una de la que ya había leído algo pero no en profundidad. Esta noticia trataba sobre los paquetes Snap en Ubuntu, que son y las ventajas e inconvenientes que suponen y eso es de lo que os voy a hablar en este articulo.

Como muchos de vosotros sabréis la nueva versión LTS de Ubuntu, la 16.04, esta a la vuelta de la esquina y habrá varias novedades. Una de esas novedades es que los paquetes Snap harán su aparición en la versión de escritorio y conviviran junto con los Deb, pero ¿que son los paquetes Snap?

 

snap ubuntu

 

Hasta ahora cuando queríamos instalar un programa en Ubuntu o sus derivadas lo podíamos hacer de varias formas, desde el Centro de software, Synaptic y la Terminal pero todo se reduce a que Ubuntu se descarga el archivo instalable en formato Deb y lo instalaba en nuestro ordenador. Deb es el formato de paqueteria que se usa en Ubuntu y proviene de Debian. Os voy a explicar un poco a grandes rasgos como funciona. Supongamos que queremos instalar un programa llamado Gimp, accedemos al Centro de Software para instalarlo, lo buscamos y le damos al botón en el que pone “Instalar”, entonces se comprueba que en nuestro Ubuntu estén todos los programas o librerías de las que depende para instalarse el Gimp, si no están se descargan las necesarias y el propio Gimp, todo ello en formato Deb y después se instala. Esto tiene una ventaja clara, si un paquete sirve para varios programas lo pueden compartir, con el consiguiente ahorro de espacio en nuestro disco duro y RAM.

Snap es otro tipo de paqueteria que tiene como objetivo que cuando quieres instalar un programa viene todo lo necesario para dicho programa en un solo paquete, de esa forma evitaremos resolver las dependencias. Esto tiene una ventaja muy buena y es que como no necesitamos cumplir dependencias podremos tener la ultima versión del paquete Snap independientemente de la versión de Ubuntu que tengamos instalado. Ademas, como un programa empaquetado Snap tiene todo lo necesario para funcionar estará aislado del resto del sistema por lo que su repercusión en el sistema sera nula.

De momento convivirán los dos tipos de paqueteria, dudo mucho que a corto/medio plazo Ubuntu tenga previsto eliminar los Deb de su sistema operativo, aunque si que puede ser un primer paso para hacerlo en el futuro.

Una de las grandes desventajas que tiene Snap sobre Deb es que los programas ocuparan mas espacio en disco, aunque eso no es un problema con las capacidades de los discos duros de hoy en dia.

Un saludo.

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.

Domingo 20 de marzo de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

La realidad virtual, por fin, a la vuelta de la esquina

 

Después de pasar tiempo esperando lo que parecía su inminente llegada, la realidad virtual está  por fin al caer para cambiar nuestra experiencia de juego. Las gafas que nos trasladarán a otra realidad imaginaria dejarán pronto de ser un elemento de nuestra imaginación o de formar parte del atrezzo de películas como Existenz.

El último paso firme por la apuesta de este nuevo concepto de juego lo ha dado Sony con la presentación de PlayStation VR, las gafas de realidad virtual que funcionarán y dependerán de la PS4. La firma japonesa ha prometido un precio de lanzamiento de 399€, lo que indica que su punto de mira es el público masivo en comparación de otras gafas más caras como la Oculus Rift , que llegará en marzo y que se venderá por unos 750€ y la HTC Vive, las gafas de realidad virtual de gama más alta cuyo precio se calcula casi en los 900€.

Las gafas de Sony se esperan para el próximo mes de octubre y, por el momento, la marca nipona ha prometido unos 50 juegos compatibles para finales del 2016, bastantes menos que los que tendrán sus competidoras de gama alta que ofrecerán un catálogo mayor de juegos de PC.

La llegada de las gafas de realidad virtual conllevará un cambio necesario en el concepto y diseño de los juegos. En este sentido, podremos ver cómo se producen adaptaciones de muchos tipos de aventuras gráficas para satisfacer la nueva demanda que llega con la realidad virtual, en la que se busca una mayor inmersión en la experiencia de juego.

De los juegos de disparos en primera persona, pasaremos  a ser un personaje dentro de la historia, a hablar con los otros protagonistas o a interactuar con los objetos del escenario. Como podemos ver en el juego London Heist Getaway, nos convertiremos en atracadores cuyo cometido es salir con vida de la fechoría.

 

De poder interactuar con el crupier en la ruleta en vivo de algunos casinos online pasaremos a poder interactuar en los casinos de realidad virtual donde jugar, directamente, manipulando las máquinas de juego que llenan el espacio.

 

Algunos juegos se adaptarán a la realidad virtual ofreciendo una versión más realista de sí mismos. Con el juego Rock Band VR para las gafas Oculus, no habrá que imaginarse que uno es una rock star porque se podrá vivir la experiencia de serlo directamente encima del escenario.

 

Con la llegada de PS VR de Sony, el público mayoritario podrá tener acceso a este nuevo paso en la evolución de los videojuegos.  Pero seríamos ingenuos si pensásemos que las gafas de realidad virtual se quedarán solo en el ámbito del ocio.

Gracias a la realidad virtual, las marcas podrán ofrecer diferentes experiencias de inmersión antes de decidirnos por la compra de un producto, como poder ver detalladamente el interior de un coche o poder realizar una visita virtual antes de reservar una habitación de hotel.

Las compañías son conscientes del filón que se les presenta con la llegada de la realidad virtual y, por eso, no es de extrañar que las grandes tecnológicas ya estén invirtiendo en el desarrollo de negocios relacionados con este ámbito. Apple ya ha fichado a expertos en la materia para el desarrollo de sus propias gafas y Alphabet (Google) tiene su propio departamento para el desarrollo de unas gafas que funcionen con móviles Android.

Todos se apuntan a esta nueva realidad que cambiará nuestra forma de interactuar con nuestro alrededor. La última en anunciar que quiere formar parte del cambio ha sido Sony con sus gafas pro más económicas. Aunque si los 399€ que cuestan sigue pareciéndote caro, hay oferta para todos los bolsillos incluidas gafas de realidad virtual por menos de 50€.

 

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í.

Miércoles 09 de marzo de 2016

MD5sum: comprueba la integridad de una ISO

Cuando descargas una ISO, por ejemplo de tu distribución favorita o de una ROM de Android, antes de  instalarla en...

La entrada MD5sum: comprueba la integridad de una ISO aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Domingo 06 de marzo de 2016

Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e iOS

Ya hemos hablado en la web acerca de otros cursos gratuitos e interesantes que podían ayudarte a ampliar tu formación...

La entrada Curso: Desarrollo en HTML5, CSS y Javascript de Apps Web, Android e iOS aparece primero en Nosinmiubuntu | Ubuntu en concreto, GNU/Linux en general.

Sábado 05 de marzo de 2016

Alvaro del Castillo

Alvaro del Castillo
Entorno de acs

Configuración de WordPress

Después de varios días por fin saco tiempo para continuar la entrada del otro día donde os comentaba las bondades de WordPress. Hoy voy a daros algunos consejos sobre como configurarlo:

1. Estructura Permalink

Lo primero que debes cambiar es la estructura de enlaces permanentes. Se encuentran en Configuración → Enlaces permanentes. El enlace permanente por defecto es <postid>, pero yo prefiero utilizar el nombre de la entrada:

/%postname%/

Permalinks

2. ¿SSL o no SSL?

En 2014 Google anunció que las webs corriendo bajo https tendrían mejor valoración de cara al posicionamiento por este motivo muchas web han cambiado a SSL. Todo depende de nuestro presupuesto, los SSL cuestan $$$.

3. ¿WWW vs no-WWW?

Aquí es cuestión de gustos, si quieres que tu blog aparezca en el navegador como como www.example.com o simplemente example.com. Asegúrate de que en Configuración → General, la versión que deseas aparece correctamente.

4. Optimiza las descripciones

Los webmaster suelen centrarse en los títulos pero nunca hay que dejar de lado las descripciones. La descripción muestra una parte de información muy importante en los resultados de búsqueda y podemos incluir en ella las palabras clave (keywords) que queremos resaltar.

5. Limpiar el código

Reduce al mínimo posible los Javascript y CSS que pueda tener tu plantilla. Google valora la rapidez de carga de tu web, de hecho hay un test específico para ello que mide tanto la versión normal como la móvil (responsive):

Test de velocidad de carga de Google

6. SEO y contenido duplicado

Debes huir siempre del contenido duplicado ya que es una de las cosas que más penalizan a la hora de posicionar tu blog. Google tiene avanzados algoritmos que analizan el texto (densidad keywords, frases, párrafos, incluso el conjunto!) para ver si son copiados de otros existentes.

7. Encabezamientos (headers)

Aunque cada vez tienen menor peso en el SEO aún sigue siendo una buena idea poner algunos textos con encabezamientos, por ejemplo el de mayor tamaño <h1> para el nombre de la entrada. Puedes poner también algún <h2> y <h3> para slogan o títulos secundarios.

 

Lunes 08 de febrero de 2016

Alvaro del Castillo

Alvaro del Castillo
Entorno de acs

WordPress SEO

Con la invención de Internet y el marketing digital el alcance de la optimización de motores de búsqueda (SEO) se ha convertido en uno de los métodos preferidos de promoción web. Por este motivo en la entrada de hoy quiero hablaros de como utilizar el software de blogs más conocido del mundo (WordPress) para mejorar el SEO de vuestras webs.

SEO, en términos generales se denomina como la optimización de motores de búsqueda. A diario millones de personas utilizan los buscadores para acceder a la información que necesitan. Aparecer en las primeras posiciones de las palabras clave (keywords) es imprescindible para el éxito de nuestro proyecto en Internet. Por este motivo la mayoría de los webmasters han optado por la promoción basada en SEO para poder llegar a su público objetivo.

Con el paso de los años (incluso meses) las técnicas de optimización en buscadores se actualizan por lo que hay que estar atentos y en constante evolución ante los cambios del algoritmo de Google.

Recientemente la empresa donde alojo ACS (podeis ver su banner al pie del blog) ha lanzado un VPS específico para el SEO basado en WordPress.

¿Y por qué han elegido WordPress?

WordPress es uno de los mejores sistemas de gestión de contenido cuando se trata de SEO, teniendo en cuenta que casi una cuarta parte de las webs de internet están hechas con este CMS tantos webmasters no han podido equivocarse!.

Ahora al grano, lo que proponen con este VPS SEO es poder levantar en pocos minutos hasta 4 hosting WordPress cada uno con una dirección IP clase C propia (IPs españolas).

WordPress es un software muy bien optimizado y permite que cada página sea indexada rapidamente por los buscadores, por este motivo es muy sencillo crear un blog, añadir buen contenido y enlazar a nuestras webs para mejorar sus rankings.