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.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Rocío Gallego – Traduciendo KDE (IV)

Hoy seguimos con la cuarta entre de la sección que inauguré en el blog hace unas semanas con la entrevista a Javier Viñal. Recordemos que la sección se llamaba Traduciendo KDE y en ella se mostrarán una serie de entrevistas que se han realizado al magnífico equipo de traducción de KDE, gracias al cual podemos disfrutar del trabajo de los programadores KDE en multitud de idiomas. El protagonista de esta cuarta entrevista es Rocío Gallego, miembro del equipo de traducción al español de KDE. Espero que sea de vuestro agrado.

Rocío Gallego– Traduciendo KDE (IV)

rocgalor_operahousePara empezar me gustaría que te presentaras tu misma a los lectores del blog.
Me llamo Rocío Gallego y soy traductora profesional. Durante más de diez años me dediqué al desarrollo de software y a la consultoría informática en los entornos de SAP y Siebel, pero hace unos años tuve que adaptarme a las nuevas circunstancias familiares y desde entonces, me dedico a la traducción técnica.
¿Colaborar con KDE te da mucho trabajo? ¿Hay temporadas de mucha actividad y otras de poca?

En realidad, la traducción de KDE, o localización como decimos los traductores, te exige tanta dedicación como tú desees. Depende de la cantidad de paquetes de los que te quieras hacer cargo.

Siempre es interesante conocer como te iniciaste en este mundo. ¿cómo fue?

En mi profesión, necesito utilizar muchos tipos de aplicaciones y Linux me ofrece la posibilidad de elegir entre un gran número de excelentes aplicaciones de uso libre, gratuito y totalmente legal, incluido el escritorio que utilizo. Me pareció que dedicar parte de mi tiempo y de mis habilidades a la traducción de KDE era lo mínimo que podía hacer a cambio.

La motivación de un traductor

Casi ya me has contestado pero seamos más específicos ¿Cuál es tu motivación y qué te aporta tu labor de traductor?

Me encanta traducir y me parece que resulta muy útil para que estupendas herramientas puedan llegar a más personas que de otra forma no podrían utilizarlas. Por esta razón y por lo que te comentaba en la pregunta anterior, me resulta una labor muy satisfactoria.

Los juegos de KDE

¿Qué aplicaciones o partes de KDE has traducido?

Actualmente,me encargo de los siguientes paquetes: applications, extragear-base, extragear-sysadmin, kdeaccessibility, kdeadmin, juegos educativos de kdeedu, kdewebdev y www.
También me encargo de la documentación de frameworks y kde-runtime.
Anteriormente me encargué también de los juegos: kdegames y playground-games

 

Creo que nadie puede dudar de tu gran trabajo e implicación. De echo es posible que algún lector se motive y quiera echar una mano ¿cómo puede empezar?
En la página web de nuestro equipo de traducción de KDE al español, hay una sección que explica con todo detalle cómo empezar a colaborar. Os dejo aquí el enlace: http://es.l10n.kde.org/empezar.php.

Preguntas rápidas para Rocío Gallego

Pasemos ahora a una ronda de cuestiones sencillas pero interesantes. ¿KDE 4 o Plasma 5?

Plasma 5

Aplicación que más te gusta de KDE

Es difícil elegir. Me resultan muy útiles KsnapShot y Okular por su versatilidad.

Aplicación que te gustaría tener nativa en KDE

Una aplicación para reconocimiento de voz y dictado.

I'mKDE

Y ahora tu minuto de oro, cuenta lo que quieras para los lectores de KDE Blog.

Pues solo decir que animo a los usuarios de KDE a unirse a la comunidad y a aportar sus habilidades para que nuestro escritorio favorito sea cada vez mejor y llegue a más personas.

Un placer leerte Rocío, de todo corazón. Ojala algún día nos veamos en una Akademy, un Sprint o cualquier otro evento. Gracias por tu tiempo

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.

Asociación LiGNUx: GAP: Grupos, Algoritmos y Programación para todos

Viernes 22 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.

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
Baltasar Ortega

Baltasar Ortega
KDE Blog

La Capitaine, nuevo tema de iconos para Plasma 5

Hace tiempo que no hablo de iconos para Plasma. La razón principal es que la fuente de información sobre ellos me ha fallado. Con la reciente remodelación de OpenDesktop todavían no han conseguido restaurar los rss, así que me se me ha pasado comentaros la aparición de algunos temas de iconos, como La Capitaine. Es el momento de ponernos al día.

La Capitaine, nuevo tema de iconos para Plasma 5

De la mano de krourke nos llega La Capitaine, un magnífico tema de iconos para Plasma 5 inspirado, como lo fue originalmente Antü, en Mac OS X y las ideas Material Design de Google. En otras palabras La Capitaine es una obra que deriva de Antü (antes El General) y Numix Circle.

Cada icono de La Capitaine es un vector escalable con lo que se garantiza su calidad para cualquier tamaño. El autor destaca que sigue trabajando en el tema añadiendo nuevos iconos y actualizando los ya realizados. Evidentemente, el objetivo es conseguir que el tema sea lo más completo posible.

Por este motivo, el paquete de iconos es actualizado bastante a menudo con lo que se aconseja clonar el repositorio git y revisarlo cada poco tiempo para estar al día.

La Capitaine

Cómo instalar La Capitaine

Se pueden seguir diversos caminos para hacer la instalación La Capitaine:

En definitiva, un buen tema para tener personalizada nuestro escritorio. Por cierto, si os gusta no olvidéis darle un + en KDE-Look y compartir el mismo en vuestras redes sociales. Estoy seguro que el autor os lo agradecerá.

Más información: KDE-Look

 

 

Asociación LiGNUx: Protección de un sistema GNU/Linux

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 […]
Asociación LiGNUx: ShareX es un capturador de pantalla (screencast) de código abierto

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.

Martes 19 de julio de 2016

Ramón Ramón Sánchez

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

El software libre destruye empleo

“Con la creación de leyes que protejan la soberanía tecnológica y por lo tanto que fomenten el software libre se puede destruir empleo local”, otra de las afirmaciones con las que nos intentan engañar. Esta es la aberración con la que me encontré al llegar a Ecuador. En Ecuador tras la aprobación del decreto presidencial 1014 y comenzó con grandes... Leer más »

La entrada El software libre destruye empleo aparece primero en Software Libre y Comunicación.

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.

Nueva versión de DejaVu Fonts, ahora con fuente matemática

Ayer se ha publicado la versión 2.36 de la familia de fuentes DejaVu (el artículo original ya ha sido actualizado). Además de numerosas correcciones de error y nuevos símbolos, la novedad más importante es la incorporación de una fuente «matemática» que puede ser utilizada por el paquete unicode-math en documentos XeTeX y LuaTeX. En efecto, […]

Jueves 14 de julio de 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

¡Nueva versión de Skype para GNU/Linux! Ya vemos los emoticonos y los gifs, pero…

skypeforlinux1Microsoft, lanzó ayer una nueva actualización, o más bien una reescritura de Skype para nuestro sistema operativo, GNU/Linux. Es la primera actualización desde el 18 de junio de 2014, y en estos tiempos, si un programa lleva tanto sin actualizarse lo podemos considerar Abandonware.

Skype se ha convertido en un estándar de facto para las comunicaciones tanto personales como en empresas. Hace unos años era el programa que mejor respuesta daba a la hora de hacer videoconferencia por Internet, incluso con un ancho de banda reducido y, a pesar de que van surgiendo muchas alternativas para las comunicaciones, casi siempre es necesario que los dos extremos de la comunicación tengan el mismo programa y, dado que está presente en los principales sistemas operativos y no ponía muchas pegas para interoperar entre los diferentes clientes, todo el mundo lo usaba.

A mediados de 2011, Microsoft compró Skype por 8500 millones de dólares y los usuarios de GNU/Linux temíamos por el futuro del sistema de comunicaciones. Aunque en principio no se portaron mal del todo, teníamos nuestro cliente de Skype y de vez en cuando alguna actualización con alguna cosa nueva, pero lo más importante, es un programa de comunicaciones, no debe consumir demasiado y debe hacer que la comunicación sea efectiva, tanto en chat como en voz. Por su parte Microsoft, relevó Messenger como programa preferido de comunicaciones, aunque al principio, Skype visualmente tenía muchas menos cosas que Messenger (había juegos, podías poner gif animados de emoticonos, zumbidos… aunque con los años se volvió un juguete muy muy pesado).

Por otra parte, los usuarios de este sistema operativo, teníamos algunos extras como la ejecución de scripts ante las notificaciones, y el entorno, aunque era muy de mediados de los 2000 terminaba siendo más amigable que el nuevo interfaz de Windows (aunque para gustos los colores)… bueno, y lo más importante de todo. Los linuxeros no teníamos publicidad.

Al grano

Por fin, después de muchos años de retraso frente a versiones de Skype de Windows en las que puedes enviar animaciones, hacer videochats grupales, hay emoticonos con motivo de películas o eventos, emoticonos grandes, puedes traducir mensajes automáticamente y más, sacan una versión renovada para nuestro sistema operativo. Más concretamente, una versión Alpha, por lo tanto, tendrá muchos fallos, le faltarán muchas cosas y no estará nada optimizada.
Como hace unos años sacaron Skype Web, y como es tendencia actualmente, yo me imaginaba que sacarían un programa basado en web, con diseño adaptativo y que, será fácil de portar a otras plataformas. Efectivamente, así ha sido, presentan un nuevo programa nativo para Linux basado en web.
Lo bueno, es que al estar basado en web, muchas actualizaciones serán fáciles para ellos, es decir, el mantenimiento del software será más liviano, ya que no tendrán que tocar el núcleo del cliente para muchas cosas, sólo los archivos HTML/CSS/Javascript asociados. Lo malo, es que un programa así consume mucho más. Se necesita más CPU para interpretar los archivos, y para lidiar con esa gran capa de abstracción que supone empotrar un navegador para que haga el trabajo sucio. En mis pruebas, el nuevo Skype, lanza 5 procesos en el sistema y la suma de la CPU de todos los procesos era de un 18% de CPU, aunque tras ejecutarlo varias veces y llevar un rato trabajando (en tareas indeterminadas que hace el software privativo), para a consumir entre un 6% y un 8% de CPU (y subiendo con las horas). Por su parte, la memoria consumida ronda los 600Mb de RAM frente al 3% de consumo de CPU, y 165Mb de RAM consumidos por el cliente de Skype 4.3. En definitiva, consume 4 veces más memoria y 3 veces más CPU.

Comparado con el cliente de Windows que según el administrador de tareas (no nos fiemos mucho), consume un 0% de CPU y 185Mb de RAM. Pero a lo que voy, un programa de comunicaciones, que suele estar encendido gran parte del tiempo, no debe consumir tanta CPU, ni memoria. Mucha gente usa Skype en netbooks con 2Gb de RAM y si le quitas 1/4 de la memoria estás sacrificando un montón.

Cosas buenas

Pero bueno, no todo es malo, que ya me extenderé. Como cosas buenas:

  • tenemos los ¡GIF animados! descargados de Giphy, con buscador y todo.
  • El traductor, que está muy bien para comunicarse con personas en diferentes idiomas en tiempo real, y no funciona mal, a veces hay que echar imaginación para interpretar el mensaje, pero bueno, es lo que tienen los traductores automáticos.
  • Emoticonos nuevos y grandes. En Windows constantemente tienen nuevos emoticonos, y pueden ver caretos grandes y animados, ahora ya podemos.
  • Nuevos protocolos de comunicación. Hace meses Skype for Linux dejó de recibir llamadas, estaban tocando algo, eliminando retrocompatibilidad con clientes antiguos, supongo. Ahora utilizamos los métodos nuevos, supongo que incorporarán cifrado y la forma en la que Skype se conecta (no he visto que el nuevo skypeforlinux escuche en algún puerto).
  • 64bits! Antiguamente teníamos un Skype de 32bit y muchas veces causaba problemas al instalar por tener que incluir retrocompatibilidad y bibliotecas extra y aprovecharemos mejor la capacidad de nuestro equipo, en teoría
  • Conferencias grupales, no las he probado aún, porque he tenido problemas estableciendo conferencias normales, pero supuestamente, ya tenemos
  • Seguimos sin publicidad, eso es bueno, aunque sólo es una Alpha. Cuando salga la versión estable, hablaremos.
  • Utiliza el anillo de claves del sistema. Antes, almacenaba la configuración en un sistema propio, sin cifrado, y sólo para Skype, ahora, acude al anillo de claves de nuestro entorno para almacenarla, el cual puede tener políticas de seguridad todo lo estrictas que queramos.

Cosas malas

Intentaré no extenderme, es más, debo ser bueno, que sólo es una versión Alpha.

  • Los usuarios de Linux, ya no podemos ejecutar scripts, ni personalizar notificaciones. Era útil por si querías recibir un mail cuando alguien se conectara, cuando se hablaba sobre algo importante, o incluso para copiar esos mensajes en un archivo aparte… para esas conversaciones grupales en las que la gente no para de hablar y no tienes tiempo para separar la paja del trigo.
  • Tampoco tenemos acceso a la API, que permitía que otros programas interactuaran con Skype, eso ayudaba mucho para ciertas tareas, como ver los mensajes en otros programas (y procesarlos), grabar llamadas, etc
  • Falla al llamar a otros equipos con la versión antigua para Linux. Esto es conocido, y ellos te lo dicen cuando lo descargas, pero es un gran impedimento.
  • Basado en navegador. Como dije antes, es mejor para Microsoft (mantenimiento sencillo), peor para nosotros (peor rendimiento). Más concretamente utiliza el proyecto Electron, que carga un navegador Chromium empotrado en la aplicación. Y es complicado que puedan mejorar mucho el consumo de memoria y CPU con esta tecnología, aunque es cierto que he visto maravillas…
  • Pocas opciones. En Windows puedes configurar muchas cosas, ahora en esta versión no puedes configurar nada, ni alertas, ni proxys, ni puertos, ni teclas rápidas, ni configurar dispositivos de sonido y vídeo…
  • Skype Wifi. Yo no lo utilicé nunca, pero con esta versión tampoco se puede usar.
  • Compartir pantalla. Ya no se puede compartir pantalla, y si usas esta herramienta para dar soporte, sencillamente, no podrás. Tampoco es que funcionara muy bien antes, pero al menos se podía usar.
  • Icono de bandeja de sistema con menos funcionalidades. Antes, el icono podía cambiar de estado y más cosas, ahora sólo puedes Abrir Skype y cerrar Skype
  • Desvío de llamadas. Ya no puedes.
  • Mensaje de bienvenida, tampoco puedes.
  • Para cambiar cosas en la cuenta o en el perfil, te remiten a la web (con tu navegador y fuera de la aplicación
  • Aunque los mensajes se almacenan de forma local (en SQLite como siempre), cuando me quedé sin conexión un momento, no pude acceder a ellos.
  • Visor de imágenes. Es horrible, como cuando cargas una imagen en una ventana emergente del navegador…

Como vemos, muchas cosas pueden ser causadas por ser una versión Alpha. Ha sido un gran paso por parte de Microsoft, y supongo que no hubiera sido posible si esta plataforma no importara, pero tras anunciar a bombo y platillo grandes novedades, me parece muy poco lo que nos ofrecen, de todas formas, daremos Feedback a ver si en unos años la aplicación mejora considerablemente, eso espero. Y que, poco a poco volvamos a tener todas las características, incluso mejorarlas… y sobre todo, espero que en un tiempo el cliente sea más ligero.

The post ¡Nueva versión de Skype para GNU/Linux! Ya vemos los emoticonos y los gifs, pero… appeared first on Poesía Binaria.

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

Jueves 26 de mayo de 2016

Tutorial de Hugo en español, generador de sitios estáticos

Los generadores de sitios estáticos son aplicaciones que dados unos ficheros generan un sitio web completo, listo para ser desplegado en Apache o Nginx. El generador es llamado bajo demanda del administrador por lo que, al contrario que en un CMS completo, este programa solo genera las páginas una sola vez, reduciendo considerablemente la carga de trabajo y el precio y aumentando en velocidad y rendimiento.

hugo

Los generadores más populares son:

Nombre Lenguaje Plantillas Licencia Sitio web
Jekyll Ruby Liquid MIT http://jekyllrb.com
Hexo JavaScript EJS y Swig MIT http://hexo.io
Hugo Go Go Template, Acer y Amber Apache http://gohugo.io
Pelican Python Jinja2 GPL http://blog.getpelican.com

Además es también bastante conocido Octopress pero Octopress no es más que Jekyll con una colección de utilidades extra, el núcleo del programa sigue siendo Jekyll.

¿Por qué voy a elegir Hugo? Yo empecé con Jekyll y me gustó. Sin embargo Liquid no me acabó de convencer nunca y miré otras alternativas. Hexo me pareció excelente si lo que quieres hacer es un blog, funciona muy bien y es más rápido que Jekyll pero Jekyll tenía la ventaja de que se podía usar no solo en blogs, sino en cualquier web en general. Entonces oí hablar de Hugo. Hugo es el más rápido y el más flexible. No está enfocado solo en blogs, soporta todo lo que le eches. Sin embargo me parece que Hugo no es el más sencillo de configurar, así que aquí va el tutorial.

Instalando Hugo

Hugo está hecho en Go, quiere decir que está compilado y por tanto hay una versión diferente para cada sistema operativo. Descarga la versión de tu sistema operativo desde aquí. Si usas GNU/Linux es posible que tu distro haya empaquetado ya Hugo. Búscalo.

Una vez lo tengamos instalado comprobamos que todo esté en orden:

hugo version 

Por defecto Hugo no trae ningún tema. Si quieres instalarte uno y no crear uno de cero puedes clonarlos desde Git. Si quieres probar los temas antes de instalarlos no dejes de mirar Hugo Themes

git clone --recursive https://github.com/spf13/hugoThemes ~/themes 

Si queremos tener coloreado de sintaxis podemos usar Pygments. Si tienes PIP instalado es fácil.

sudo pip install Pygments 

Además si quieres activar el autocompletado de Bash solo tienes que hacer

sudo hugo gen autocomplete . /etc/bash_completion 

Y con esto ya tenemos Hugo instalado correctamente. Ejecuta:

hugo new site MiSitioSupercalifragilisticoespialidoso 

hugo-themes

Organización en Hugo

En Hugo tenemos que tener muy en cuenta la organización de los ficheros. En primer lugar van los themes. Como puedes comprobar la carpeta themes generada esta vacía. Para ir probando los distintos temas puedes hacer un sencillo enlace simbólico entre la carpeta con los temas descargada y esta.


rmdir themes 
ln -s ../themes . 

Veamos el resto de carpetas:

  • archetypes. Arquetipos. Son plantillas para cuando añadimos un nuevo elemento. Por ejemplo, podemos tener un arquetipo de post sobre un vídeo de YouTube. Es posible crear un arquetipo que contenga configuración ya específica (categorías, reproductor insertado, etc) y que cuando escribamos ya lo tengamos medio hecho. A la hora de generar el sitio los arquetipos de origen no son tenidos en cuenta.
  • config.toml (o config.json o config.yaml). Este archivo contiene la configuración del sitio.
  • content. Aquí va el contenido central de la web. Dentro de content debes crear tantas carpetas como secciones tengas (aunque se puede sobreescribir vía configuración, es práctica recomendada). Cada sección tiene asignado un layout distinto. Dentro de la carpeta de cada sección la organización es libre, los archivos suelen ser de Markdown, pero HTML puro también vale.
  • layouts. ¿Cómo se organiza el contenido? Los layouts son la respuesta. Por cada sección hay que crear mínimo dos layouts, uno para mostrar un contenido solamente y otro para múltiples contenidos del mismo tipo (listas).
  • data. Aquí puedes almacenar archivos en JSON, YAML o TOML a los que puedes acceder desde Hugo. Estos archivos pueden contener cualquier tipo de información, piensa en ellos como en una especie de base de datos.
  • static. El contenido estático, imágenes, JavaScript, CSS, que no deba ser procesado por Hugo debes ponerlo aquí.

Configuración

Dentro del fichero config.toml hay que editar unos cuantos valores.

[toml]
baseurl = “mi-sitio.com” # La dirección base del sitio
languageCode = “es-es” # El idioma de la web
title = “” # El título de la web
theme = “bleak” # El tema que se va a aplicar al contenido
googleAnalytics = “” # Código de seguimiento de Google Analytics
disqusShortname = “”

[Params] # A estos parámetros se puede acceder de forma directa con .Site.Params.NOMBRE
Author = “Adrián Arroyo”
[/toml]

También es configurable Blackfriday el motor de Markdown de Hugo, aunque las opciones por defecto son más que suficientes.

Creando contenido

Crea un archivo dentro de content. Puede estar dentro de una sección si así lo prefieres. En Hugo al igual que en Jekyll cada contenido tiene un front matter, es decir, los metadatos se añaden al principio en un formato que no se va a renderizar. Hugo soporta TOML, YAML y JSON. Si usamos TOML, los delimitadores del front matter serán +++, si usamos YAML --- y si usamos JSON tenemos que poner un objeto con las llaves, {}

+++
title = "El título de la entrada"
description = "Una pequeña descripción"
tags = ["hola","otra","etiqueta"]
date = "2016-05-23"
categories = ["Sobre el blog"]
draft = true
+++

Aquí va el contenido en Markdown o HTML que va a ser renderizado.

Podemos crear variables nuevas a las que podremos acceder desde .Params. Otras opciones predefinidas son type (que sobreescriben el valor de la sección), aliases (que permite hacer redirecciones), weight (la prioridad cuando el contenido sea ordenado) y slug (permite ajustar la URL del contenido).

Modificando el tema

Puedes modificar el tema usando la carpeta layouts. En el fondo un tema es una colección de layouts y recursos estáticos que son combinados con el tuyo. Si ya usas un tema y solo quieres realizar pequeñas modificaciones puedes editar el tema directamente. Si quieres añadir nuevas secciones o crear un tema de 0 entra a la carpeta layouts.

Hay varias subcarpetas dentro de layouts importantes:

  • _default. Es la que se usa cuando no hay otro disponible. Normalmente los temas sobreescriben esta carpeta. Si sobreescribes esta carpeta perderás el tema.
  • index.html. La página de entrada a la web
  • partials. En este carpeta se pueden guardar trozos HTML reutilizables para ser usados por los layouts.
  • shortcodes. Son pequeños trozos de HTML reutilizables con parámetros de entrada para ser usados por el contenido.

Dentro de cada layout (como en _default) tiene que haber mínimo dos archivos. Un archivo single.html que se usará cuando solo se tenga que representar una unidad de ese contenido y un archivo list.html que se usará cuando sea necesario mostrar un conjunto de esos contenidos.

Estos archivos han de programarse usando el motor de plantillas de Go y la API de Hugo. Un archivo single.html básico que muestra el título y el contenido tal cual sería así.

{{ partial "header.html" . }}
{{ partial "subheader.html" . }}
<section id="main">
  <h1 id="title">{{ .Title }}</h1>
  <div>
        <article id="content">
           {{ .Content }}
        </article>
  </div>
</section>
{{ partial "footer.html" . }}

Dentro de las páginas list.html es práctica habitual definir una vista li.html como un elemento individual. Esos elementos individuales se unen para formar la lista en list.html.

Algunos extras

Los shortcodes son pequeños trozos de HTML que aceptan parámetros. Podemos usarlos en el contenido. Piensa en ellos como Mixins de CSS o funciones de JavaScript. Por ejemplo, para marcar un resaltado de sintaxis:

{{< highlight html >}}
<section id="mira-este-super-codigo">
	<p class="html-is-broken">Rompiendo el HTML</p>
</section>
{{< /highlight >}}

O un enlace dentro de nuestra web:

{{< ref "blog/este-es-otro-post-fantastico.md" >}}

La entrada Tutorial de Hugo en español, generador de sitios estáticos aparece primero en Blog - Adrianistan.eu.

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

Miércoles 18 de mayo de 2016

Programando para Haiku – BApplication, BWindow y BButton – Parte I

Hoy voy a comenzar una serie de tutoriales donde explicaré la programación de una apliación en Haiku. Para ello vamos a usar C++ y la BeAPI. Siempre que tengais cualquier duda podéis visitar la documentación oficial: tanto la antigua de BeOS en el BeBook y la nueva de Haiku en Haiku API. Aun así hay APIs nuevas que todavía no aparecen documentadas. En ese caso hay que recurrir al código fuente.

Librerías en Haiku

Haiku (y BeOS) comparte con UNIX muchas características de bajo nivel. El tema de las librerías es uno de ellos. También han de empezar por lib y terminar por .so si son compartidas y .a si son estáticas. Para compilar también se usa GCC. Sin embargo hay una pequeña diferencia con el resto de sistemas UNIX. En UNIX normalmente disponemos de una librería del C, libc y una librería de funciones matemáticas, libm. En Haiku no existe libm, en cambio existen muchas más, libroot y libbe, para interactuar con el sistema de manera básica, libtracker, con funciones relacionadas con el explorador de archivos, libnetwork y libnetapi, con funciones de red, y muchas otras.

Además la API se divide en Kits, cada Kit se encarga de una tareas diferentes dentro del sistema operativo. AppKit, Game Kit, Interface Kit, Media Kit, Storage Kit, etc… Si queremos usar la funcionalidad de un kit tendremos que revisar que hemos añadido la librería correcta al compilador y que hemos añadido #include dentro del código que lo usemos.

Un hola mundo

Vamos a empezar por lo simple, una aplicación que muestre una ventana y ya.

Creamos un archivo de C++, será el punto de inicio de nuestra aplicación. Como sabéis, el punto de inicio de un programa de C o C++ es la función main.

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

Hemos creado un objeto llamado app del tipo AplicacionPrueba y después hemos ejecutado la aplicación. AplicacionPrueba tiene que ser del tipo BApplication. Es la clase básica de todas las aplicaciones Haiku/BeOS. BApplication provee de mensajería entre los distintos procesos del programa (hay que tener en cuenta que BeOS se diseñó pensando en el multiproceso). Vamos a ver como definimos AplicacionPrueba

#include <AppKit.h>

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

Las Application necesitan un MIME type, al igual que se usa para indicar los tipos de archivo. No es necesario que sea real. Además hemos creado un objeto VentanaPrueba y la mostramos. VentanaPrueba es del tipo BWindow y es la ventana básica de Haiku, lo que vemos. Veamos la definición:

class VentanaPrueba : public BWindow{
	public:
    	VentanaPrueba() : BWindow(BRect(100,100,900,700),"Mi ventana", B_TITLED_WINDOW,0){
         // iniciar ventana
        }
        bool QuitRequested(){
        	be_app_messenger.SendMessage(B_QUIT_REQUESTED);
            return BWindow::QuitRequested();
        }
        void MessageReceived(BMessage* msg){
        	switch(msg->what){
            	default:
                	BWindow::MessageReceived(msg);
            }
        }
};

BWindow necesita un tamaño, que es indicado con BRect, un título, un estilo (por defecto es BTITLEDWINDOW, pero podemos tener ventanas sin bordes o modal) y opciones varias. En las opciones varias podemos especificar que al cerrar la ventana se cierre la aplicación (BQUITONWINDOWCLOSE), que el usuario no pueda cambiar su tamaño (BNOTRESIZABLE), que no se pueda minimizar (BNOTMINIMIZABLE) y otras opciones por el estilo.

Además dentro de la clase hemos definido dos funciones virtuales, es decir, que tienen implementación por defecto de la clase padre, BWindow, pero nosotros podemos modificar su comportamiento.

QuitRequested es llamada cuando algo pide el cierre de la ventana. El objeto global beappmessenger es del tipo BApplication, pero está definido en todos los puntos de nuestra aplicación sin que nosotros hagamos nada. Gracias a este objeto podemos enviar mensajes entre procesos. En este caso enviamos el mensaje a la aplicación de BQUITREQUESTED. Y luego llamamos a la función sin modificar.

MessageReceived es muy importante. Se encarga de procesar todos los mensajes que recibe la ventana. Para distinguir los mensajes (que son del tipo BMessage) tenemos que inspeccionar la propiedad what. Se trata de un valor de tipo uint32. Hay algunos ya definidos por el sistema como BQUITREQUESTED pero nosotros podemos definir más. Veremos más tarde como. De momento simplemente devolvemos el procesado de mensajes a BWindow padre.

Con esto ya podemos compilar.

gcc -o AplicacionPrueba app.cpp -lbe -lroot 

Añadiendo BView, BButton y BGroupLayout

Ahora vamos a añadir cosas a nuestra ventana sosa. Ponemos una vista dentro de la ventana. Las vistas en Haiku son muy potentes pero eso lo trataré en otro momento. A esa vista le añadiremos un botón.

VentanaPrueba() : BWindow(BRect(100,100,900,700),"Mi ventana", B_TITLED_WINDOW,0){
         // iniciar ventana
         BGroupLayout* sizer = new BGroupLayout(B_HORIZONTAL);
         BView* panel = new BView(Bounds(), NULL, B_FOLLOW_ALL_SIDES,
                           B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE |
                               B_FRAME_EVENTS | B_DRAW_ON_CHILDREN);
         panel->SetViewColor(220, 220, 220);
         panel->SetLayout(sizer);
         
         BButton* boton = new BButton("Hola Mundo",NULL);
         
         sizer->AddView(boton);
         AddChild(panel);
        }

Aquí hemos hecho varias cosas. Por una parte he creado un layout horizontal. Es decir, dispongo el espacio de la ventana de manera horizontal, según se vayan añadiendo elementos lo harán a la derecha. Esto no estaba en BeOS y es particular de Haiku, pero recomiendo usar este sistema pues permite realizar un responsive design. Creamos una vista o panel. Bounds() indica que cubra todo el espacio disponible. El resto son propiedades de la vista más o menos estándar. Con SetViewColor le podemos poner un color de fondo, y con SetLayout le aplicamos el layout previamente creado.

Creamos un botón, que es del tipo BButton. BButton tiene muchos constructores si revisais la documentación pero este es muy cómodo si usamos el sistema de layouts. Simplemente indicamos el texto que va a mostrar y el mensaje que envía. En este caso NULL pues no vamos a poner ninguno.

sizer->AddView() lo usamos para añadir el botón al layaout y AddChild para añadir la vista a la ventana. Puedes compilar.

Añadiendo eventos. Mensajería con BMessage. Diálogo con BAlert.

Vamos ahora a crear un evento para el botón. Cuando pulsemos el botón mostrará un mensaje al usuario.

Los eventos se realizan por el sistema de mensajería basado en BMessage y BHandler. Para crear un BMessage necesitamos un ID, que es del tipo uint32. Eso es lo mínimo y con eso ya serviría para este caso.

const uint32 MOSTRAR_DIALOGO = 1;

...

BMessage* msg = new BMessage(MOSTRAR_DIALOGO);
BButton* boton = new BButton("Hola mundo",msg);

...

Pero los mensajes pueden llevar información adicional de cualquier tipo. Por ejemplo si queremos añadir además una cadena de texto al mensaje usaremos AddString.

msg->AddString("NombrePropiedad","ValorPropiedad");

Podremos recuperar el valor en cualquier momento con FindString.

Ahora si vamos a MessageReceived podemos añadir código que gestione este tipo de mensaje.

        void MessageReceived(BMessage* msg){
        	switch(msg->what){
            	case MOSTRAR_DIALOGO:
                BAlert* alert = new BAlert("Hola", "Sabes pulsar el boton, eh?", "Sip");
                alert->Go();
                break;
            	default:
                	BWindow::MessageReceived(msg);
            }
        }

Con un simple case gestionamos el mensaje. Para mostrar un diálogo simple se puede usar BAlert. Es muy simple, indicamos el título, el contenido del mensaje y el texto del botón que aparecerá. Y con Go lo mostramos.

Esta ha sido la primera parte del tutorial. Os ha gustado. Hay algo que no haya quedado claro. Comentádmelo.

#include <AppKit.h>
#include <InterfaceKit.h>
#include <Layout.h>
#include <GroupLayout.h>

const uint32 MOSTRAR_DIALOGO = 1;

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

class VentanaPrueba : public BWindow{
	public:
VentanaPrueba() : BWindow(BRect(100,100,900,700),"Mi ventana", B_TITLED_WINDOW,0){
         // iniciar ventana
         BGroupLayout* sizer = new BGroupLayout(B_HORIZONTAL);
         BView* panel = new BView(Bounds(), NULL, B_FOLLOW_ALL_SIDES,
                           B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE |
                               B_FRAME_EVENTS | B_DRAW_ON_CHILDREN);
         panel->SetViewColor(220, 220, 220);
         panel->SetLayout(sizer);
         
         BMessage* msg = new BMessage(MOSTRAR_DIALOGO);
         BButton* boton = new BButton("Hola Mundo",msg);
         
         sizer->AddView(boton);
         AddChild(panel);
        }
        bool QuitRequested(){
        	be_app_messenger.SendMessage(B_QUIT_REQUESTED);
            return BWindow::QuitRequested();
        }
        void MessageReceived(BMessage* msg){
        	switch(msg->what){
            	case MOSTRAR_DIALOGO:
                BAlert* alert = new BAlert("Hola", "Sabes pulsar el boton, eh?", "Sip");
                alert->Go();
                break;
            	default:
                	BWindow::MessageReceived(msg);
            }
        }
};

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

La entrada Programando para Haiku – BApplication, BWindow y BButton – Parte I aparece primero en Blog - Adrianistan.eu.

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

Martes 15 de marzo de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

Cuales son los mejores moviles chinos

Ya llevo un mes y medio con mi nuevo Xiaomi Redmi Note 3 y sigo estando muy contento con el. Desde hace tiempo hablo con amigos y conocidos acerca de los móviles chinos y muchos de ellos todavía son muy reacios a comprar un terminal de esta procedencia, y la verdad es que no se la razón.

Si que es verdad es hay móviles chinos que son malos, y muchos, pero también los hay muy buenos, puedo dar fe de ello. No me considero con fanático de los móviles y no estoy muy al día pero que me he informado un poco sobre los móviles chinos y creo que tener algo de base para emitir una opinión medianamente valida, de hecho cuando me propuse adquirir mi actual teléfono estuve leyendo bastante sobre las distintas marcas.

Después de todo lo que leí en Internet me quede con una seria de marcas que son una referencia en cuanto a móviles chinos se refiere, estas marcas son:

  • Xiaomi
  • Meizu
  • Huawei

Por supuesto que hay muchas mas marcas que son muy buenas, pero a mi entender las tres que he citado son una garantía de calidad, ademas las tres tienes móviles que relación calidad/precio son de lo mejorcito que puedes encontrar. Ademas, si te mueves un poco por paginas del sector como Andro4all, donde tienen muy buenas reviews de terminales, veras que esas marcas gozan de prestigio. Repito que hay mas marcas de mucha calidad, no quiero que nadie piense que porque no las he citado no piense así, pero yo me decanto por esas. Pongo un ejemplo, Apple hace terminales de mucha calidad pero yo no compraría un Iphone, y eso no quiere decir que yo piense que son malos, pero no compraría uno ya que los precios que tienen me parecen tremendamente inflados y no me va el secretismo con respecto sus especificaciones.

 

moviles-chinos-son-rentables-L-Mq8kC1

 

Saber cuales son los mejores móviles chinos es bastante complicado, hay que tener en cuenta lo que un usuario se quiere o puede gastar en un terminal. Si dispones de 300 euros puedes tener un Xiaomi Mi5, que es un autentico pepinaco de móvil, pero no todos se quieren gastar ese dinero. Sin embargo tienes un Meizu M2 Note por unos 130/140 euros, la relación calidad precio esta muy muy bien. Hay muchísimos artículos y paginas que hablan y mucho sobre estos terminales y que están mas especializados en el tema, os dejo un enlace a un articulo que me pareció interesante, hablan sobre los mejores moviles chinos baratos y habla de varias marcas, me parece un muy buen punto de partida.

Hay muchísima información en Internet y es obvio que el hecho de tener tiendas en las que podamos “palpar” estos teléfonos antes de comprarlos puede empujarnos a dar el salto. Desde luego que yo estoy muy contento después de haber cambiado, por ahora lo único que me queda por comprobar es la durabilidad del teléfono Xiaomi que tengo, pero si os puedo asegurar una cosa, es duro. Yo soy muy torpe y se me ha caído en varias ocasiones de la mano y no tiene ni un rasguño ni se le ha roto nada.

Por supuesto que si hacéis como yo hice una vez que compre un móvil chino con apariencia estética al Iphone 4 por 22 euros en una tienda china de Internet no podéis esperar gran cosa, pero hay que tener en cuenta una serie de cosas:

  • Era un teléfono con dual sim
  • Tenia cámara de fotos
  • Tenia radio y televisión analógica
  • Admitía tarjeta microsd
  • Venia con dos baterías

Y funcionaba, se lo preste a un familiar y se rompió, pero iba bien. Vete aquí a una tienda y dile que quieres un móvil por 22 con cámara de fotos. Esto no quiere decir que fuese un móvil bueno, pero por ese precio ¿que puedes pedir?

Un saludo.

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.