Martes 27 de septiembre de 2016

Baltasar Ortega

Baltasar Ortega
KDE Blog

OpenExpo 2017, save the date: 1 de junio

Como todos los años me quiero hacer eco de OpenExpo, la Feria y Congreso anual sobre FLOSS y Open World Economy  que con esta llega a su cuarta edición. Pocas cosas sabemos de OpenExpo 2017 pero en realidad son las fundamentales: que se va a celebrar en Madrid y que será el 1 de junio del año que viene.

OpenExpo 2017, save the date

OpenExpo 2017Con más de 2000 asistentes previstos y más de 100 empresas involucradas, el próximo 1 de junio tendremos una más que intensa jornada con OpenExpo 2017, IV Feria y Congreso anual sobre FLOSS y Open World Economy.

Se trata de un evento donde en multitud de salas podemos encontrar un buen catálogo de temas relacionado con el mundo FLOSS y Open World Economy: OpenSource, Moodle, OpenStreetMaps, Bq, marketing, OpenData, Hardware Libre y un largo etcétera.

Además, recordemos que el año pasado se inauguraron los premios Open Awards 2016 y que este humilde blog ganó dicho premio al mejor medio/blog sobre Software Libre. ¿Repetiremos candidatura o premio este año? El tiempo lo dirá.

¿Qué se pretende con OpenExpo?

Los objetivos de OpenExpo 2017 siguen siendo los de loe eventos anteriores: difundir, presentar, descubrir y evaluar las soluciones y las tendencias de la industria que ofrece el Open Source & Software Libre y Open World Economy (Open Data y Open Innovation) y para ello nada mejor que montar un macroevento con un buen número de patrocinadores y empresas dispuestas a mostrar sus excelencias y a aprender unas de otras.

Pero concretando en puntos más específicos:

  • Reunir 2.000 profesionales senior del sector en solo un día: representantes de las principales empresas e instituciones, desarrolladores de código abierto, hackers, expertos, proveedores y usuarios de todos los niveles.
  • Retornar la inversión que se realiza en proyectos abiertos a través de oportunidades de exhibición, conferencias y de patrocinio.
  • Ampliar el alcance de las marcas a través de la plataforma de marketing multi-canal de OpenExpo.
  • Explicar casos de éxito, Keynotes, talleres, mesas redondas, demos y otras actividades paralelas en torno al mundo de las tecnologías libres.
  • Tener más de 100 empresas participantes que presentando sus novedades y soluciones tecnológicas.

Más información: OpenExpo 2017

Asociación LiGNUx: Tutorial para instalar la versión de mantenimiento del kernel Linux 4.7.5

Lunes 26 de septiembre de 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Tus datos en Internet, ¿están realmente seguros?

photo-1470229722913-7c0e2dbbafd3

Vivimos en un mundo conectado. Nuestros datos de usuario están en cientos de webs repartidas por el mundo. Algunas más confiables que otras. Aunque sí que depositamos nuestra confianza en ellas. Enviamos información privada casi sin preguntarnos si los desarrolladores o personal de seguridad de dicha web está realmente preparado y han hecho sus deberes. Sin preguntarnos si la empresa trata bien a sus empleados y si alguien del personal de seguridad traicionaría a todos los usuarios por una buena suma de dinero, o si un pendrive o un falso router wifi en las oficinas centrales puede causar un desastre y una filtración importante de los datos de la compañía donde tenemos nuestros datos… o si eso pasa sólo en las películas.

Bueno, estas cosas pasan de verdad, y tal vez pensemos que nuestros datos no son importantes. Aunque en los últimos meses ha habido filtraciones de muchas páginas (famosas y muy utilizadas, por ejemplo Yahoo, LinkedIn, Slack, Badoo, MySpace), con muchos usuarios que tienen sus datos comprometidos (correos electrónicos, nombres de usuario, contraseñas, actividad en web, direcciones físicas, ciudades, teléfonos, etc). Tal vez el tema de las contraseñas es más complicado porque los desarrolladores suelen estar concienciados y ahora se almacenan hashes, con sal y protegidos con algoritmos de mezclado y seguridad eficientes, pero aunque sea la norma y confiemos en que todo el mundo almacena de forma segura nuestras contraseñas, eso no es así siempre, y no es difícil encontrar alguna web que almacene todas las contraseñas de usuario en texto plano. Y que, cuando dichas contraseñas se filtran, sí podemos decir que estamos 100% expuestos.

Y es que nuestros datos cuentan con la seguridad del sitio con la seguridad más débil en el que lo hayamos dejado. Triste pero cierto, podemos preocuparnos por la seguridad de nuestros datos en decenas de sitios, pero basta con un sitio donde hayamos dejado los datos hace 10 años que no cuente con suficiente protección como para que éstos ya sean de dominio público.

Almacenando claves con hashes

Nota: ¡Quiero resumir todo en tres párrafos! Tal vez haya alguna inexactitud en esto que digo, pero acepto comentarios constructivos :)

Cuando un sitio almacena las contraseñas de manera correcta (con hashes), tenemos que tener en cuenta que esto son mecanismos de cifrado de una sola vía. Es decir, sólo podremos cifrar y no descifrar (o al menos, es muy costoso). Y, supuestamente a cada dato que podamos cifrar le corresponde un único dato cifrado, es decir, no deben existir, o al menos sea muy muy difícil encontrar varios datos a los que les corresponda un único dato cifrado.
En otras palabras, mi contraseña 12345, la almacenaré como 398k745A. De forma que cuando alguien mire nuestra clave no entienda nada, y sea muy difícil llegar al 12345 inicial. Y, por supuesto, no exista otra contraseña que genere el mismo 398k745A.

Ahora bien, cifrar estos datos con algoritmos de hash es algo muy rápido, imaginad una web en la que cientos de usuarios entran cada minuto. Algo que podríamos hacer es un ataque con fuerza bruta, es decir, conocemos el usuario, pues, probemos contraseñas, ¡como cuando en una película intentan averiguar la clave de una caja fuerte! Si lo hacemos contra una web, cada intento puede suponer algunos segundos, y muchas webs suelen restringir el acceso cuando hemos intentado varias contraseñas (como siempre, las que están bien hechas). Aunque si tenemos en nuestra propiedad el hash generado, no tendremos que enviar nada por web, sólo generar hashes y compararlos, y podemos llegar a comprobar varios miles por segundo… y eso puede llegar a ser peor porque si nuestra contraseña es mala seguramente en pocos minutos puedan averiguarla.

Pero los estudiosos de la seguridad (y matemáticos) no están quietos y a menudo descubren fallos en algoritmos de hash por lo que se puede reducir drásticamente el número de intentos necesarios para averiguar una contraseña. Y para esto están los algoritmos de sazonado (sal, salt, etc), lo que hacen es complicar un poco el hash mezclando la contraseña con otra información (aleatoria, fija o fija+aleatoria), mezclando los datos y pasando varias veces el algoritmo de hash, de tal forma que sea mucho más difícil descifrar la contraseña sin los datos añadidos (que suelen estar almacenados en otro sitio).

¡Sitios que almacenan las contraseñas en texto plano!

Os propongo un juego. Hemos visto que cuando un sitio almacena la contraseña con un hash, este no puede ser descifrado fácilmente, por lo que cuando alguien se identifica con su nombre de usuario y contraseña, el sitio lo que hace es cifrar la clave que acaban de darnos para identificarse y comparar el dato cifrado obtenido con el dato cifrado que ya teníamos del usuario. Si coinciden, ¡perfecto! el usuario entra, si no… la contraseña no era correcta.
Hasta aquí bien, hay sitios en Internet que permiten recordar la contraseña, en ellos, introduces tu correo y te envían la contraseña. Sabemos que es muy cómodo que te digan cuál era tu clave y listo, pero eso quiere decir que sí que almacenan tu contraseña en texto plano y, por tanto, no utilizan un método seguro para gestionarla. Por ejemplo, un empleado, o alguien con acceso a la base de datos puede conocer tu clave, o si las claves de la empresa se filtran, tu clave estará directamente expuesta.

Bueno, supuestamente en el año 2016, no debe haber webs que almacenen esta contraseña en texto plano. Por lo que me gustaría hacer un listado de sitios que sí lo hacen (y podemos averiguarlo, como he dicho antes porque al recordar contraseña te envían un correo con la misma contraseña que tenías.).

  • Clickxti : Es un sitio de pago por click, te envían un correo de un patrocinador y te dan menos de un céntimo por hacer click en dicha publicidad.
  • Sumaclicks : Es un sitio parecido al anterior, la última vez que lo probé tenían este problema todavía, aunque me han quitado el usuario, será por inactividad.
  • 000webhost : Alojamiento web que hasta hace pocos meses almacenaba la clave en texto plano.

Lo dicho, si encontráis más servicios que te permitan recuperar la clave en texto plano, enviádmelos, que los meto en este pequeño Hall of Shame.

Sitios inseguros

Existen sitios, que piden contraseñas, y las almacenan bien. Internamente las gestionan de forma muy eficiente y segura, pero utilizan el protocolo HTTP para comunicarse, lo que quiere decir que el tráfico hacia y desde el servidor podría ser interceptado (incluso por un amigo al que le des la clave de tu WiFi, o si estás en un punto de acceso público ya ni te cuento), es más, el tráfico viajará en texto plano, sin seguridad ni cifrado alguno, por lo que puede resultar fatal para nosotros. Ya que, aunque el servidor gestione de la mejor forma nuestros datos, la transmisión no se produce de forma correcta y puede dar lugar a filtraciones.

Y estamos hablando de sitios web, en los que podemos ver claramente HTTP o HTTPs en la cabecera de la conexión, pero… en el terreno de las aplicaciones móviles, que todo se produce de forma transparente al usuario. Es decir, la aplicación se conecta al servicio online al que pertenece y no sabemos exactamente si es HTTP o HTTPS, o cualquier otra vía de comunicación con o sin cifrado, porque la aplicación simplemente funciona… nos sorprenderíamos al ver la cantidad de información que viaja sin cifrado. Por lo que debemos intentar hacer que nuestras comunicaciones sean seguras, y si desconfiamos de algo, dar datos falsos, irrelevantes, que no nos identifiquen directamente…

Y, ¿esto en qué me afecta?

Tal vez te has registrado en varios sitios de Internet, tengas datos en la nube y, si llevas varios años en este mundillo tal vez habrá servicios web que ya tienes olvidados, cuyos mails no lees, pero están ahí y con la misma contraseña todos, una clave que sigues utilizando hoy para algunas cosas y lleva años acompañándote en tu vida online.

Por un lado, lo malo es la fuga de datos, puede que hayas introducido tu correo personal, tu dirección y teléfono (hace unos años era muy común que cuando te registraras en un sitio te pidieran casi casi hasta el DNI, o incluso). Por otro lado, muchas páginas de concursos lo siguen haciendo para enviarte el premio (no digo que no haya concursos legítimos, pero también hay algunas de dudosa reputación y poco confiables). Bueno, y si en lugar de tu contraseña también está tu respuesta a la pregunta secreta (esa que estaba tan de moda para recuperar la contraseña y que no valía nada más que para hacer el sistema un poco más inseguro).

Así que si alguna de esas páginas no es segura, o durante estos años no se ha renovado en materia de seguridad, y se filtra la base de datos de usuarios de alguna forma, esos datos ya podrían conocerse. Por otro lado, si se filtra una contraseña, ya es otra historia, porque no sólo podrían entrar en nuestro nombre en el servicio vulnerado, que en ocasiones no tiene mucha importancia (bueno, si es el caso de Yahoo, LinkedIn, GMail, puede que nos hagan daño), pero tal vez es la clave de un foro que usábamos hace tiempo pero sigue activo. Si se descubre dicha clave, un usuario atacante, seguramente quiera intentar ver si tienes una cuenta en Facebook, LinkedIn, Amazon, eBay, etc con la misma contraseña, y cuidado con Amazon y eBay que pueden tener asociados datos de pago y nos pueden hacer mucho daño.

Por esta y algunas razones más es importante utilizar una contraseña diferente y segura para cada servicio. Y si no te da la memoria, utiliza un gestor de contraseñas, úsalo en local, porque si subes a la nube el fichero de contraseñas, se puede liar muy gorda si alguien consigue descargarlo…

Segunda parte

Se alargó mucho el post y he decidido cortarlo en dos. Por un lado está esta introducción y por otro lado mostraré algunos scripts y recursos para buscar contraseñas en filtraciones, verificar si estás, o incluso comprobar si los usuarios de tu servidor de correo o tus servicios web aparecen en alguna brecha de seguridad.

Foto principal: Yvette de Wit

The post Tus datos en Internet, ¿están realmente seguros? appeared first on Poesía Binaria.

Baltasar Ortega

Baltasar Ortega
KDE Blog

Lanzado digiKam 5.2, mejorando la reducción de ojos rojos

Ya tenemos la segunda revisión de la quinta versión de digiKam, es decir, ya ha sido lanzado digiKam 5.2. Con esto ya tenemos la segunda versión seria del extraordinario gestor de imágenes que hace las delicias de los fotógrafos amateurs y profesionales, al tiempo que enorgullece a los defensores del Software Libre.

Lanzado digiKam 5.2

Con poco más de dos meses de distancia temporal entre el lanzamiento mayor de digiKam, ya tenemos entre nosotros su segunda gran revisión que destaca por el trabajo realizado por los desarrolladores solucionando los errores reportados por los usuarios, algo fundamental para el buen desarrollo de cualquier aplicación en los tiempos que corren, y en la adquisición de una nueva funcionalidad que bien seguro será de mucha utilidad para aquellos que acumulan cientos de fotografías.

Este lanzamiento introduce mejoras en el herramienta reducción de ojos rojos  ya que ahora este proceso se puede hacer combinándolo con la herramienta de detección de caras. De esta forma se puede automizar el proceso y reducir este molesto efecto de reflección de luz en nuestra retina humana. Por cierto, esta nueva funcionalidad se la debemos a  Omar Amin y a su trabajo dentro del programa Google Summer of Code 2016.

Lanzado digiKam 5.2

Esta nueva herramienta está disponible tanto en el Editor de Imágenes como en el Gestor de tareas por lotes y ha sido optimizada para ser rápida, eficiente y con un consumo mínimo de memoria. Además, el usuario puede ajustar algunos parámetros para afinar todavía más su funcionamiento.

lanzado-digikam-5-2_01

Pero no acaban aquí las novedades de este lanzamiento, ya que con la colaboración de Wolfgang Scheffner, se ha iniciado la actualización de los manuales de digiKam y Showfoto, los cuales necesitan un buen lavado de cara. Según cuentan los desarrolladores, han empezado con la descripción de las funcionalidades de digiKam 5.x ,pero evidentemente queda muchísimo trabajo por realizara y hacen un llamamiento para quien quiera contribuir con esta iniciatva.

Finalmente apuntar que este lanzamiento introduce un buen número de errores resueltos, concretamente 42 bugs solucionados, con lo que se recomienda encarecidamente la actualización del mismo. Puedes descargar el código fuente de digiKam software collection source code, los instaladores para OSX (>= 10.8) y para Windows 32/64 bits en este repositorio.

Más información: digiKam

Asociación LiGNUx: Crea tu propio gestor de contraseñas

Domingo 25 de septiembre de 2016

David González

David González
Blog Bitix

Cómo instalar y probar macOS con VirtualBox en Windows o GNU/Linux

¿Queres comprar un Mac, tienes dudas o deseas probar su sistema operativo antes? Aunque el rendimiento será menor que una máquina real y la experiencia de usuario será peor, usando un hackintosh mediante VirtuaBox ya sea con Windows o GNU/Linux podremos probarlo en detalle y hacernos una idea de su funcionamiento.

Apple
macOS

Estaría leyendo alguna noticia, ahora no me acuerdo que me despertaría la curiosidad pero me pregunté si es posible usar de forma virtualizada macOS con VirtualBox tanto en Windows como en GNU/Linux. Usar lo que se conoce como hackintosh, esto es hackear el sistema operativo Macinstosh de los equipos de Apple para que se ejecute en cualquier un dispositivo no soportado. En la página web hackintosh puede encontrarse información diversa sobre el tema como instrucciones, vídeos, comunidades, ….

Es política de Apple que su sistema operativo solo pueda ser ejecutado en sus equipos que los vende de forma conjunta a un notable precio, no se si alguien usa macOS en un sistema no Mac con garantías de que en alguna actualización el sistema deje de funcionar teniendo en cuenta la política de Apple para con sus productos.

Los pasos para instalar macOS en una máquina virtual con VirtualBox son los siguientes, hay que descargar un archivo con la imagen del disco duro de macOS y una vez creada la máquina virtual en VirtualBox ejecutar unos comandos para cambiar algunos parámetros del sistema de arranque EFI. Deberemos descomprimir la imagen del disco duro para obtener el archivo de extensión vmdk y proceder a crear la máquina virtual. Elegimos crear una máquina virtual de tipo macOS, cambiaremos algunas opciones, asignando unos 2 o 3 GiB de memoria, seleccionaremos el disco duro con la imagen vmdk descomprimida y cambiaremos la memoria asignada a la pantalla.

Configuración de la máquina virtual

Si usamos Windows deberemos ejecutar los siguientes comandos en modo administrador, sustituyendo macOS Sierra 10.12 por el nombre que le hayamos dado a la máquina virtual al crearla:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/588b2cd99be69d340c79cafb55f9b334/raw/windows.cmd">windows.cmd</pre></a></noscript>

En el caso de Linux el archivo de comandos es similar e igualmente sustituiremos macOS Sierra 10.12 por el nombre que le hayamos dado a la máquina virtual al crearla:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/588b2cd99be69d340c79cafb55f9b334/raw/linux.sh">linux.sh</pre></a></noscript>

Hecho estos dos pasos podemos proceder a iniciar la máquina virtual, veremos que empiezan a salir unos cuantos mensajes hasta que se inicia el sistema gráfico con la instalación y su asistente que constará de varios pasos.

Terminada la instalación entramos en el escritorio con el aspecto clásico y fondo de pantalla de macOS y las aplicaciones incorporadas en el propio sistema por defecto.

Como partidario del software libre y la privacidad además de los ínfimos impuestos que paga Apple usando reprobable ingeniería fiscal y su software privativo no recomiendo usar un Mac pero si alguien quiere probar este sistema operativo antes de decidirse a hacer una compra usarlo de forma virtualizado es una buena ayuda para tomar una decisión y ver si nos gusta su sistema operativo aparte del propio equipo junto con su precio que podemos ver en las tiendas. Si no nos convence ni su software ni su abultado precio podemos optar por un portátil de Slimbook mucho más económico y con características notables con los que no tendremos que pagar tampoco el impuesto Windows ya que podemos elegir entre varias la distribución GNU/Linux preinstalada que deseamos.

Deberemos tener en cuenta al probar macOS con VirtualBox que el rendimiento de la máquina virtual no será exactamente el mismo que en un equipo real por la sobrecarga impuesta por la virtualización realizada. La experiencia de usuario puede cambiar significativamente junto con el hecho de que los portátiles Mac tiene una pantalla bastante mejor y con más resolución que la mayoría de portátiles diseñados para Windows o GNU/Linux y un SSD de gran rendimiento además de la falta de su touchpad, todo esto puede marcar alguna diferencia.

SuperTux 0.5: porque el pingüino quiere seguir saltando

Un inusual (para este pingüino) artículo dominguero. Y es que tras un año de desarrollo desde la versión anterior, hoy se ha anunciado la disponibilidad de una nueva versión de este simpático juego de tipo arcade que sigue los pasos del mítico «Super Mario Bros.»: SuperTux 0.5.0 Además de corregir numerosos errores de la 0.4, […]
Baltasar Ortega

Baltasar Ortega
KDE Blog

Cómo poner en español KDE Neon, rápido y sencillo

Hoy me gustaría compartir con vosotros un truco que aprendí viendo un vídeo que ya he compartido con vosotros pero es posible que alguno de vosotros haya pasado por alto: cómo poner en español KDE Neon. Como podremos ver con más detalle si sigues leyendo, básicamente deberemos instalar unos paquetes.

Cómo poner en español KDE Neon

Cómo poner en español KDE NeonEvidentemente, un proyecto como KDE Neon todavía tiene mucho camino por delante y aunque yo lo utilizo sin apenas problemas no es algo que aconsejo a los usuarios más nobeles.

Entre sus principales errores nos encontramos con el problema del idioma. Cuando instalamos KDE Neon desde alguna imagen iso tenemos la opción de elegir el idioma, como en cualquier distribución.

Aún eligiendo español nos sorprederemos que al iniciar nuestro sistema muchas partes el mismo no está en dicho idioma como el gestor de ficheros Dolphin o el navegador web firefox. Así que deberemos hacerlo nosotros a mano.

Pues bien, CoperFix en su vídeo “Análisis de KDE NEON 16.04 con Plasma 5.7.2” que hemos comentado en el blog nos daba la solución. Básicamente debemos instalar los paquetes de idioma que los desarrolladores de KDE Neon de la siguiente forma:

  • Abrimos la consola
  • Escribimos en ella: $ sudo apt-get install kde-l10n-es

Nos pedirá la contraseña, así que la ponemos. Ahora tendremos todas las aplicaciones KDE, como el mencionado Dolphin en español, simplemente reiniciando el sistema.

No obstante, algunas otras aplicaciones no-KDE todavía estarán en inglés, así que deberemos instalar los paquetes correspondientes. Así para poner Firefox en español deberemos:

  • Abrimos la consola
  • Escribimos en ella: $ sudo apt-get install firefox-locale-es

Igual que antes, nos pedirá contraseña de root, la ponemos y reinciamos el sistema (o la aplicación, no estoy seguro)

Como vemos, algo muy sencillo que debería venir de serie pero que se les ha olvidado a los desarrolladores. Seguro que en próximos empaqutamientos ya estará solucionado.

Asociación LiGNUx: Añade tu cuenta de Openmailbox a Thunderbird de una forma sencilla

Viernes 23 de septiembre de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

Pingendo, estupendo editor gráfico para crear tu web basadas en Bootstrap

pingendo

Si buscas un editor de tipo WYSIWYG para crear páginas web Pingendo puede resultar una opción muy interesante. Aunque está pensado para la creación de prototipos para Bootstrap el resultado del diseño final es 100% funcional sin “escribir una linea de código”. Eso sí, si queremos hacer algo más avanzado nos tocará ensuciarnos con el código pero para trabajos donde prima el tiempo de entrega frente a la calidad del código es más que suficiente.

Actualmente Bootstrap es el Framework css más utilizado en la creación de sitios web de forma “rápida y ágil”.

Pingendo es una aplicación multi-plataforma y podemos hacer nuestra instalación en Linux, Windows y Mac.
En cuanto nuestro espacio de trabajo, Pingendo cuenta con tres columnas en donde se recogen todas las posibilidades del framework. En la columna izquierda tenemos acceso a elementos pre-configurados y que van desde las opciones para incluir como headers, navs, footer, section, col, row, galerías, botones de redes sociales y definir componentes como dropdowns, button groups, jumbotron, progress bars etc. La columna central muestra nuestro diseño en donde añadimos los elementos que queramos y la columna derecha nos permite definir el contenido de cada objeto o elemento, definir la configuración de nuestra hoja de estilo CSS, etc.

Finalizado el proceso de diseño, guardamos nuestro proyecto y ya lo tenemos listo para ser usado. 🙂

Más información: http://pingendo.com/

 

 

La entrada Pingendo, estupendo editor gráfico para crear tu web basadas en Bootstrap aparece primero en Ubuntizando.com.

Jueves 22 de septiembre de 2016

Más sobre notas al pie en LyX: numerando con símbolos

En un artículo anterior comenté cómo reiniciar la numeración de las notas al pie en cada página, hoy comentaré cómo hacer para cambiar esas notas al pie en símbolos y, de paso, cuento una alternativa a reiniciar la numeración en cada página que no necesita compilar el documento dos veces: el paquete perpage. Supongamos que […]

Doble beta: openSUSE 42.2 beta 2 con Plasma 5.8 beta

Hace unos días hablamos de la primer beta de Plasma 5.8, pues bien, hoy toca presentar la segunda beta de openSUSE 42.2 que incluye esta primer beta de la próxima versión de soporte extendido de Plasma New Leap Beta Adds Plasma 5.8 Beta openSUSE Leap 42.2 vendrá con la primer versión «LTS» (Long Term Support) […]

Martes 20 de septiembre de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

Construye la máquina recreativa más pequeña del mundo con Raspberry Pi Zero

En los 80 y buena parte de la década de los noventa me pasaba horas jugando a marcianitos con los amigos. Supongo que por esa razón todavía cuando veo una recreativa siento ganas de echar una partidita y si por mi fuera tendría una máquina en el salón de mi casa para pasar el rato pero la mayoría son de gran tamaño no aptas para nuestros diminutos hogares.

Tempest in a Teacup es la creación de Phillip Burgess y se trata posiblemente, viendo sus dimensiones -mide 67,2×33,6×35,8 milímteros- de la máquina recreativa más pequeña del mundo. No parece muy recomendable para jugar a gusto con tus videojuegos preferidos pero es un buen detalle para construir por ti mismo o regalar y quién sabe si algún día será un objeto de culto como ya lo son los juegos que puede emular.

tempestinateacup

La Tempest in a Teacup está montada sobre una Raspberry Pi Zero y una diminuta pantalla OLED de 2,4 centímetros de diagonal, cuenta con una versión de Linux como sistema operativo y el emulador MAME para poder correr cualquier juego compatible.

Personalmente creo que ya no tengo escusas para tener una recreativa en el salón. 😉

Fuente: voltaico

La entrada Construye la máquina recreativa más pequeña del mundo con Raspberry Pi Zero aparece primero en Ubuntizando.com.

Lunes 19 de septiembre de 2016

Miguel Parada

Miguel Parada
Ubuntizando.com

La evolución de Internet en una Infografía interactiva

evoluciondelaweb

Aunque ya tiene cierto tiempo esta fotografía interactiva sigue siendo un recurso muy interesante para entender cómo ha ido evolucionando la web, sus navegadores y qué tecnologías se han ido incorporando. Su funcionamiento es muy intuitivo. Solo es necesario pasar el ratón por cada una de las líneas de color para conocer con más detalle la historia de esa tecnología o ver a qué navegadores afecta.

También es un buen recurso para conocer la historia de los navegadores modernos así como el crecimiento de la red desde sus orígenes.

Más información: http://www.evolutionoftheweb.com/

La entrada La evolución de Internet en una Infografía interactiva aparece primero en Ubuntizando.com.

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Crea tus propias webs dinámicas en C++ de forma fácil y usando plantillas para no compilar a cada cambio

Screenshot 12-08-2016-020848
Esto forma parte de un pequeño proyecto que mantengo desde hace algo más de un año. El objetivo es crear un sistema con el que servir webs desde C++, que sea más o menos fácil de mantener y generar, flexible, que soporte enrutadores, plantillas, hosts virtuales con el fin de poder utilizarlo para diferentes tipos de aplicaciones a modo de panel de control web.

Sobre todo está pensado para aplicaciones internas y no para desarrollos web públicos, por temas de seguridad y rendimiento cuando la carga aumenta considerablemente, aunque sí que podría ser utilizado sin problemas en segundo plano por nuestras aplicaciones web por eso de que en ciertas operaciones, un programa hecho en C++ rendirá mucho mejor que cualquier Javascript, Java, PHP, etc. Será más difícil de hacer y optimizar, pero correrá con más soltura y aprovechará la memoria de manera más eficiente.

Para conseguir esto, he utilizado dos proyectos de los que ya os he hablado en el pasado: Glove, que es una envoltura para sockets en C++11 con el que podemos crear un servidor web rápidamente (GitHub) y Silicon, un sistema de plantillas que nos permite separar la salida web de nuestro código en C++ (y eso nos permite también hacer pequeños cambios en la salida sin tener que compilar de nuevo). (Github).

Ambos proyectos están juntos para poder probarlos desde un proyecto en GitHub llamado SiliconGlove, de todas formas, aquí explico un poco cómo funciona todo.

El sistema tiene poco más de 100 líneas (sin contar las plantillas, que hice basándome en el tema StartBootstrapLandingPage.

Inicialización

Lo primero que tenemos que hacer es iniciar el servidor web con esta línea:

1
GloveHttpServer serv(8080, "", 2048);

Creamos el objeto serv, que será nuestro servidor. En este caso, trabajaremos en el puerto 8080. El segundo parámetro será la IP desde la que escuchamos, con lo que podemos limitar la escucha a un dispositivo concreto (si tenemos varios dispositivos de red), y el tercer parámetro será el tamaño del buffer, podremos jugar con este parámetro para conseguir mejores resultados, pero 2048 no es un mal valor).

Luego, debemos inicializar el sistema de plantillas, en este caso, estableceremos las rutas internas de css y js (para encontrarlos fácilmente, así como establaceremos ciertos valores por defecto. Todo esto, si miramos el proyecto en GitHub, lo podremos ver dentro de la función setypSiliconGlobals():

1
2
3
4
5
6
7
8
9
10
11
  SiliconWeb::load();
  SiliconWeb::cssUrl("css");
  SiliconWeb::jsUrl("js");
  Silicon::setMaxBufferLenGlobal(65535);
  Silicon::setGlobalKeyword("TwitterLink", "https://twitter.com/gasparfm");
  Silicon::setGlobalKeyword("GithubLink", "https://github.com/gasparfm/siliConGlove");
  Silicon::setGlobalKeyword("LinkedInLink", "https://es.linkedin.com/pub/gaspar-fernández/14/563/537");
  /* Don't render JS and CSS immediately */
  Silicon::setGlobalKeyword("_renderResources", "0");
  Silicon::setGlobalKeyword("PageTitle", "glove+siliCon test");
  Silicon::setGlobalKeyword("WebAuthor", "Gaspar Fernández");

Para Silicon tenemos otro buffer de datos y, si vemos que el tamaño de nuestras plantillas aumenta mucho, debemos pensar en aumentar este valor de 65535. Esto existe para optimizar un poco en tiempo y en memoria el sistema. Casi todas las palabras clave dentro de setGlobalKeyword() serán palabras que se sustituirán directamente en la plantilla, es decir, cuando en la plantilla llamemos a TwitterLink, saldrá mi enlace de Twitter automáticamente. Aunque encontramos valores con una barra baja (_) delante que serán configuraciones del sistema de plantillas, por ejemplo _renderResources, define si un recurso se pinta nada más llamarlo o no. En este caso, como no se pintan, podemos acumular todos los JS y CSS dentro de las plantillas, y sólo se harán efectivos cuando llamemos a una orden específica para pintarlos. Lo veremos más adelante.

Enrutador

Una parte importante de un sistema web, si no queremos sufrir mientras lo implementamos es un enrutador. Ya que todas las peticiones web entrarán al mismo sitio, tenemos que definir quién procesará cada una y es este enrutador el que se encarga de ello. Debemos definir qué hacer cuando llamemos a http://host/css/xxxx , http://host/js/xxxx , http://host … para ello podemos definir qué función se llamará para procesar cada una de las llamadas, de la siguiente manera:

1
2
3
4
5
6
7
8
  serv.addRoute("/", webIndex);
  serv.addRoute("/hello/$anycon/$anything", hello);
  namespace ph = std::placeholders;
  serv.addRoute("/css/$filename", std::bind(GloveHttpServer::fileServerExt, ph::_1, ph::_2, "resources/css/"));
  serv.addRoute("/fonts/css/$filename", std::bind(GloveHttpServer::fileServerExt, ph::_1, ph::_2, "resources/fonts/css/"));
  serv.addRoute("/fonts/fonts/$filename", std::bind(GloveHttpServer::fileServerExt, ph::_1, ph::_2, "resources/fonts/fonts/"));
  serv.addRoute("/js/$filename", std::bind(GloveHttpServer::fileServerExt, ph::_1, ph::_2, "resources/js/"));
  serv.addRoute("/img/$filename", std::bind(GloveHttpServer::fileServerExt, ph::_1, ph::_2, "resources/images/"));

Así cuando llamemos a la web principal, lo procesará una función llamada webIndex (la veremos más adelante). Aunque esto no tiene gracia si las rutas fueran fijas, es decir, si definimos /css/estilos.css y tuviéramos que procesarlo de forma fija, siempre, porque si incluimos varios archivos css en la misma ruta deberíamos definirlos uno a uno. Por ello, si introducimos un símbolo de dólar ($) en la ruta, el sistema lo tomará como una palabra clave. En otras palabras, se creará un parámetro dinámico al que nos referiremos como ‘anycon’, ‘anythink’, o ‘filename’, y luego la función que procese la petición sólo tendrá que jugar con el nombre que le hemos dado a la palabra clave. Esto nos puede dar mucha flexibilidad (luego veremos lo fácil que es desde la función hello).

Por otro lado, el sistema tiene funciones predefinidas, como servir un fichero directamente. Si es un CSS/JS y no vamos a hacer nada con él, lo podemos devolver directamente, para ello tenemos la función fileServerExt(). En este caso, con bind() le pasamos un argumento extra al callback, en este caso la ruta donde de verdad se encuentra el archivo. Con esto, aunque a nuestro servidor le pidan algunos archivos desde /fonts/css/fuente.ttf , en realidad lo estaremos pidiendo a resources/fonts/css/fuente.ttf , por lo que nuestra aplicación puede tener todo mucho mejor organizado.

Sirviendo el index

Para servir el index, en este caso, sólo tenemos que cargar un archivo de plantilla base (layout), sera una plantilla general para todas las subpáginas, aunque ahora sólo tenemos una, y luego cargará una plantilla específica para la página actual. Además, definiremos palabras clave locales para nuestra plantilla (cuando ésta se procese, se juntarán las palabras clave locales y las globales). Para servir la página haremos lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void webIndex(GloveHttpRequest &request, GloveHttpResponse& response)
{
  Silicon s = Silicon::createFromFile("index.html", "templates");
  s.setKeyword("PageSection", "Home");
  s.setKeyword("SectionsBase", "");
  try
    {

      /* setLayout soon will be global too, so we will be able to
     do it just once. */

      s.setLayout("layouts/mainLayout.html");
      response << s.render();
    }
  catch (SiliconException e)
    {
      response.code(500);
      response.responseVar("errorMessage", std::string("There was a problem: ")+e.what());
    }
}

Cogiendo palabras clave del enrutador

Esto lo podemos ver en la función hello():

1
2
3
4
5
6
7
8
9
10
11
void hello(GloveHttpRequest &request, GloveHttpResponse& response)
{
  std::cout << "TESTING"<<std::endl;
  response << "You are here: "<<request.getLocation()<<"\n";
  for (auto x : request.special)
    {
      std::cout << "ARG "<<x.first<< "=>"<<x.second<<"\n";
    }
  response << "This is the response\n";
  response << "This is another tesxt" << std::endl;
}

Vemos que request, tiene una variable llamada special con la que accede a las palabras clave del enrutador. En este ejemplo, las listamos, pero podríamos poner perfectamente:

1
std::cout << request.special["anycon"] << std::endl;

Y esto nos puede ayudar a tener ordenados los argumentos de entrada, comprobar que se pasan y procesar una salida adecuada.

Plantillas

Dentro de las plantillas, podemos incluir CSS y JS donde queramos:

{!includeCss file=”bootstrap.min.css” /}
{!includeCss file=”landing-page.css” /}
{!includeCss file=”http://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic” /}
{!includeJs file=”jquery.js” /}
{!includeJs file=”bootstrap.min.js” /}

Del mismo modo, podemos hacer el render de CSS y JS donde queramos (porque _renderResources vale 0:





{!renderCss/}

Y, como también vemos, incluir variables con {{nombreDeVariable}}. Del mismo modo, si estamos en una plantilla base o layout, podemos incluir la información procesada de la plantilla de sección si incluimos {{contents}} , el texto se puede configurar si desde nuestro programa en C llamamos a setContentsKeyword().
Incluso incluir otras plantillas:

{!block template=”blocks/nav.tpl”/}

Sólo queda compilar, en el proyecto en GitHub, tenéis un ejemplo de Makefile que podéis utilizar para hacer pruebas rápidas.

Cosas que se pueden hacer

Aunque en el ejemplo sólo se demuestran enrutadores y plantillas, en Glove, se pueden utilizar conexiones seguras HTTPS (sólo hay que introducir los certificados), siliCon soporta la creación de funciones para procesar contenidos, condiciones, colecciones y muchas más cosas que nos harán el desarrollo mucho más fácil. Sólo tenemos que ver los ejemplos incluidos en los dos proyectos.

Si queréis un panel de control para vuestros proyectos, os recomiendo echarle un ojo a la plantilla AdminLTE. Tiene muchas características interesantes y podemos integrarla perfectamente dentro de Glove+Silicon para nuestros sistemas de control.

Un extra más

Si queremos incluir dentro de nuestro proyecto web una llamada a Glove. Por ejemplo, desde una web de producción, o desde un subdominio. Una forma muy recomendable de hacerlo es, por ejemplo, a través de Apache. De esta forma, Apache se encargará de la seguridad en las peticiones, y de pasarnos sólo lo que debe (sin que el usuario final interactúe directamente con nuestro programa), además, podemos tener varios servicios corriendo y acceder a ellos desde una misma dirección web (sin necesidad de cambiar puertos).

Para ello tenemos que activar en Apache los módulos proxy y proxy_http:

sudo a2enmod proxy
sudo a2enmod proxy_http
Considering dependency proxy for proxy_http:
Module proxy already enabled
Enabling module proxy_http.
To activate the new configuration, you need to run:
service apache2 restart

Y dentro de nuestro VirtualHost añadir la línea que comienza por ProxyPassMatch:

ServerAdmin webmaster@localhost
DocumentRoot /home/gaspy/www
ProxyPassMatch ^/glove/(.*)?$ http://127.0.0.1:8080/$1

De esta forma, nosotros, desde fuera, accederemos a http://localhost/glove/ y Apache, internamente, accederá a http://localhost:8080. Así, podemos cerrar el puerto 8080 para prevenir ataque externos.

The post Crea tus propias webs dinámicas en C++ de forma fácil y usando plantillas para no compilar a cada cambio appeared first on Poesía Binaria.

Viernes 16 de septiembre de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

Nuevo proyecto a la vista

Hace ya mucho tiempo que estoy sin trabajo fijo, como muchas personas en este país, y eso hace que haya que tomar decisiones, y yo he tomado una. Llevaba meditándola bastante tiempo y, por fin, ha llegado el momento. La decisión que he tomado es la de dedicarme a diseñar paginas web para empresas, particulares, asociaciones y cualquiera que precise una. Ademas, como alternativa, también me ofrezco a arreglar ordenadores, de algo me tiene que servir ser el servicio técnico durante mas de 20 años de muchas personas de mi alrededor.

Hace, mas o menos, unos cuatro o cinco años que estoy en este mundillo y me gusta mucho. Ademas he hecho algunas webs por mi cuenta y que están online, ademas de las mías y de las que he hecho en mi servidor web local para aprender. Esto es lo que ofrezco, mi experiencia. Dado que mi formación académica no es la necesaria como para presentarme en una empresa de diseño web me tengo que buscar las habichuelas por mi cuenta y eso es lo que voy a hacer.

Estos días estoy trabajando en una pagina web que me servirá para mostrarla como una especie de curriculum por Internet, para ello he estado mirando webs de otros diseñadores como la de Jose, que se dedica al diseño web en Pamplona, una ciudad que esta relativamente cerca de donde yo vivo. La verdad es que he visitado muchas webs para tomar ejemplos de diseño y estructura. Me daré de alta en sitios web en los cuales pueda conseguir trabajo como freelance y ademas me voy a poner a patear las calles y y los comercios para ofrecer mis servicios.

Precisamente me gustaría pediros opinión sobre la web que estoy haciendo. Todavía no la he terminado, espero que a mediados de la semana que viene ya este completa. En ella hablo de los servicios que ofrezco, muestro algunas de las webs que he hecho y voy a poner un catalogo de paginas de ejemplo para mostrar a los clientes en caso de que lo pidan. Tambien ire cogiendo ejemplos de diseño, hay sitios donde tomar ideas como Behance, hay muchos mas pero os pongo ese de ejemplo.

No se si seguiré las pautas adecuadas, la verdad es que estoy muy nervioso con el tema, pero espero acertar y que pueda sacar un sueldo digno haciendo el trabajo que tanto me gusta hacer, varios amigos en el pasado y en el presente me han preguntado por que no me dedico a ello con los conocimientos y experiencia que tengo, espero que tengan razón y que las cosas me salgan bien.

Ademas ofrezco servicios de SEO, todo lo que he leído acerca del tema, lo que he probado en mi web y lo que he aprendido tratando con empresas de marketing para los post patrocinados que he publicado ha dado como resultado que sea capaz de posicionar muchos de mis artículos en la primera pagina de resultados de búsqueda de Google y muchos aparezcan en la primera posición de la primera pagina. Incluso he hecho, en mas de una ocasión, la siguiente prueba. He cogido un tema, he realizado búsquedas en Google y he anotado los resultados, después he escrito mi articulo y lo he publicado y se ha “colado” en la primera posición anteponiéndose a artículos que llevaban tiempo en ella, y eso en uno o dos días después de ser publicado. Por esto creo que las técnicas SEO que aplico son correctas. Ademas han sido muchos los lectores que me han dicho que al buscar cosas sobre la temática de este blog siempre acaban aquí, lo cual respalda las pruebas hechas por mi mismo.

En los próximos días, cuando tenga terminada la web propia, os diré la dirección para que la echéis un vistazo y me deis, si me hacéis ese favor, vuestra opinión al respecto.

Un saludo a todos.

Martes 13 de septiembre de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Nuevos capítulos de la serie Eloquent (Laravel)

Esta semana he subido a Gulvi dos nuevos capítulos del curso de Eloquent (el ORM de Laravel):

Y también tenéis un nuevo vídeo de introducción a Eloquent.

Gulvi

Lunes 12 de septiembre de 2016

Gaspar Fernández

Gaspar Fernández
Poesía Binaria

Cómo empotrar datos dentro de un ejecutable hecho en C

photo-1453179592584-e2587867cfff

En nuestras andanzas como programadores, seguro que nos hemos encontrado alguna vez en esta situación. Tenemos un programa que vamos a distribuir, pero que tiene ciertos archivos asociados (imágenes, texto, scripts, etc) que deben ir junto con el programa.
En un primer momento podemos distribuir los archivos junto con el programa, y es una buena solución hasta que a alguien le da por cambiar esos archivos y consiguen que nuestro programa haga cosas diferentes a aquellas para las que ha sido pensado originalmente.

Esto se ha hecho durante años para almacenar este tipo de recursos, incluso algunos IDEs y compiladores lo hacen sin que nosotros hagamos nada. Pero somos valientes, y lo haremos con GCC.

Un poco más de contexto

Tal vez para imágenes no sea demasiado crítico, pero sí para código. Es decir, muchas veces, aunque hagamos un programa en C, éste a su vez tendrá fragmentos programados en LUA, Python, AngelScript, o incluso SQL. Y claro, si incluimos estos scripts en el código estamos forzando a recompilar el programa cuando hay un cambio en estos scripts, cosa que puede tardar mucho, y no es necesaria (lo mismo pasa con iconos, imágenes, etc).
Con recompilar el programa, me refiero a compilar un archivo .c o lo que es peor, realizar un cambio en un .h que se incluya en varias partes. Si habéis trabajado con algún programa grande, sabréis a lo que me refiero, un pequeño cambio puede suponer tener parado el ordenador varios minutos.

Lo que podemos hacer, es que en modo depuración, los recursos se lean desde los archivos externos, pero cuando el programa sea definitivo se lea de lo que tenemos almacenado en el ejecutable.

Un primer ejemplo

Vamos a empezar empotrando un pequeño texto dentro de un archivo ejecutable. Para ello, nos serviremos tanto de GCC como de objcopy. Es importante saber que este método sólo funcionará con GCC/G++, con otro compilador, debemos hacer las cosas de otra manera.
Lo primero será hacerlo con archivos de texto, para ello, crearemos un archivo llamado (pruebas.txt) y escribiremos dentro un texto.
Luego haremos este programa en C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

extern char _binary_pruebas_txt_start;
extern char _binary_pruebas_txt_end;

int main(int argc, char* argv[])
{
    char* c = &_binary_pruebas_txt_start;

    printf ("------------- Datos empotrados en mi ejecutable ----------\n");
    while (c != &_binary_pruebas_txt_end)
        printf("%c", *c++);
    printf ("--------- Fin de datos empotrados en mi ejecutable --------\n");
   
    return 0;
}

Ahora vamos a compilar el archivo pruebas.txt y el ejecutable:

objcopy --input binary --output elf64-x86-64 --binary-architecture i386 pruebas.txt pruebas.o
gcc -c main.c
gcc -o main main.o pruebas.o

Y listo, cuando lancemos ./main nos escribirá en pantalla el mensaje que tenemos configurado.

Eso sí, tenemos que tener especial cuidado con la arquitectura. Este ejemplo es para x86-64, si quisiéramos una salida para x86 en 32bit pondríamos elf32-i386.

Otro pequeño ejemplo con idea

Contamos con que no manipulen nuestro archivo ejecutable cambiando los datos que contiene, aunque podríamos introducir mecanismos como hacer que los primeros bytes sean un hash y cuando arranque nuestro programa comprobar que todo está bien. Pero este tipo de cosas puede servirnos para rellenar información en un struct, por ejemplo:

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

extern char _binary_struct_data_start;
extern char _binary_struct_data_end;

struct TDatos
{
    uint32_t id;
    char url[100];
    char nombre[100];
};

int main(int argc, char* argv[])
{
    struct TDatos datos;
   
    char* c = &_binary_struct_data_start;
    memcpy(&datos, c, sizeof(struct TDatos));

    printf ("ID: %d\n", datos.id);
    printf ("URL: %s\n", datos.url);
    printf ("Nombre: %s\n", datos.nombre);
   
    return 0;
}

Eso sí, ahora tenemos que hacer un archivo binario en el que incluyamos:

  • 4 bytes (ID, un número, que tal vez en texto sea ilegible).
  • 100 bytes de texto (url, hay que tener cuidado y meter un terminador, 0x00 cuando termine el texto).
  • 100 bytes de texto (nombre, incluyendo un terminador como antes).

Podemos generar el fichero de datos de varias maneras: una de ellas sería creando otro programa en C que escriba los datos en un archivo binario, otra forma puede ser utilizar un editor hexadecimal, como el pantallazo que muestro a continuación (Sí, es Emacs como editor hexadecimal, que Emacs vale para todo):
Screenshot 12-09-2016-020913.
Luego llamamos a este archivo struct.data, creamos el objeto con objcopy y compilamos el programa enlazando el objeto. El resultado será algo como:

objcopy --input binary --output elf64-x86-64 --binary-architecture i386 struct.data struct.o
gcc -c main.c
gcc -o main main.o struct.o
./main
ID: 65
URL: http://totaki.com/poesiabinaria
Nombre: Poesía Binaria

Alternativa para depuración

Si queremos hacer, como dije al principio que el dato se coja de un archivo sólo si estamos en modo depuración y si no, se coja del ejecutable, debemos hacer algo como esto (es una idea, nada más, no está optimizado ni nada):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#define DEBUG 1
#define FREE_RESOURCE(res) if (DEBUG) free(res)
#define GET_RESOURCE(res, tam, resource_name)                                                       \
    {                                                                                                                                           \
        if ( (DEBUG) && (file_exists(# resource_name ".data")) )                        \
            tam = get_resource(&res, # resource_name ".data");                              \
        else                                                                                                                                \
            {                                                                                                                                   \
                res = & _binary_ ## resource_name ## _data_start;                               \
                tam = (& _binary_ ## resource_name ## _data_end) -                          \
                    (& _binary_ ## resource_name ## _data_start);                                   \
            }                                                                                                                                   \
    }


extern char _binary_text_data_start;
extern char _binary_text_data_end;

/* Existe el archivo ? */
short file_exists(char *filename)
{
    FILE* fd = fopen(filename, "r");
    if (fd)
        {
            fclose(fd);
            return 1;
        }
    else
        return 0;
}

size_t get_resource(char** res, char* filename)
{
    FILE *f = fopen(filename, "rb");
    printf ("%p\n", f);
    fseek(f, 0, SEEK_END);
    size_t fsize = ftell(f);
    fseek(f, 0, SEEK_SET);  //same as rewind(f);

    *res = malloc(fsize + 1);
    fread(*res, fsize, 1, f);
    fclose(f);

    (*res)[fsize] = 0;
    return fsize;
}

int main(int argc, char* argv[])
{
    char* data;
    long tam;
    GET_RESOURCE(data, tam, text);
    printf ("El recurso ocupa: %ld\n", tam);
    printf ("Datos: %s\n", data);
    FREE_RESOURCE(data);                    /* Sólo libera memoria cuando estamos en depuración */
   
    return 0;
}

Y el fichero texto.data podrá contener lo que queráis. En este caso veremos que cuando compilamos y DEBUG es 0, SIEMPRE cogeremos la información empotrada en el ejecutable, pero cuando DEBUG vale 1 y además el fichero texto.data existe, leeremos el fichero y cogeremos de ahí la información. Si cuando dejamos de utilizar el recurso llamamos a FREE_RESOURCE, liberaremos el puntero que se reserva en modo depuración, pero en real no hace nada.

Nota de la foto: ¿Por qué frutas? Considero trozos de datos o información a las frutas, y cada una de ellas debe ser empotrada en un ejecutable sin perder sus propiedades.

Foto: Roman Davayposmotrim

The post Cómo empotrar datos dentro de un ejecutable hecho en C appeared first on Poesía Binaria.

Sábado 10 de septiembre de 2016

Liher Sanchez

Liher Sanchez
El blog de Liher

Los vascos queremos software libre, ayudanos a conseguirlo con una simple firma

Ayer estaba revisando mis correos y vi uno que me llamo la atención de Víctor en el cual hablaba de un proyecto mediante el cual se están recogiendo firmas para que las instituciones vascas usen software libre. Podéis visitar su articulo en el siguiente enlace:

Por supuesto recomiendo leer este articulo y todos los que escribe Víctor, tiene un blog realmente genial. La idea en si misma es bastante sencilla pero realmente complicada de llevar a cabo por varios motivos, pero el apoyo que le podemos dar apenas nos llevara un minuto de nuestro tiempo y puede resultar un empuje para el proyecto, que por cierto me hace mucha ilusión ya que yo vivo en el País Vasco, que es donde se pretende potenciar el uso del software libre mediante esta iniciativa.

No voy a decir nada nuevo ya que todos sabemos la situación económica en la que vivimos desde hace tiempo y los políticos no hacen mucho llevándonos a unas terceras elecciones generales, que lo único que va a suponer es gastar mas dinero de las arcas publicas por que no se pongan de acuerdo.

No hay que ser un genio en matemáticas para saber que si en vez de comprar las licencias que se adquieren de Windows y Office usaran Linux y Libreoffice, entre otros programas, el ahorro seria considerable y creo, aunque solo lo creo, que deberían preocuparse un poco por la economía, y mas si cabe en los tiempos que corren.

Sin mas, no quiero meterme mas en dar mi opinión sobre el trabajo que realizan los políticos pero si en pediros vuestra ayuda para que, por lo menos, de nuestra parte hagamos todo lo posible. Lo único que tenéis que hacer es acceder a la pagina del proyecto en el siguiente enlace:

Según accedáis a la web podéis leer el manifiesto y las intenciones que tienen. En el menú tenéis acceso para ver las personas que han firmado y en la parte inferior podéis firmar vosotros, es una firma digital en la cual solo tenéis que poner vuestro nombre, email, un código de verificación y pulsar un botón, son apenas unos segundos y el apoyo se notara. A la redacción de este articulo hay 624 firmas, espero que sean muchas mas en adelante.

Un saludo a todos.

Viernes 09 de septiembre de 2016

David González

David González
Blog Bitix

Artículo #2 de Yo apoyo al software libre

Recibidas nuevas transferencias de Google y Amazon por la publicidad AdSense y los enlaces de afiliado respectivamente que incluyo en esta bitácora he realizado unas pequeñas nuevas donaciones económicas a varios proyectos de software libre que uso habitualmente.

Firefox
Wikipedia

En diciembre de 2015 escribía un artículo sobre la primera donación económica que hacía un proyecto de software libre. En esa primera donación compré un par de camisetas a la Free Software Foundation Europe o FSFE. Pasados ocho nuevos meses desde entonces me llegó una nueva transferencia de Google por la publicidad AdSense que incluyo en esta bitácora de alrededor de 80€, hace unos meses recibí otra por los enlaces de afiliado de Amazon que en este caso fue de alrededor de 25€. Como la bitácora no me genera ningún tipo de gasto ni para el hospedaje ni para el dominio (salvo buena parte de mi tiempo, que no es poco) me planteo hacer una nueva donación a algún proyecto o algunos proyectos.

Pensando que proyectos serían los siguientes y que cantidad me he decidido por los siguientes Arch Linux, Arch Linux ARM, Firefox y Wikipedia con 10€ cada uno para un total de 40€, que al final solo han sido 20€ porque el medio para hacer el pago utilizando de Software in the Public Interest tanto en Arch Linux como en Arch Linux ARM por algún motivo no me acepta la tarjeta bancaria virtual, en la siguiente donación quizá lo intente de nuevo o de otra forma por ejemplo comprando una camiseta en FreeWear.

Como sistema sistema operativo uso GNU/Linux y la distribución Arch Linux tanto a modo personal en mi portátil y en el trabajo y a pesar de ser una distribición rolling release o en constante actualización raras han sido las veces que he tenido algún problema desde hace ya más de 6 años. Esta es la distribución con la que al final personalmente he acabado más contento después de pasar por Fedora, Debian y Ubuntu. Arch Linux ARM lo utilizo en una Raspberry Pi 1 modelo B (la que tiene 256 MiB de memoria) para hacer descargas y también muy contento ya que tampoco me da problemas. Firefox es el navegador de mi preferencia después de una no muy extensa época usando Chromium, lo uso a modo personal y en el trabajo como desarrollador web. Finalmente, aunque no sea un proyecto de software libre es un proyecto colaborativo de libre acceso y desde hace tiempo una gran fuente de conocimiento acumulada de la que suelo incluir muchos enlaces en esta bitácora, es la Wikipedia.

Las cantidades que he donado no son muy elevadas pero espero que ayuden a estos proyectos a continuar su desarrollo y seguir mejorando. Esta de las pocas veces que «pago» algo por el software que utilizo exceptuando las veces en las que lo he hecho por el impuesto Windows.

Hubo una época que usaba el sistema operativo de Microsoft sin licencia de Windows XP. Hoy en día Windows 10 y Office 2016 siguen siendo fáciles de usar sin licencia un buen porcentaje de usuarios tampoco pagará por el software que usa lo que en realidad afecta negativamente al software libre ya que le impide ganar cuota de uso. El software libre no es sinónimo de gratis, aunque en la mayoría de los casos lo es, sino que proporciona a sus usuarios las 4 libertades explicadas en ¿Qué es el software libre?.

Estas son las pruebas fehacientes que muestran las donaciones que he hecho a los dos proyectos anteriores.

Donación Mozilla
Donación Wikipedia

Probablemente dentro de alrededor de otros 8 meses cuando reciba nuevas transferencias de Google y Amazon haré una nueva donación a otra serie de proyectos que uso quizá en ese caso a LibreOffice, VLC, GNOME, GIMP, … o lo intente de nuevo con Arch Linux. Y estos serán proyectos muy conocidos que no necesiten tanta colaboración económica seguro que hay muchos proyectos menos conocidos pero muy importantes que también necesitan financiación.

Puede que ni siquiera uses GNU/Linux o software libre pero al visitar esta bitácora puedes considerar que tú también has colaborado con el software libre ;) y simplemente usarlo o promocionarlo ya es una buena forma de apoyarlo. Si lo hicieses, ¿a que proyectos harías tú una donación?

Yo apoyo al software libre

Miércoles 07 de septiembre de 2016

BlogDRAKE: La comunidad en estos momentos

Lunes 05 de septiembre de 2016

José María Morales Vázquez

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

Probando el Aruba Cloud Server Smart de 1€

hosting Por fin he tenido tiempo de hacer una primera prueba medianamente seria con mis nuevos VPS de Aruba y, para matar dos pájaros de un tiro, he instalado una instancia de Chamilo LMS para evaluar si me sirve como aula virtual para el curso de este año. He usado el VPS más pequeño de la familia: el de 1Gb de RAM y 1 core de CPU por 1€ al mes. Además, si funcionan bien el hecho de que ofrezcan dos meses gratis me permitirá usarlo con mis alumnos para algunas prácticas sin necesidad de que realicen desembolso alguno. Si, los que tenemos poco tiempo disponible tenemos que aprovechar al máximo el que tenemos 🙂

No voy a describir todo el proceso en detalle y con pantallazos porque es bastante fácil e intuitivo (casi siempre) y si ya has trabajado con algún otro VPS no tendrás problemas. Lo primero que tienes que elegir una vez has hecho login es el datacenter dentro del cual quieres crear tu máquina. Yo escogí uno de los dos italianos porque es un Tier IV y eso mola y porque tiene un 100% de uptime desde su creación en 2011. Posiblemente el francés me daría mejores respuestas desde nuestro país, pero ya tendré tiempo de probarlo. Luego eliges el tamaño de VPS y el sistema operativo a instalar y a esperar. Aquí me he encontrado los dos primeros “inconvenientes”. Por un lado, dentro la lista de sistemas operativos a elegir sólo hay tres opciones de 32 bits (os recuerdo que instalar un sistema operativo de 64 bits en una máquina con menos de 4 gigas de RAM es bastante ineficiente): debian 7, CentOS 6 y Ubuntu 12.04, todas ellas obsoletas… Así que como mi idea era trabajar con Debian 8 instalé la versión de Debian 7 32 bits con idea de usar luego el procedimiento estándar de upgrade. En una máquina nueva y sin dependencias ni software actualizado no debería de dar problemas y, efectivamente, no lo hizo.

El segundo inconveniente fue que la creación de la máquina virtual tardó más de lo que me esperaba. Alrededor de una hora o tal vez algo mas. Ya sabeis como es la impaciencia en estas cosas. Nos pasamos meses pensando en cambiar de hosting y en elegir el adecuado y luego queremos una instalación en segundos 🙂 Pero una vez instalada todo fue como la seda. Hice un login en mi Debian 7, seguí el procedimiento que he enlazado antes y todo listo. Y este es el aspecto que presenta el panel de control web de la VPS (Como siempre, pulsa sobre las imágenes para verlas con mayor calidad):

Panel de control de Aruba Cloud

Como se aprecia, la solapa de “Edit/Upgrade” aparece deshabilitada. Esto es debido a que sólo se puede actualizar la máquina cuando está apagada y, según pone en las FAQs, hacia un modelo mayor.

La primera comparación inevitable con mi anterior hosting es la relativa a los componente virtualizados. Para evaluar esto de forma gráfica instalé phpsysinfo. Estos son los resultados obtenidos:

phpsysinfo en el Aruba Cloud Smart de 1Gb

Y estos los de mi hosting de Gigas (con dos cores y 4 Gigas de RAM). Como se ve, la CPU virtualizada en Aruba Cloud es superior a la que nos proporciona Gigas. Ya veremos si esto se mantiene (o mejora) cuando probemos un VPS de dos cores.

phpsysinfo en el VPS de Gigas

Para monitorizar los recursos he instalado munin y por el momento todo parece muy estable. Lógicamente la máquina apenas ha tenido uso estos días, así que no hay sorpresas con esto. Ya os contaré que tal va cuando se enfrente a una carga moderada:

munin en el Aruba Cloud Smart de 1Gb

Y poco mas. Lo siguiente será trasladar este blog a un VPS más robusto o, incluso, haciendo una separación en dos capas. Ya veré. Y queda pendiente también que os cuente mis primeras impresiones con Chamilo y la configuración necesaria para que funcione con nginx, que no es trivial. Para la próxima. Salud y bienvenidos de vuelta al curso 😉

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: Probando el Aruba Cloud Server Smart de 1€ || Hospedado en un Cloud VPS de Gigas.

Sábado 03 de septiembre de 2016

David González

David González
Blog Bitix

Localización de un comando y paquete propietario de un archivo en GNU/Linux

Arch Linux

Usando alguna distribución GNU/Linux en algún momento nos interesará saber a qué paquete de los que tenemos instalados pertenece un determinado comando o a qué paquete pertenece un determinado archivo del sistema.

Para saber en qué paquete está un determinado archivo primero deberemos conocer la ruta absoluta del archivo en cuestión. Si se trata de un comando con el comando which conoceremos la ubicación absoluta. Por ejemplo, para conocer la ubicación de el comando java usamos:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/which.sh">which.sh</pre></a></noscript>

Conociendo la ruta absoluta del archivo y con el gestor de paquetes de la distribución podremos conocer en qué paquete está contenido y por qué paquete ha sido instalado o es su propietario. En Arch Linux se averigua con el siguiente comando:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/pacman-java.sh">pacman-java.sh</pre></a></noscript>

En Arch Linux java-runtime-common es un paquete que nos permite cambiar la versión de la máquina virtual a usar en el sistema pudiendo intercambiar entre Java 7 y Java 8, esto se realiza con algunos enlaces simbólicos.

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/ls.sh">ls.sh</pre></a></noscript>

Si queremos conocer el paquete del binario java usaremos la ruta absoluta en el comando para averiguarlo con el gestor de paquetes ya sea con pacman o yaourt:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/pacman-java8.sh">pacman-java8.sh</pre></a></noscript>

En las distribuciones basadas en paquetes .deb como Debian o Ubuntu el comando es el siguiente:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/dpkg.sh">dpkg.sh</pre></a></noscript>

Y en las distribuciones basadas en .rpm como como RedHat y Fedora:

<noscript><pre><a href="https://gist.githubusercontent.com/picodotdev/928f2b813d905f89de91b3515ba47dc1/raw/rpm.sh">rpm.sh</pre></a></noscript>

Jueves 01 de septiembre de 2016

Phaser.js Hispano, aprende a hacer videojuegos en HTML5

Phaser.js Hispano es un sitio web, de mi propia creación, donde escribo tutoriales para aprender a usar Phaser, una de las librerías más populares para crear juegos 2D con JavaScript.

Phaser

Su éxito se basa en su simplicidad. No trata de reinventar la rueda con conceptos extraños e innovadores. Simplemente hace lo que muchas otras librerías hacen, de un modo claro, sin complicaciones. Fue creado por Richard Davey, alias photonstorm. Comenzó como una librería privada suya, pues él realiza juegos de navegador como trabajo. Con el tiempo fue mejorando, se hizo opensource y ahora cuenta con muchos usuarios aunque gran parte del desarrollo lo sigue realizando Richard. El motor ha sido usado con éxito en infinidad de juegos y a día de hoy me parece la opción más madura y efectiva de realizar un juego HTML5 con JavaScript.

Phaser usa Pixi.js como motor de renderizado, lo que permite a los juegos usar WebGL o Canvas 2D indistintamente. Además si manejas Pixi verás que algunas partes de la API de Phaser son similares. Los juegos funcionan en cualquier dispositivo que soporte HTML5, desde ordenadores de mesa (Windows/Mac/Linux) hasta televisores y consolas (WiiU, Xbox One, Chromecast,…) pasando por los omnipresentes móviles y tablets, que a día de hoy son las plataformas que prefieren los jugadores para jugar a juegos sencillos, de poca profundidad.

¿Estas listo para probar Phaser? He realizado una lista con, al menos, los elementos de los que me gustaría tratar en la web Phaser.js Hispano. La Gran Guía de Phaser en Español, úsalo como índice para tus consultas. Si tienes alguna duda no dudes en expresarla. ¿Quiéres tratar algún tema en particular? ¿Conocías la librería antes?

La entrada Phaser.js Hispano, aprende a hacer videojuegos en HTML5 aparece primero en Blog - Adrianistan.eu.

Martes 30 de agosto de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Gulvi – la web para desarrolladores web

Ya se acerca el fin del veranito. Es una época en parte triste porque se acaban los paseos por la playa, las noches de fiestuqui, el calorcito, y todo lo bueno que nos trae. Pero también es una época emocionante porque es cuando suelen aparecer un montón de proyectos nuevos.

Así que, entre barbacoa y barbacoa, este verano he estado preparando uno de mis nuevos proyectos: Gulvi.com una plataforma de formación online para desarrolladores web.

En esta plataforma comparto mis conocimientos y experiencia como desarrollador de un montón de años. Está centrada, sobre todo, en PHP y Laravel (que es el framework que más uso desde hace ya un tiempo) pero hay otro montón de temas que voy a tratar:

El sistema de aprendizaje será a través de vídeos, artículos, ejemplos de código y recomendaciones.

Gulvi - formación para desarrolladores web

Gulvi – Vitaminas para desarrolladores web

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

Ya hemos lo que sucedió en el mundo Bitcoin con el tamaño de bloques y también el hard fork en Ethereum causado por la pérdida de fondos en la DAO. Ahora veremos otro robo, con un desenlace totalmente distinto, el caso de Bitfinex.

Capítulo 3: El robo de Bitfinex

Bitfinex es una casa de intercambio, donde la gente puede depositar sus bitcoins y conseguir otra moneda y viceversa. En el caso de Bitfinex el soporte al trading está muy presente.

Bitfinex

El 3 de agosto saltó a noticia, incluso la prensa generalista de hizo eco, había habido un robo en la plataforma. Al poco se aclaró que el problema no era un fallo de seguridad de Bitcoin sino de la propia plataforma de Bitfinex. La cantidad sustraída ascendió a más de 65 millones de dólares al cambio. Ese mismo día la cotización de Bitcoin cayó un 20%. A estas alturas el caso podría recordarnos al de Mt. Gox, pero aquí acaban las similitudes.

CEO de Mt. Gox en los buenos tiemposCEO de Mt. Gox en los buenos tiempos

Bitfinex bloqueó la plataforma y decidió que quitaría el 36% a todos los que tuviesen depositado dinero en la plataforma. No importa que tuviesen dólares, Litecoins, Ethereum, … les afecta a todos. Bitfinex además tuvo una curiosa idea, compensó a sus usuarios con BFX, una moneda especial. Esta moneda representa el dinero sustraído, con valor nominal de 1$. Es decir, si por la quita del 36% perdiste 500$, Bitfinex te recompensa con 500 BFX.

Ante esta curiosa respuesta quedan dos posibilidades:

  • Cuando Bitfinex logre recuperar el dinero sustraído fruto de su actividad recompre los BFX a valor nominal. Esto implicaría que Bitfinex pagaría con sus bolsillos las pérdidas del robo y los usuarios recuperarían su dinero íntegramente.
  • Intercambiar los BFX por otra moneda, aquí uno puede asumir las pérdidas (pues el BFX siempre valdrá menos que un dólar a nivel de mercado, ya que la devolución no es algo garantizado) o comprar todavía más BFX con la esperanza de que suban.

Nada más salir BFX, su valor experimentó un descenso pronunciado, llegando a caer hasta un valor de 0,3 $.

Sin embargo esta solución no ha gustado a muchos usuarios que plantean emprender acciones legales contra la compañía.

A modo de comparación, si recordáis, con Ethereum ante un robo de una cantidad inferior se llegó al hard fork, sin embargo en este caso tal situación no se ha planteado, pues se considera que el fallo no lo tuvo en ningún caso Bitcoin sino Bitfinex.

¿Te parece correcta la solución de Bitfinex ante el robo?

Este es el último capítulo de la serie La Criptonovela del verano: una historia en 3 capítulos. Podéis dejar en los comentarios si os ha gustado o no y por qué.

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

Lunes 29 de agosto de 2016

Juanje Ojeda

Juanje Ojeda
Nada de particular

Ser menos sedentarios en esta vuelta al cole

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

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

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

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

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

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

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

David Moreno
dm's blog

Webhook Setup with Facebook::Messenger::Bot

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

use Facebook::Messenger::Bot;

use constant VERIFY_TOKEN => 'imsosecret';

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

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

Spotify Web Player para Linux: versión no oficial

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

Domingo 28 de agosto de 2016

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

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

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

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

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

EthereumMarketCap

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

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

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

DAODAO, en chino, “el camino”

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

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

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

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

La gente se dividió en dos bandos:

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

DAOButton

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

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

Etc

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

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

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

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

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

Liher Sanchez

Liher Sanchez
El blog de Liher

Fondos de escritorio 25

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

 

1_15

 

1_19

 

023

 

081

 

Un saludo.

Domingo 21 de agosto de 2016

David Moreno

David Moreno
dm's blog

WIP: Perl bindings for Facebook Messenger

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

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

use strict;
use warnings;
use Facebook::Messenger::Bot;

my $bot = Facebook::Messenger::Bot->new({
    access_token   => '...',
    app_secret     => '...',
    verify_token   => '...'
});

$bot->register_hook_for('message', sub {
    my $bot = shift;
    my $message = shift;

    my $res = $bot->deliver({
        recipient => $message->sender,
        message => { text => "You said: " . $message->text() }
    });
    ...
});

$bot->spin();

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

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



…using a simple script like this one.

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

Thanks!

David Moreno

David Moreno
dm's blog

Cosmetic changes to my posts archive

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

Lunes 15 de agosto de 2016

Google prepara un sistema operativo basado en Linux

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

Sábado 13 de agosto de 2016

BlogDRAKE: Disponible OpenMandriva Lx 3.0

Domingo 07 de agosto de 2016

5 distribuciones ligeras para Linux

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

Sábado 30 de julio de 2016

José María Morales Vázquez

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

Aruba Cloud: Nos mudamos de hosting

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

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

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

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Aruba Cloud: Nos mudamos de hosting || Hospedado en un Cloud VPS de Gigas.

Lunes 25 de julio de 2016

Ramón Ramón Sánchez

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

Los datos abiertos generan transparencia, riqueza y empleo

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

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

Sábado 23 de julio de 2016

Ramón Ramón Sánchez

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

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

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

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

Miércoles 20 de julio de 2016

Ramón Ramón Sánchez

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

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


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

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

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

Viernes 15 de julio de 2016

José María Morales Vázquez

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

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

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

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

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

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

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

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

Artículo Original: .

Este artículo pertenece a Un lugar en el mundo... Si quieres ver actualizaciones y comentarios interesantes visita el texto original en: Chuletillas (y XXXXV) – Integrar comandos MySQL en un shell script || Hospedado en un Cloud VPS de Gigas.

Martes 12 de julio de 2016

Gorka Urrutia

Gorka Urrutia
Nideaderedes

Programación orientada a objetos en PHP 5: Herencia

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

 

Programación orientada a objetos en PHP 5: Herencia

 

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

Martes 31 de mayo de 2016

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

Jueves 19 de mayo de 2016

Ramón Miranda

Ramón Miranda
Ramon Miranda

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

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

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

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


Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Wedding Invitations Templates For Word 2016

Wedding Invitation Templates Word   Wedding Invitation Collection S8SxdIZq

Wedding Invitation Templates Word Wedding Invitation Collection

Free Wedding Invitation Websites   Wedding Invitation Collection 9G8KhxDr

Free Wedding Invitation Websites Wedding Invitation Collection

Example Of Wedding Invitation Card   Wedding Invitation Collection PoE7HUl3

Example Of Wedding Invitation Card Wedding Invitation Collection

Free Wedding Invitations Templates For Word 2016 wwwroselliacom lxwsmhfH

Free Wedding Invitations Templates For Word 2016 wwwroselliacom

wedding invitation background free download   weddingbackgroundclub 8aEESrcD

wedding invitation background free download weddingbackgroundclub

Wedding Invitation Templates Word Wedding Invitation Collection

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

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

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations

Sergio García Mondaray

Sergio García Mondaray
yakiboo.net

Vintage Invitation Templates 2016

Free Download Templates For Vintage Wedding Invitations CNJzrUaO

Free Download Templates For Vintage Wedding Invitations

Vintage Graduation Invitation   Printable Graduation Announcement   A 5wJ3gBCw

Vintage Graduation Invitation Printable Graduation Announcement A

Vintage Wedding Invitations 2015 2016 Fashion 2016 eFZGJM6X

Vintage Wedding Invitations 2015 2016 Fashion 2016

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

2016 Cheap New Gold Wedding Invitations Vintage Hollow Lace Laser Cut

Simple Wedding Invitation Template Invitation Templates mHIyzaem dr6eLvZa

Simple Wedding Invitation Template Invitation Templates mHIyzaem

Free Download Templates For Vintage Wedding Invitations

Sábado 09 de abril de 2016

Raúl González Duque

Raúl González Duque
Linux – Mundo Geek

Ubuntu está en todas partes

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

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

Infografía 'Ubuntu está en todas partes'

Viernes 08 de abril de 2016

Ramón Miranda

Ramón Miranda
Ramon Miranda

Muses DVD preset Pack in bundle format for 2.9!



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

Download here

Want to see some examples?



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


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





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



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


Download here

Bundle install

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


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

Ramón Miranda
Ramon Miranda

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


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


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

Fase 3. De lápiz a vectores

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

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

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

Zonas a limpiar y resultado

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

Fase 4. Tipografía

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

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

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

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

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


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

Martes 22 de marzo de 2016

bq Aquaris M10 Ubuntu Edition, fechas confirmadas

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

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

Sábado 19 de marzo de 2016

Juanjo Amor

Juanjo Amor
DrAmor's Blog

¡Cifremos la web!

Qué es Let’s Encrypt

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

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

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

Let's Encrypt

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

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

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

Implementación en los sitios de DrAmor.net

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

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

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

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

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

rsa-key-size = 4096

email = Direccion-email-valida@gmail.com

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

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

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

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

Una vez configurado nginx, ya podemos generar los certificados:

$ cd letsencrypt

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

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

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

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

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

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

Renovación automática

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

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

$ ./letsencrypt-auto renew

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

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

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

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

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

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

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

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