Ubuntu 13.04 - Raring Ringtale

El planeta es un conjunto de bitácoras o blogs de ubunteros nicaragüenses.

Ubuntu 13.10 Beta Ya Disponible

Ubuntu 13.10

Ahora sí, la primera y última -por ende, la única- beta de Ubuntu 13.10 ha sido liberada, antes de que el próximo 17 de octubre vea la luz la versión estable, que además de por la comitiva habitual vendrá acompañada finalmente por Ubuntu Touch, también en versión estable.

Cabe recordar que en Canonical decidieron no seguir publicando versiones previas de Ubuntu, relegando en las daily builds o compilaciones diarias con la excepción de esta beta. Asimismo, prácticamente nada ha cambiado de lo que os contamos el otro día, así que os recomendamos echarle un ojo al anterior enlace para saber más. Lo mismo si el sabor que os interesa es Kubuntu, Xubuntu o Lubuntu.

A vuelapluma, que se suele decir, Ubuntu 13.10 viene con el kernel Linux 3.11, GNOME 3.8, XMir como servidor gráfico por defecto y muchos otros pequeños cambios que comentaremos en su momento. Mientras tanto, podéis descargar Ubuntu 13.10 Beta e ir probando por vosotros mismo qué hay de nuevo… sin olvidar que es una beta.

imgcurl: proyecto de mí para mí.

Las personas que me conocen y se comunican conmigo por medio del chat sabrán de mi tendencia de acompañar mi chats con diveras imágenes que reflejan la manera como me siento o un algo que simplemente puede ser chistoso ;-)

Generalmente googleaba estos links en búsqueda de imágenes o tenía marcadores en el navegador (tan 2002) pero luego pensé en como hacer algo para no depender de google ni del navegador y por ende ser mas rápido. De ahí vino la idea de imgcurl.

imgcurl (no tiene un buen nombre lo sé) es una sencilla aplicación web que acorta urls, la uso principalmente para guardar enlaces de imágenes y de archivos que quiero compartir con varias personas a la hora de dar una charla.

Ejemplo de urls que tengo:

Al ser Redis una base de datos key-value me venía de maravilla para el proyecto y para tener un "API REST" usé Flask y algo de Python para hacer un cliente de consola.

Para agregar una nueva url corta ejecuto el siguiente comando:

imgcurl add --key git-video --url http://www.ted.com/talks/clay_shirky_how_the_internet_will_one_day_transform_government.html

Lo que pondríá disponible ese enlace de ted en http://i.fitoria.net/git-video

Actualmente tengo alrededor de 70 urls guardadas de esta manera, algunas las uso muy frecuentemente y otras no tanto, ahora necesito algo para mejorar mi memoria y recordarlas siempre.

El código del proyecto está en mi github con mas detalles sobre como instalarlo, no creo que muchas personas lo instalen a menos que tengan la misma necesidad puntual que tuve yo para crearlo.

Si decidís instalarlo dejá un comentario para saber como les vá o ayudar a configurarlo correctamente.

Django Suite IV: Hablemos un poco de caché.

Decía Phil Karlton "Solo hay dos cosas dificiles en las ciencias de la computación: invalidación de caché y nombrar cosas."

En esta entrega de la serie Django Suite - después de mas de un año de ausencia - hablaré sobre el framework de caché de Django.

Principios de caché

Cuando hacemos un sitio, especialmente si estamos comenzando no tomamos en cuenta el desempeño del sitio y la cantidad de tiempo de procesamiento por cada petición. El tiempo de procesamiento de un sitio está afectado por varios factores el mas importante la cantidad de consultas que realizamos a la base de dato por cada request, generalmente estas varían según la complejidad de nuestras vistas y el tipo de usuario (anónimo o autenticado) que tengamos en el sitio.

Para mejorar el desempeño del sitio se usa el caché que no es mas que un almacenamiento rápido, generalmente en RAM, que nos evita recaer en operaciones de cálculo pesadas como lo son hacer muchas consultas de base de datos la lógica de las vistas y el renderizado de las mismas en la plantilla que normalmente son realizadas haciendo lectura/escritura de disco duro que agrega mas tiempo a la receta.

Hacer caché de datos no es tan dificil, lo dificil es saber cuando los datos cacheados ya no son válidos y debemos de recalcular de nuevo para construir un nuevo caché, de ahí la frase del inicio del post.

Caché framework

Django contiene un framework de caché que abstrae las operaciones básicas, sin que nosotros tengamos que preocuparnos por el motor de caché que usemos, por defecto Django soporta Memcached, caché en base de datos, caché en el sistema de archivos y memoria local, siendo no muy recomendados estos últimos tres.

Pero como todo en Django la comunidad da soporte para otros motores de caché opensource muy buenos ademas de memcached, como por ejemplo:

Caché de vistas

Django nos provee con el decorador cache_page para hacer caché a una vista, el decorador lo que hace es lo siguiente.

Si la vista ha sido cargada por primera vez, hace todas las operaciones y la guarda en caché con tiempo de vencimiento designado en la llamada del decorador, caso contrario carga el resultado de la vista desde caché.

Ejemplo:

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)
def my_view(request):
    ....

El valor de 60 * 15 representa la duración de la validez del caché en segundos, en este caso 15 minutos, se acostumbra mucho para asignar valores de vencimiento poner multiplicaciones de la cantidad de segundos en un minuto (60) por el número de minutos deseado.

En el caso que la vista tuviera parámetros como un mi_vista(request, post_id) el caché ser haría de manera individual por cada valor de post_id que tengamos presente. Mas detalles de esto en la documentación oficial.

Caché de fragmentos de plantillas

Fragmentos plantillas también pueden ser cacheadas, esto es especialmente útil para fragmentos que repetimos en casi todas las páginas, por ejemplo elementos de menú dinámicos, columnas de 'últimas noticias' o 'últimos post' en caso de ser un blog.

Ejemplo:

{% load cache %}
{% cache 500 menu %}
    .. mi super menu de página ..
{% endcache %}

Igual acá la template tag de cache acepta como parámetros la duracion en segundos, el nombre del fragmento y el conjunto de variables que deseamos establecer en el cache.

Este conjuto de variables es tremendamente útil para hacer caché en diversas situaciones tales como si el usuario está o no autenticado, el lenguaje del navegador del usuario ( en caso que usemos la opción de internacionalización y localización del sitio ), valor de alguna varible que usemos que puede modificar el resultado de la plantilla entre otros.

Ejemplo en código fuente de la vida real acá.

Generalmente la mejor documentación es el código fuente, y para verdaderamente entender y jugar con esta template tag recomiendo que vean como está hecha en este archivo

Caché manual

Si queremos verdaderamente sacar provecho al framework de caché de django tenemos que tomar ventaja del API de caché manual. Los motores de caché se basan en almacenamiento de llave-valor (hashmap) o en lo que python seríá un equivalente al tipo diccionario.

El api de caché es bastante simple, podemos ver su uso en el siguiente código fuente:

#importamos el objeto caché
from django.core.cache import cache

#guardamos algo en el cache con expiración de 60 segundos
cache.set('a', 'un valor cacheado', 60)
#leemos algo desde cache
valor = cache.get('a')
#borramos 'a' del cache 
cache.delete('a')

Básicamente esa es el API de bajo nivel, si nosotros ponemos como valor de tiempo 0 el caché nunca se vencerá y tendremos que eliminarlo manualmente a posteriori.

Trucos con el caché manual.

El caché manual es tremendamente útil usándolo en conjunto con modelos. Un ejemplo sencillo y fácil de implementar es un menú dinámico, recientemente programé uno que se veía algo así:

#models.py
from django.db import models
from django.core.cache import cache 
 
class Menu(models.Model):
    titulo = models.CharField(max_length=50)
    url = models.URLField()
    peso = models.PositiveIntegerField(default=0,
            help_text="peso del elemento del menú, entre mayor sea el número mas hacia el fondo estará el elemento")
 
    def save(self, *args, **kwargs):
        #primero guardamos
        return_value = super(ElementoNavegacion, self).save(*args, **kwargs)
        #invalidamos el cache antiguo de menu
        cache.delete('menu')
        #creamos el nuevo cache refrescado
        cache.set('menu', Menu.objects.all(), 0)
        return return_value
 
    def __unicode__(self):
        return "%s (%s)" % (self.titulo, self.url)

Se creó un context manager para tener la lista del menú en todas las plantillas.

   #context manager para el menú.
   from django.core.cache import cache 
    
   from models import Menu
    
   def menu_context_manager(request):
       #probamos si esta el elemento en caché
       valor = cache.get('menu')
       #si no está leemos de la base de datos
       if not valor:
           valor = Menu.objects.all()
           #lo cacheamos
           cache.set('menu', valor, 0)

       return {'menu': valor}

Haciendo esto se ahorran un par de consultas a la base de datos y por ende la velocidad de carga del sitio aumenta.

Despedida

En resumen hemos visto una introducción al cache framework de Django, espero que les haya servido y tendré que hacer un post de continuación para exponer otros casos de uso del caché manual y trucos con el API, además del caché al lado del servidor de archivos estáticos y del lado del navegador.

Como migré de wordpress a pelican conservando los datos y enlaces

A como les contaba en mi post anterior, comencé a usar Pelican para el blog, migrarlo desde wordpress no fue tan sencillo a como esperaba por que normalmente pelican está diseñado para soportar una categoría por post y no múltiples categoríás a como mis datos de posts anteriores lo requerían, naturalmente me vi obligado a leer el código fuente y modificarlo.

image

Este código lo pueden encontrar en un fork en mi github esta versión de pelican soporta como dije anteriormente, múltiples categorías por post, y reparé de paso el comando de migración que posee Pelican para importar datos desde el XML de Wordpress. Pueden ver exactamente los cambios que hice en este commit.

Advertencia: Usar mi fork de Pelican quiebra la mayoría (sino todos) de temas que existen por que originalmente espera una categoría, la solución es hacer un ciclo for similar a los que se hacen para etiquetas

Ejemplo:

Categories: {% for category in article.categories %} <a href="{{ SITEURL }}/{{ category.url }}">{{ category }}</a>, {%endfor%}

Como Importar datos

En mi caso usé el comando pelican-import de la siguiente manera.

pelican-import --wpfile /opt/fitoria.wordpress.2012-06-18.xml -o content --strip-raw -m markdown

Usé Markdown por que por alguna razón en reStructuredText daba errores espantosos de formateo haciendo que los posts quedaran inusables, con Markdown no tuve este problema.

Configuración del Servidor

Configuré redireccionamientos para las urls antiguas, hacia los archivos actuales, las urls de los feed y los archivos estáticos viejos.

Y despues de eso estaba listo todo. Pronto cambiaré de nuevo la plantilla, no estoy 100% feliz con esta

Adiós Wordpress, hola Pelican (historia de como migrar un blog a Pelican).

¡Hola, hola! mas de un año sin escribir por acá, el 2012 se fue sin ningún post, que pena...

Razones por las cuales no he escrito?

  1. Bloqueo mental (pe-re-za)
  2. Comencé a odiar un poco a Wordpress (pero es mas por lo primero)

Como excusa geek para ponerme a escribir y cumplir esta meta de año nuevo hice algo que tenía en mente y en deuda conmigo mismo, pasar el blag de Wordpress hacia Pelican que es un generador de sitios estáticos hecho en Python que a partir de archivos de texto plano formateados en Markdown, reStructuredText o AsciiDoc genera sitios estáticos completos que no tienen nada que envidiar a un blog en wordpress.

Ventajas

  1. Al generar HTML estático no se necesita de base de datos, o lenguaje de programación simplemente servir los archivos al estilo de los 90's.
  2. Mas velocidad: antes mi blag cargaba en casi 2 segundos usando la plantilla por defecto de Wordpress y un par de plugins ahora tarda 0.4 segundos listo y servido.
  3. Puedo usar Vim para editarlo, eso es algo que me motiva a escribir mucho, como vim-adicto que paso horas en el editor me incomoda sobremanera escribir en otro editor.
  4. Pelican está hecho en Python, pude hacer ciertos hacks para la importación de datos que explicaré con detalle en el siguiente post.
  5. Puedo controlar el 100% de mi contenido con git, menos dolores a la hora de hacer backups.
  6. Wordpress me ponía de un bate con tantas actualizaciones.

Desventajas

  1. Uno tiene que ser geek, no es amigable para usuario final.
  2. Importar datos de Wordpress es algo doloroso y las herramientas de migración por defecto de Pelican no están 100% bien hechas, pero es algo que resolví y explicaré en el siguiente post que será muy técnico.
  3. Hay que acostumbrarse a alguno de los lenguajes soportados (Markdown y compañíá) pero al haberlos usado antes no me fué mucho trabajo.

Proyectos similares

A continuación un par de alternativas que exploré antes de usar Pelican, fueron descartadas por que no fue fácil migrar mis datos hacia ellos:

  • Jekyll: Hecho en ruby usado por defecto en Github pages.
  • Syte: Hecho en python usando partes de Django, pero me obligaba a migrar a thumblr, perdiendo urls y por ende hubiera quebrado mis enlaces en los 5 años que llevo con el blag, el diseño de la plantilla es muy bonito si.

Otros que no probé pero que existen: Hyde, bonsai, staticmatic y más...

Ahora a escribir como el muñeco del GIF de la izquierda de mi plantilla, favor reportar bugs en el contenido, se que hay algunos, pueden dejar un comentario.

Saludos!

Privado, Anónimo y Publico. ¿Sera esto correcto?

The Jabber.org IM service exists primarily so that instant messaging users all around the world can have a free and open IM experience.

El servicio de mensajería instantánea Jabber.org existe principalmente para que los usuarios de mensajería instantánea de todo el mundo puede tener una experiencia de mensajería instantánea libre y abierto.

Aquí el registro! > https://register.jabber.org/

**Este es el protocolo que seleccionó Google para su servicio de mensajería Google Talk, Facebook, Tuenti, WhatsApp Messenger, Nimbuzz, entre otras, para su chat.

**Según > https://es.wikipedia.org/wiki/Jabber

Todavia aquí x) en Debian y Xfce Anonimo

Los invito a salir conmigo, ustedes invitan sí y fumamos algo… y si quieren navegar anomimamente y tienen una memoria USB de minimo 769 MB(minimo de memoria no recomendado x)) o un DVD les comparto como hacerlo facilito usando Gnu/Linux, Windows no! y si fumamos mucho… talves les digo como hacerlo en Android y si fumamos más talves en un Iphone x) si fumamos más les digo el enlace pero como no soy mala onda aquí esta https://www.torproject.org/ si tienen fumemos más x)

POSOL en vivo desde el SFD 2011

Episodio en vivo del Podcast Software Libre Nicaragua desde el Día de la Libertad del Software Nicaragua 2011

En este episodio:

  • Intro: Mientras esperamos que nos sirvan nuestros martinis, agradecemos a los patrocinadores del SFD Nicaragua 2011:
  • Fundación Luci