Ubuntu 1210 - Quantal Quetzal

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

GNU/Linux Install Fest

El dia jueves 21 de marzo se realizo un GNU/Linux Install Fest bajo el lema: “Liberando Las Maquinas”. En esta actividad se regalaron calcomanias de las diferentes distros asi como Live CD. Se hicieron algunas demostraciones y un review de … Continue reading

Calculo Salarial Nicaragua 2013

El 1 de Enero de 2013 entró en vigencia la Ley #822 ó Ley de Concertación Tributaria de la cual solo se han escuchado cosas negativas como el gravamen a ciertos artículos de uso diario y personal, sin embargo la tabla de cálculo de impuesto sobre la renta a los asalariados también se modificó. Para algunos para bien, para otros para pagar más impuesto.

Usando la ley y la ayuda de algún amigo contador he creado esta tabla para el cálculo de salario e impuesto.

Espero les sirva para aclarar sus dudas y verificar sus ingresos.

UPDATE: Se complica el tema de editar varias personas al momento, les recomiendo guardar la hoja como un archivo de MS Excel (.xlsx) u formato OpenDocument (.ods) y lo analizan localmente en sus equipos. Ya tengo la promesa de +José Ernesto Dávila Pantoja de hacer un formulario web donde se ingrese únicamente el salario ;)

Trabajando CSS con estilo

Las hojas de estilo css contienen toda la información necesaria para definir el diseño de un sitio web y los proyectos web en la actualidad se caracterizan por el involucramiento de varias personas en el desarrollo y por tener una estructura de código organizada que permita un fácil mantenimiento y escalabilidad. Esta charla tiene el objetivo de introducirles al uso de preprocesadores de CSS, una mejor forma de trabajar código CSS dinámico, en donde realmente se puedan aprovechar el uso de variables, funciones y pruebas lógicas dentro de nuestras definiciones de CSS.

Fue un gusto poder compartir conocimientos con colegas durante el segundo Miercoles Web en Colabora. Les comparto las slides que realize y mostre para esa charla.

 

Configurando OpenVPN con CentOS 6 en OpenVZ container

No Gravatar

Recientemente adquirí un hosting VPS a un costo bajo con las siguientes especificaciones:

  • 1024MB Ram
  • 50GB DiskSpace
  • 600GB Bandwidth
  • 1 IPv4 Address
  • OpenVZ/SolusVM
  • 100 Mbps Port Speed
  • $3.99/Month

Entre las opciones disponibles para usar esta Cent0S/Debian/Ubuntu para la configuración utilizare CentOS release 6.3 (Final) e instalare el paquete openvpn. La tecnología de virtualización utilizada por el hosting es OpenVZ(base de Parallels) , que funciona similar al jail de BSD o las zonas en Solaris.

Con OpenVZ no es posible agregar módulos al Kernel desde el container por razones de seguridad, los módulos deben ser agregados al kernel del host para ser usados por el container(guest o maquina virtual).

A pesar de poder agregar modulo ipsec al kernel desde host, el container solo puede usar ciertos módulos por ejemplo iptables, ipsec verify falla en el container al verificar el soporte para los módulos de encripción en el kernel hasta el momento el soporte para IPSEC en OpenVZ container es experimental, por suerte tun/tap o ppp están disponibles, PPP no es recomendable por razones de seguridad pero si podremos usar la interfaz tun/tap con Openvpn puesto que este tipo de VPN no carga módulos en el kernel y puede usar claves o PKI(Infraestructura de llave publica) basada en OpenSSL

La VPN a configurar con OpenVPN sera para enrutar todo el trafico de los clientes por la VPN con esta configuración se puede usar por ejemplo para asegurar la comunicación sobre redes inseguras o saltar filtros de geolocalización de ciertos sitios web.

El requerimiento previo antes de iniciar es que el proveedor habilite el modulo Iptables para que este disponible en el container y habilitar la interfaz tun/tap en el panel de control del hosting.

Control Panel VPS

Control Panel VPS

Una particularidad de openvz, es que los modulos dentro del container no pueden ser listados con lsmod asi que lo que se hace es probar la funcionalidad de iptables con un scaner de puertos como Nmap y verificar los puertos abiertos con netstat.

Para el paquete Openvpn y sus dependencias habilitaremos el repositorio EPEL

 wget -c http://fedora.mirror.nexicom.net/epel/6/i386/epel-release-6-8.noarch.rpm
 yum localinstall epel-release-6-8.noarch.rpm
 yum install openvpn openssl

Openvpn provee scripts(easy-rsa) para facilitar la generación de las llaves y certificados necesarios en la configuración de la VPN, para utilizarlos copiaremos estos scripts a una locacion como /etc/openvpn, para que los cambios no sea reescrito en una actualización del paquete openvpn.

cp -r /usr/share/openvpn/easy-rsa /etc/openvpn
cd easy-rsa/2.0
ls
-rwxr-xr-x 1 root root   119 Jan 29 07:50 build-ca
-rwxr-xr-x 1 root root   352 Jan 29 07:50 build-dh
-rwxr-xr-x 1 root root   188 Jan 29 07:50 build-inter
-rwxr-xr-x 1 root root   163 Jan 29 07:50 build-key
-rwxr-xr-x 1 root root   157 Jan 29 07:50 build-key-pass
-rwxr-xr-x 1 root root   249 Jan 29 07:50 build-key-pkcs12
-rwxr-xr-x 1 root root   268 Jan 29 07:50 build-key-server
-rwxr-xr-x 1 root root   213 Jan 29 07:50 build-req
-rwxr-xr-x 1 root root   158 Jan 29 07:50 build-req-pass
-rwxr-xr-x 1 root root   428 Jan 29 07:50 clean-all
-rwxr-xr-x 1 root root   143 Jan 29 08:59 gen-crt.sh
-rwxr-xr-x 1 root root  1457 Jan 29 07:50 inherit-inter
-rwxr-xr-x 1 root root   295 Jan 29 07:50 list-crl
-rw-r--r-- 1 root root   413 Jan 29 07:50 Makefile
-rwxr-xr-x 1 root root  7768 Jan 29 07:50 openssl-0.9.6.cnf
-rwxr-xr-x 1 root root  8325 Jan 29 07:50 openssl-0.9.8.cnf
-rwxr-xr-x 1 root root  8222 Jan 29 07:50 openssl-1.0.0.cnf
-rwxr-xr-x 1 root root 12675 Jan 29 07:50 pkitool
-rw-r--r-- 1 root root  9299 Jan 29 07:50 README
-rwxr-xr-x 1 root root   918 Jan 29 07:50 revoke-full
-rwxr-xr-x 1 root root   178 Jan 29 07:50 sign-req
-rwxr-xr-x 1 root root  1829 Jan 29 08:34 vars
-rwxr-xr-x 1 root root   714 Jan 29 07:50 whichopensslcnf

Lo siguiente es editar el archivo vars y lo minimo a editar son los parametros KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, and KEY_EMAIL, se identifica la version instalada de openssl en este caso OpenSSL 1.0.0-fips 29 Mar 2010 por lo que creamos un enlace simbolico para usar la configuracion correspondiente. luego se generaran los certificados y llaves para el servidor y el cliente, para mayor referencia de esto hay un buen articulo en la wiki de ArchLinux

cd /etc/openvpn/easy-rsa/2.0
vim vars
openssl version
ln -s openssl-1.0.0.cnf openssl.cnf
source vars                      # load vars
./clean-all                      # remove old keys
./build-ca                       # Certificate Authority (CA) 
./build-key-server myserver      # server certificate
./build-dh                       # Diffie-Hellman 
./build-key  client1             # client certificate and key 
openvpn --genkey --secret keys/ta.key   # Hash-based Message Authentication Code (HMAC)

Una vez generado los certificados y llaves, necesitaremos crear la configuración del servidor VPN para ello utilizare como base el archivo de configuración de ejemplo que viene con el paquete Openvpn. y copiare los archivos requerido para usarse con el servidor (ca.crt, dh2048.pem o dh1024.pem dependiendo del tamaño de la llave, myserver.crt, myserver.key, ta.key)

cp /usr/share/doc/openvpn-2.2.2/sample-config-files/server.conf /etc/openvpn/server.conf
cd /etc/openvpn/easy-rsa/2.0/keys 
cp ca.crt dh1024.pem  myserver.crt myserver.key ta.key ../../../
ls
-rw-r--r-- 1 root root  1627 Jan 29 09:12 ca.crt
-rw-r--r-- 1 root root   424 Jan 29 09:12 dh1024.pem
drwxr-xr-x 4 root root  4096 Jan 29 07:50 easy-rsa
-rw-r--r-- 1 root root  5312 Jan 29 09:12 myserver.crt
-rw------- 1 root root  1704 Jan 29 09:12 myserver.key
-rw-r--r-- 1 root root 10372 Jan 30 09:38 server.conf
-rw------- 1 root root   636 Jan 29 09:21 ta.key

Configuración del servidor archivo server.conf

port 1194
proto udp
dev tun
ca ca.crt
cert myserver.crt
key myserver.key  # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0 # vpn private network
ifconfig-pool-persist ipp.txt
push "route 10.8.0.0 255.255.255.0" 
topology subnet # necesario para fijar el gateway en el cliente
push "redirect-gateway def1" # redirigir el trafico del cliente al servidor vpn.
push "dhcp-option DNS 8.8.8.8" 
push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
tls-auth ta.key 0 # This file is secret
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3

Configuración del cliente client1.ovpn

client
dev tun
proto udp
remote <server ip/hostname> 1194    # dominio o ip publica del servidor
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt                 # certificado CA
cert client1.crt          # certificado cliente
key client1.key           # llave cliente 	
ns-cert-type server
tls-auth ta.key 1         # llave HMAC
comp-lzo
verb 3

Para la conexion del cliente son necesarios los siguientes archivos el perfil client1.ovpn, certificados y llaves (ca.crt, client1.crt, client1.key, ta.key), en Linux podemos configurar la conexión usando NetworkManager openvpn, en windows podemos descargar el cliente de openvpn

Para conectarse a una VPN configurada con Openvpn hay disponibles varios clientes para Mac(tunnelblick), Windows, Linux/Unix – openvpn client, iOS -openvpn connect y Android – openvpn connect . en todos los casos los archivos del perfil son los mismos para conectarse.

Habiendo realizado los pasos anteriores es momento de probar la VPN ejecutando la configuración del servidor

cd /etc/openvpn
openvpn server.conf

Si la configuración es correcta y la interfaz tun/tap esta activada la salida del comando anterior sera algo como esto:

OpenVPN 2.2.2 i686-redhat-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] built on Aug 10 2012
NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
Diffie-Hellman initialized with 2048 bit key
Control Channel Authentication: using 'ta.key' as a OpenVPN static key file
Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
TLS-Auth MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:0 ]
Socket Buffers: R=[245760->131072] S=[245760->131072]
ROUTE: default_gateway=UNDEF
TUN/TAP device tun0 opened
TUN/TAP TX queue length set to 100
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
/sbin/ip route add 10.8.0.0/24 via 10.8.0.2
Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]

y el tunnel aparacera listado en las interfaces del contenedor:

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.1  P-t-P:10.8.0.1  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:217735 errors:0 dropped:0 overruns:0 frame:0
          TX packets:343811 errors:0 dropped:47 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:20645624 (19.6 MiB)  TX bytes:421775445 (402.2 MiB)

si la configuración es correcta del lado del cliente tendremos la interfaz y la red de la vpn en la tabla de ruteo del sistema operativo, con esto tenemos conexión solo al servidor pero el trafico no es enrutado para ello necesitamos habilitar el ip fowarding con iptables

# kernel params sysctl.conf
 
sysctl -w net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p /etc/sysctl.conf 

Configuración iptables

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source <server ip>
COMMIT
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p ah -j ACCEPT
-A INPUT -p esp -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 500 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT

Pruebas de conexión
Openvpn Connect iOS

openvpn connect ios

openvpn connect ios

openvpn connect ios - connected

openvpn connect ios – connected

linux openvpn connected

ping test

ping test

Referencia:

http://wiki.openvz.org/Main_Page
http://openvpn.net/index.php/download/community-downloads.html
http://openvpn.net/index.php/open-source/documentation/howto.html
https://wiki.archlinux.org/index.php/OpenVPN#Advanced_L3_IP_routing
https://wiki.archlinux.org/index.php/Create_a_Public_Key_Infrastructure_Using_the_easy-rsa_Scripts
http://en.wikipedia.org/wiki/Public_key_infrastructure

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!

Café Ilustrado

¿Cuántos tipos de café pueden mencionar al primer intento? Capuccino, Mokaccino... Café negro... :D

Si ves el menú de cualquier cafetería encontrarás un gran número de opciones y palabras nuevas con acentos que hacen la pronunciación de los mismos intimidante. Encontré en el blog de Lokesh Dhakar un conjunto de imágenes para aclarar todos esos términos, nombres y diferencias.

El Café Expreso se prepara haciendo pasar vapor a presión a través de granos de café oscuro, tostados y finamente molidos. En palabras sencillas café concentrado y por ende fuerte. La mayoría agregamos "shots" de Expreso extra para hacer nuestras bebidas más fuertes.

La mayoría de los tipos de bebidas de café tiene como base un expreso.

(fuerte y concentrado)

(Expresso + espuma de leche)

(Expreso + Crema batida)

(Expreso + Leche Vaporizada + Espuma de Leche)

Flat White
(Expreso + Leche Vaporizada)

Café Breve
(Expreso + 50-50 Crema/Leche + Espuma de Leche)

Capuccino
(Expreso + Leche Vaporizada + Espuma de Leche)

(Expreso + Sirope de Chocolate + Leche Vaporizada + Crema batida) 


(Expreso + Agua caliente)

La mayoría de estas bebidas estan formadas por los mismos elementos, sólo +Allan Ruiz es capaz de diferenciar un Latte de un Capuccino!

Fuente: http://lokeshdhakar.com/coffee-drinks-illustrated/

La regla de los respaldos


No soy precisamente un fanático de los respaldos, viví muchas historias de terror con discos duros destrozados de la noche a la mañana. Miles de MP3 al olimpo, cientos de películas, aplicaciones, etc. sin embargo nunca es tarde para tomar un buen consejo. Si te importan tus archivos o lo que sea que guardes en tu computadora, RESPALDA.

Todos tenemos trabajos de que son importantes, no tenemos mucho tiempo disponible y menos tiempo tendremos el día que perdamos acceso a Dropbox, olvidemos la laptop en un taxi o seamos víctima de la delincuencia.

Por favor, sigan leyendo y compartan con sus amigos.

Estos NO son respaldos:
A continuación una lista de cosas que hacemos pero que NO son respaldos.

  • Respaldar tu laptop en una tarjeta SD en la misma laptop #notabackup
  • Respaldar en un disco duro que esta a 6 pulgadas de tu computadora #notabackup
  • Respaldar tu cuenta de GMAIL en otra cuenta de GMAIL #notabackup
  • Respaldar tus libros copiandolos a otro directorio #notabackup
  • Las fotos que todavía estan en la memoría no tienen respaldo #notabackup


La regla de 3 de los respaldos:
Esta es la regla de 3. Necesaria para una prospera relación persona-computadora. También conocida como regla 3-2-1 de respaldos:

  • 3 copias de cualquier cosa que te importen en serio. 2 no son suficientes si es que en realidad es  

Sencillo. Porque me preocupo mucho por mi trabajo, fotos y datos; y no imagino el mundo sin ellos. Piensa en todos es momentos en los que escuchas de un conocido que lo ha perdido todo, una década de fotos, años de e-mail. Duele -como al hacer ejercicios- porque es bueno para vos. Practica con frecuencia restaurar desde un respaldo. Los respaldos siempre terminan bien, son las restauraciones las que fallan.

¿Qué debería hacer?
Creo que como mínimo deberíamos hacer los siguiente:

  • Tener DOS respaldos físicos (disco duro, USB Flash) con una copia de todo, al menos una vez por semana. Existen aplicaciones que te pueden ayudar.
  • Respalda todo lo que tenga datos importantes incluyendo teléfonos, PDA, e-Readers.
  • Tener un respaldo de almacenamiento en la nube (CrashPlan, Dropbox, SkyDrive, Google Drive)
  • No confíes ciegamente en la nube. Respalda tu Gmail también.
  • Puedes rotar los respaldos físicos entre tu casa y la de algún amigo o usar una caja de seguridad o la casa de tu mamá. Etiqueta uno "Respaldo A" y otro "Respaldo B" y cuando llegues de visita solo los intercambias.


Ahora, manos a la obra.

Una historia de terror que vale la pena leer:

Una pinche traducción e interpretación de http://www.hanselman.com/blog/TheComputerBackupRuleOfThree.aspx

Explorando node y express – parte 1

No Gravatar

En la actualidad las aplicaciones web están tomando un enfoque mas amplio al controlar desde el servidor web hasta el contenido final que es servido al usuario final, node la plataforma construida en el runtime javascript de chrome permite la rápida construcción de aplicaciones usando un modelo de no bloqueo en I/O y basado en eventos hacen de la plataforma ideal para aplicaciones web escalables, aplicaciones de redes y aplicaciones con cargas de datos intensivas en tiempo real haciendo uso de base de datos nosql como MongoDB, CouchDB, Riak.

Node.js es una plataforma en la cual se han desarrollado muchos componentes que en conjunto brindan toda la funcionalidad necesaria para construir aplicaciones web, como es connect un framework middleware para node, express framework para aplicaciones web, jade

Para este articulo lo primero sera instalar node y el framework express

node esta disponible para todas las plataformas Windows(instaladores para 32 y 64 bits), Linux, Solaris, FreeBSD, Darwin en codigo fuente para compilar e instalar.

Una vez instalado node tenemos acceso al gestor de modulos npm y podremos instalaremos express
express se puede configurar de 2 maneras.

la primera opcione es crear un directorio con un descriptor para la aplicación, un archivo
package.json y luego ejecutar la instalación del modulo express con npm

$ mkdir ndemo
$ cd ndemo
$ vim package.json
$ npm install 
$ npm ls

Descriptor de la aplicacion: package.json

// file: package.json
{
    "name":"ndemo",
    "version":"0.0.1",
    "private":true,
    "scripts":{
        "start":"node app"
    },
    "dependencies":{
        "express":"3.x",
        "jade":"*",
        "stylus":"*"
    }
}

la otra alternativa es instalar express de manera global usando npm y utilizar el comando express para crear la aplicación.

# requiere permisos de root
$ npm install -g express
$ express -s -c stylus ndemo

al final se tendrá el directorio de la aplicación con los módulos necesarios como se muestra en la imagen usando “npm ls” se pueden ver las dependencias de express en la aplicación

npm ls

Con la primera opción se debe crear el script de inicio y del servidor para arrancar la aplicación, con la segunda opción estos archivos son creados automáticamente.

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:

  • Pormenores del SFD Nicaragua 2011:
  • Puñalada trapera y sucia tración: Nos sacamos los trapitos al sol; pleitos, chismes e intrigas en la organización del SFD Nicaragua 2011.
  • Discutimos sobre la participación de las mujeres en los eventos y en la comunidad en general.

Compartimos con el público un par de temas interesantes:

  • Escritorios 1.0 vs. Escritorios 2.0 (ó porque las nuevas interfaces me la pelan):
  • Los escritorios libres han evolucionado en los últimos años desde un escritorio tradicional (tipo Gnome 2.0) hacía algo más sencillo e intuitivo para el usuario final, o por lo menos eso es lo que se pretende. Ejemplo claro de esto último son los escritorios de Gnome3 y Unity, incluídos en las últimas versiones de Fedora y Ubuntu, respectivamente. Pero… ¿estos nuevos escritos son realmente más sencillos? ¿para quiÃ