Andrés Gattinoni: Notificaciones de mails Prioritarios de Gmail en nuestro escritorio

   Publicado:
GMail

GMail

En estos días GMail empezó a implementar la Priority Inbox, o Prioritarios en su versión en castellano. No es nada demasiado novedoso, en realidad es una etiqueta que define a un mensaje como prioritario. Lo más interesante es que Gmail no solamente te puede mostrar por separado los mails con prioridad de los otros, sino que nos promete ir “aprendiendo” a determinar cuáles son prioritarios y cuáles no.

En estos días estuve probando el feature y me viene bien. Yo recibo muchos mails por día, la mayoría de distintas listas de correo. Y como soy muy obsesivo, cada vez que tengo un mensaje nuevo voy a ver de qué se trata y “marcarlo como leído”. Este feature me permite perocuparme solamente por los prioritarios y dejar los menos importantes (como los de las listas) para más tarde.

Hoy pensé: “qué bueno estaría tener una aplicación que me notifique solamente de los mails importantes”. Ya existen varios notifiers para Gmail, tanto de Google o de terceros, para Firefox o para el Desktop. Pero supongo que todavía no habrán implementado esta posibilidad de solamente avisarte de los mensajes prioritarios. Así que lo que hice fue hacerlo en Python que es muuuy fácil.

En su versión simplificada, ver si hay mails “Importantes” y notificarlo es tan sencillo como esto:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import imaplib
import pynotify
from email.header import decode_header
from email.parser import Parser

host = ‘imap.gmail.com’
port = 993
username = ‘usuario@gmail.com’
password = ‘passwordsupersecreto’

def get_header (msg, header):
        """Gets a header from a message"""
        header = decode_header(msg.get(header))
        if (header[0][1]):
            return unicode(header[0][0], header[0][1]).encode(‘utf8′)
        else:
            return header[0][0]

if not pynotify.init("GMail Important Messages"):
    print "Failed to initialize pynotify"
    sys.exit(1)

client =  imaplib.IMAP4_SSL(host, port)
if not client.login(username, password):
    print "Failed to login"
    sys.exit(1)

status, data = client.select(‘[Gmail]/Important’)
if status != ‘OK’:
    print "Failed to select Important label"
    sys.exit(1)

status, data = client.search(None, ‘(UNSEEN)’)
if status == ‘OK’ and data[0] != :
    for msg_id in sorted(data[0].split()):
        if msg_id != :
            status, data = client.fetch(msg_id, ‘(RFC822)’)
            if status == ‘OK’:
                msg = Parser().parsestr(data[0][1])
                pynotify.Notification(get_header(msg, ‘From’), \
                                       get_header(msg, ‘Subject’)).show()
            else:
                print "Failed to fetch message #%s" % str(msg_id)

Ese código lo que hace es inicializar pynotify, conectarse al servidor IMAP de GMail usando imaplib, autenticarse con el user y password provisto, seleccionar la etiqueta “[Gmail]/Important” y ver si hay mensajes sin leer. En caso de que haya itera sobre ellos, obtiene su contenido (para sacar el remitente y el asunto) y lanza un mensaje de notificación.

Para convertir eso en una aplicación básicamente hace falta meterlo en un while y corregir un detalle que es que el fetch del mensaje lo marca como leído (y eso no es algo que queramos en un simple notificador), así que hay que volver a marcarlo como no leído. Eso y algunos toques cosméticos es lo que hice en el script completo.

Por supuesto se trata solo de una prueba de concepto y a una aplicación completamente funcional deberían hacersele algunas correcciones más. Pero creo que es una idea divertida como para que otros puedan hacer algo mejor.

Mariano Reingart: Se viene el PyDay 2010 Buenos Aires

   Publicado:

Este sábado 4 de septiembre es la jornada sobre el lenguaje de programación Python "PyDay Buenos Aires 2010" organizado por PyAr:

http://www.pyday.com.ar/

Entre varias charlas agendadas estaré presentando web2py (una herramienta para desarrollo web simple y poderosa) y seguramente en los espacios abiertos y/o charlas relámpago hablaremos sobre los proyectos PyAfipWs (factura electrónica libre), PySimpleSOAP (webservices), PyFPDF, Gestión Libre, y demás temas generados desde nuestro emprendimiento "Sistemas Ágiles", sin olvidarnos de PostgreSQL y su nueva versión 9.0!

Andrés Gattinoni: Backups con tar + rsync + rotación

   Publicado:

En estos días tuve que configurar unos backups para un cliente. Algo bastante sencillo. Tenía dos servidores y necesitaba hacer backups de distintas cosas en cada equipo y copiarlos al otro. Por supuesto, la herramienta clave para esto es rsync. Googleando un poco vi que existe esta página donde se puede ver cómo generar snapshots incrementales automáticos usando hard links y rsync. Realmente es una solución muy interesante, pero a mí no me terminaba de convencer porque yo quería tener archivos comprimidos que fueran rotando.

Por lo tanto lo que hice fue, seguramente, reinventar la rueda una vez más. Hice una pequeña librería en BASH que luego reutilicé en los distintos scripts de backup que hice. La clave aquí es la función “create_archive” que toma un path, un nombre de archivo base y una lista de archivos, y se ocupa de ir al path, ver todos los archivos que haya con ese patrón de nombre básico, rotarlos y generar un nuevo tar.gz. Después agregué un par de funciones más que me venían bien, “log” para registrar todo lo que pasaba en un archivo, “mail_notification” para mandarme mails y “sync_backup_servers” para ejecutar rsync.

El código:

#!/bin/bash
CONF_FILE="/home/sysbackup/scripts/backup.conf"
if [ -f $CONF_FILE ]; then
    . $CONF_FILE
else
    echo "Configuration file $CONF_FILE not found"
    exit 1
fi

RM_BIN="/bin/rm"
TAR_BIN="/bin/tar"
MAIL_BIN="/bin/mail"
RSYNC_BIN="/usr/bin/rsync"

function log
{
    echo "`date`: $*" >> $LOG_FILE
}

function mail_notification
{
    subject="$1"
    message="$2"

    if [ -z "$subject" ]; then
        subject="Backup Notification"
    fi

    if [ -z "$NOTIFICATIONS_MAILS" ]; then
        log "mail_notification: empty recipients list"
        return 1
    fi

    if [ -z "$message" ]; then
        log "mail_notification: empty message"
        return 1
    fi

    sysdata="Date: `date`\nHost: `hostname`"

    echo -e "$message\n\n$sysdata" | $MAIL_BIN -s "$subject" "$NOTIFICATIONS_MAILS"
}

function sync_backup_servers
{
    log "Running rsync from $LOCAL_DIR to $REMOTE_DIR as $RSYNC_USER"
    su -c "$RSYNC_BIN -aq –delete -e ssh $LOCAL_DIR/ $REMOTE_DIR/ 2>> $LOG_FILE" $RSYNC_USER
    if [ $? -eq 0 ]; then
        log "Syncronization complete successfuly"
    else
        log "Syncronization finished with errors"
    fi
}

function create_archive
{
    file_path="$1"
    file_name="$2"
    files="${*:3}"

    if [ -z $file_path ]; then
        echo "Missing file path"
        return 1
    fi

    if [ -z $file_name ]; then
        echo "Missing file name"
        return 1
    fi

    if [ -z $files ]; then
        echo "Missing file list"
        return 1
    fi

    if [ -z $MAX_BKP_FILES ]; then
        MAX_BKP_FILES=4
    fi

    archive_name="${file_name}_`date +%Y%m%d`.tar.gz"
    log "Preparing to create $archive_name archive"

    # Begin to Rotate files
    # Sort files by date and keep the latest ones
    # MAX_BKP_FILES will determine how many to store
    dir=`ls -t $file_path/${file_name}_*.tar.gz 2> /dev/null`
    if [ $? -eq 0 ]; then
        N=0
        for file in $dir; do
            if [ $N -lt $MAX_BKP_FILES ]; then
                let N++
            else
                log "Removing old file $file"
                $RM_BIN -f $file
            fi
        done
    else
        log "No other archive found on $file_path"
    fi

    log "Creating tar archive $file_path/$archive_name"
    $TAR_BIN zcf "$file_path/$archive_name" $files 2>> $LOG_FILE
}
 

Algunas consideraciones importantes.

Configuración

Al principio del script lo que hago es incluir un archivo de configuración con algunas variables básicas que voy a utilizar. Este archivo debería ser algo similar a esto:

#!/bin/bash
LOCAL_DIR="/home/sysbackup/backup/server1.domain.com"
REMOTE_DIR="sysbackup@server1.domain.com:/home/sysbackup/backup/server1.domain.com"
LOG_FILE="/var/log/sysbackup.log"
MAX_BKP_FILES=4
NOTIFICATIONS_MAILS="admin@email.com"
RSYNC_USER="sysbackup"
 

LOCAL_DIR es el directorio local base donde van a estar mis backups. REMOTE_DIR es el directorio equivalente en el otro servidor. Lo que hice fue crear un usuario “sysbackup” (un poco menos obvio que “backup”, pero también self-explanatory) en los dos servidores y generar llaves para que se puedan conectar por SSH entre los dos servidores. Luego en la /home de cada usuario creé una carpeta “backup” y adentro de ella una carpeta para cada host que iba a ser backupeado “server1.domain.com” y “server2.domain.com”.

LOG_FILE indica el archivo donde se van a guardar los logs del backup y MAX_BKP_FILES determina la cantidad máxima de archivos de backup que va a haber por cada elemento.

Rotación

Como dije, la función más importante es create_archive. La pensé para logs que se crean una vez por día (o cada más tiempo), por lo que si la quieren usar para rotar logs generados en intervalos de tiempo más cortos van a tener que modificarla. Lo que hace es generar un nombre de archivo con una raiz elegida por nosotros (digamos “db”) y la fecha actual (la función pone la fecha, pero si necesitan intervalos más cortos van a tener que poner fecha y hora). Luego hace un `ls -t` del directorio donde hay que generar el backup para ver si hay otros archivos que coincidan con el patrón del nombre correspondiente (por ejemplo, ‘db_*.tar.gz’). Si hay archivos, va a conservar los últimos 4 (en realidad la cantidad la determina MAX_BKP_FILES) y va a borrar los más viejos. Por último, va a generar el tar.gz con la lista de archivos que le hayamos pasado.

Ejemplo:

create_archive "$LOCAL_DIR/web" "web" "/var/www/html"
 

Va a generar con un archivo de nombre como “web_20100902.tar.gz” en la carpeta $LOCAL_DIR/web con todos los contenidos de /var/www/html.

Rsync

La función sync_backup_servers hace la sincronización entre los dos servidores usando rsync por SSH. Una cosa a tener en cuenta es que en mi caso, yo necesitaba que el script de backup corriera como root (para poder acceder a todos los archivos que había que backupear) pero quería que el rsync se ejecutara con el usuario sysbackup (para mayor seguridad). Por lo tanto la función usa “su -c sysbackup”. Si a uds. este enfoque no les sirve pueden poner en la función directamente:

$RSYNC_BIN -aq –delete -e ssh $LOCAL_DIR/ $REMOTE_DIR/ 2>> $LOG_FILE
 

Notificaciones por mail

Es muy útil poder tener notificaciones por mail, sobre todo cuando las cosas andan mal. El comando “mail” de Linux/Unix es muy útil para esto. La funcion mail_notification usa ese comando para mandar un mail con el mensaje que queramos y le agrega dos datos útiles: la fecha y el hostname desde el que se manda. En realidad son datos que siempre viajan en los headers del mail, pero a mí me parecía útil que estuvieran en el body.

Espero que les sirvan estos recursos. No son una solución completa y cerrada, sino herramientas que quizás les sirvan para implementar o al menos pensar cómo hacer sus propios sistemas de backup. Les recomiendo enfáticamente que lean este artículo sobre cómo generar backups con rsync porque explica muchas cosas fundamentales.

Evita: Tenemos nuestra primera bicicleta - Nos vamos !

   Publicado:

Este blog se cierra, se va. En realidad se muda, se va de su alojamiento en blogspot a su nueva casa. Su dominio propio. La Fundación Eva Perón, por la que obtuvimos nuestra primera bicicleta, hoy nos da nuestro primer hosting. Sí compañero, sí compañera, para visitarnos, simplemente hacé clic en:


www.evitalinuxera.com.ar

Con un nuevo diseño, con las cosas de siempre y con las que agregaré día a día, dejamos a blogspot y nos vamos a Wordpress, un verdadero blog libre, con el dominio propio pagado de mi bolsillo con el cheque que Anibal Fernandez nos pasa semana a semana según las palabras de los medios gorilas y los gorilas de los medios.

Me voy en mi bicicleta, los espero en el nuevo sitio.



Viva Perón! Viva Evita! Viva la compañera Presidenta Cristina!

Matías E. Gieco: Crear un ejecutable con Python, Gui2Exe e InnoSetup

   Publicado:

Luego de una larga pelea conmigo mismo, logré hacer andar gui2exe, o sea logré compilar los .py y que éstos anden bien.

Voy a usar un ejemplo de un script que es simple no tiene módulos raros, salvo win32com, pero no es necesario declararlo en los campos de gui2exe.
La imagen de como queda la pantalla:

(Se ve poco, pero haciendo click se agranda)
Essssplico :p
My Projects -> email2outlook (es el nombre que le puse al proyecto)

En Target Classes:
Exe Kind es console, ya que sólo es para consola
Python Main Script es justamente el path al script

En Common Options:
Optimize: 2. Es el tipo de optimización que ya venía poniendo en los que hacía con py2exe a mano. Es para que sea lo mas mas re cool.
Compressed: 2. Para que usando 7zip haga una compresión lo mas grande posible de los archivos.
Bundle Files: Acá me golpié un rato, pero lo entendí. En 1 y 2, mete las librerías dentro del archivo.exe, quedando un solo exe. Si le ponés 3, genera el .exe con el código python y mete la librería standard y/u otros módulos en un archivo externo.
Zipfile: justamente acá mete todo eso.
¿Para qué sirve hacer eso? Porque si tengo 3 archivos para compilar: uno.py, dos.py y tres.py, si pongo 1 ó 2, me genera 3 archivos de 5 Megas cada uno (¡mas de 15 MB en total en el directorio!). Si pongo el Bundle Files en 3, me genera 3 archivos de 10kb y una zipfile de 5 MB.
Y bue... nada mas, compile y listo...!

Frutilla del postre. ¿Y si achicamos mas el programa a distribuir?
El programa compilado lo deja bajo en subdirectorio \dist, entonz si yo estoy parado sobre el directorio padre de éste, que sería v.2.0.1, tengo un codiguito tomado de la ayuda de py2exe y que con medio gramo de materia gris acomodé para que tomara el subdirectorio \dist y lo comprima.

if "%Compress%"=="1" call:CompressFiles
echo.
echo.
::echo Done: "%~dpn0_EXE\"
echo Compresion realizada con exito
echo.
::pause
goto:eof

:CompressFiles
        %SevenZipEXE% -aoa x "dist\library.zip" -o"dist\library\"
        del "dist\library.zip"

        cd dist\library\
        %SevenZipEXE% a -tzip -mx9 "..\library.zip" -r
        cd..
        rd "library" /s /q

        REM cd dist\
        %UpxEXE% --best *.*
        cd..
goto:eof

¿Qué sucede al ejecutar este compresor.cmd? El cuchifrulo agarra todo lo que tiene \dist y lo comprime ¿cuánto? Y... aproximadamente el directorio queda un 30% mas pequeño, ¡pero anda exactamente igual!
¿Qué gano con ésto? Simple, paso de 5MB a 3Mb y chirolines.

Hagamos un instaladorrrr...
Inno Setup Compiler es el programita, con cariño lo digo, para mi entender hace magia, dos o tres cosillas y sale andando.
Arrancamos el programa, Crear proyecto con el Wizard y pasamos a la primer pantalla de configuración:

Simple y conciso, nombre de la app y versión.
¡Se va la segundita!

El gancho que tiene esa elección es que puedo dejarlo en Program Files Folder (que puede ser Archivos de Programas o Program Files, según el Windows) y también poder darle a elegir cambiar el directorio. Para otra aplicación, no le daba esta opción y directamente instala en un directorio del sistema.
En la tercer pantallita se pone lindo.

Como la aplicación es un ejecutable que se invoca desde otro lado, no es main. Por lo que tildo esa opción y le digo que tome todo el directorio dist para armar la app.
La pantalla siguiente no voy a poner una captura, ya que es para configurar el Menú Inicio, cosa que no tiene mi aplicación y por lo que destildo esa opción.
La otra que sigue es de licencias y texto a mostrar antes/después de instalar, está bueno como para dar avisos.
Y vamos con otra pantalla mas... ¿lenguajes para el instalador? inglés o español, para este caso pongo inglés nomás porque es una instalación rápida.
¡Seguimos! Pantalla para configurar dónde poner el resultado:

Acá sí que configuré :P A donde crear el setup.exe y el ícono (ícono de Tango elegí) y Next...

Y sí, por fín ¡terminado! Crea el archivo de configuración y compilamos el script.
¡Ups, saltó un error! El formato .png del ícono no es aceptado.
Miro el código de configuración y cambio en SetupIconFile por D:\desarrollos\email_outlook\v.2.0.1\internet-mail.ico (Estaba todo friamente calculado :D )
Compilar... y ahora sí. ¡Un hermoso instalador con iconito y todo!

Ufff... verborragia hice hoy. Palomita voló, el que no se escondió ¡se jodió!


Evita: Época de cambios

   Publicado:

Compañeros, ustedes bien saben que esta humilde servidora ha estado siempre a vuestro lado, en las buenas y en las malas, codo a codo con ustedes, mis queridos descamisados. Entregando junto a los jirones de mi vida, las enseñanzas del General Perón y la doctrina del software libre. Hoy como aquel 22 de agosto de 1951, les pido que me den tiempo para anunciar al país una decisión muy importante que he tomado.



Yo aprovecho esta oportunidad para pedir a Dios que ilumine a los mediocres para
que puedan ver a Perón y para que puedan comprenderlo, y para que las futuras
generaciones no nos tengan que marcar con el dedo de la desesperación si llegaran
a comprobar que hubo argentinos tan mal nacidos que a un hombre como el
general Perón, que ha quemado su vida para lograr el camino de la grandeza y la
felicidad de la Patria, lo combatieron aliándose con intereses foráneos.

Compañeros, por el cariño que nos une, les pido por favor que no me hagan hacer lo que no quiero hacer. Se los pido a ustedes como amiga, como compañera. Les pido que se desconcentren. Compañeros...¿Cuándo Evita los ha defraudado? ¿Cuándo Evita no ha hecho lo que ustedes desean? Yo les pido una cosa, esperen unos días...

Andrés Gattinoni: PET: Python Entre Todos, primera revista de Python

   Publicado:

A esta altura ya es una noticia vieja, pero quizás alguno no se haya enterado de que la semana pasada salió publicada la revista PET: Python Entre Todos.

La revista es una producción colaborativa de la Comunidad PyAr, con artículos de muy alto nivel de distintos participantes de la lista y el esfuerzo especial de sus dos editores, Roberto Alsina y Emiliano Dalla Verde Marcozzi.

PET: Python Entre Todos Num. 1

PET: Python Entre Todos Num. 1

Los artículos incluidos en la revista son:

  • PET First Shot
  • Cómo contribuir a PET
  • PyAr, la historia
  • from gc import commonsense – Finish Him!
  • Concurrencia Indolora: el módulo processing
  • Introducción a Unit Testing con Python
  • Taint Mode en Python
  • Dinamismo Aplicado
  • Decorando Código (Parte 1)
  • Web2Py Para Todos
  • ¿Cómo Está Hecha Esta Revista?
  • Desafío PET
  • Un poco de xkcd

La publicación fue todo un éxito porque se dinfundió rápidamente por Internet con la ayuda de diversos medios: blogs, twitter, barrapunto, etc. En mi opinión esta buena recepción se debió dos factores clave: la calidad del contenido que es realmente muy alta y que gracias a las tecnologías de software libre utilizadas para la edición de la revista, la misma pudo ser publicada en múltiples formatos: HTML online, PDF en distintos layouts y para e-book readers en ePub y Mobi. A todos ellos se puede acceder en la página del primer número de la revista.

Además, al poco tiempo de publicada la revista, Roberto descubrió que PET es la primera revista de Python… en el mundo!. Esto animó a la comunidad a crear una versión en inglés para poder difundirla a un mayor público. Personalmente tuve la opotunidad de colaborar traduciendo dos artículos, “PyAr, la historia” de Facundo Batista y “¿Cómo Está Hecha Esta Revista?” de Roberto Alsina. De esta manera, si no puedo aportar con un artículo interesante, por lo menos puedo colaborar para que las cosas interesantes que escriben otros puedan llegar a un público más amplio.

Así que seguramente pronto estemos anunciando la versión en inglés del número 1 de PET. Y en el futuro, según entiendo, la idea es poder incorporar artículos de colaboradores internacionales en ambas versiones de la revista.

Andrés Gattinoni: Una vueltita por las Charlas Abiertas de Python en La Tribu

   Publicado:

Charlas Abiertas de Python en La Tribu

Hoy pude darme una vuelta, por primera vez, por las Charlas Abiertas de Python en La Tribu. Le robé un tiempo al estudio y me dirigí a Lambaré 873 junto a un amigo, a ver qué tal estaban esas charlas.

No esperaba encontrar grandes revelaciones porque la charla a la que iba era la de Introducción al Desarrollo Web I, a cargo de Alejandro Cura, y yo ya trabajo en el rubro hace algunos años. Sin embargo me interesaba verle las caras a algunos miembros de la comunidad por quienes tengo un gran respeto.

Me encontré con un ámbito muy amigable, lleno de gente deseosa de aprender. Me alegró mucho encontrar algunas personas “mayores” (por lo menos mayores al tipo de gente que uno suele conocer en este acotado segmento del mercado laboral), muy interesadas y participativas. La charla estuvo muy bien, era una introducción para quienes no tienen idea de en qué consiste hacer un sitio web (y preparatoria para la próxima charla que dará algunos conceptos básicos de Web2Py). Me pareció muy copado que se le diera un poco de bola al protocolo HTTP y cómo funciona, porque en mi experiencia laboral me he encontrado con desarrolladores que pueden manejar muy bien algunos lenguajes como PHP, Javascript o HTML pero no tienen idea de cómo llegan esas cosas “a la mesa” del browser.

Incluso me encontré aprendiendo una cosita de CSS que no sabía y era la posibilidad de incluir tipografías externas (que quisiera ver qué tan compatible es con la bosta de IE, pero que me resultó muy útil).

Me hubiera gustado quedarme a la charla siguiente del eminente Roberto Alsina, pero lamentablemente tenía que volver a la cueva a estudiar.

Felicito desde este humilde lugar el enorme trabajo que está realizando la comunidad PyAr organizando estas charlas que permiten acercar herramientas a la sociedad para conocer y apropiarse de las nuevas tecnologías asociadas a la informática e Internet.

Evita: Open Office Kids. Los únicos privilegiados son los niños

   Publicado:
Muchos compañeros me envían cartas a la Fundación, quejándose del Open Office, ese paquetón ofimático que es extremadamente grande, pesado y lento. Como bien dijera un grasita el fin de semana pasado en las Jornadas del Sur "es la copia de una mala idea". Su lentitud y voracidad de recursos, solamente comparable a los de la oligarquía terrateniente, no lo hacen una pieza de software verdaderamente peronista.
Varios militantes del Justicialismo y el Software Libre buscamos alternativas a la suite emblema. Abiword es simple, funciona bien, pero le faltaría una planilla de cálculo con el mismo espíritu y un editor de presentaciones justicialista. Gnumeric podría cumplirlo, pero a veces es poco intuitivo y se pierde en los mares de la intrascendencia. KOffice es indescifrable para esta humilde servidora, y así podríamos seguir.
Pero, volviendo siempre a nuestras bases, a las veinte verdades peronistas, encontramos una vez más la solución a los problemas del pueblo argentino. El General Perón, desde su sabiduría, nos dice que "En la nueva Argentina, los únicos privilegiados son los niños" y así es que les presento el OOO4Kids, el Open Office para el niño Justicialista. Es un derivado del Open Office que hace casi todo lo que necesitamos pero usando muchísimos menos recursos que su pariente agrogarca. Yo misma lo uso en los trabajos del Ministerio y la Fundación, y hasta ahora no me ha dejado de a pie.
Incluye:
  • Writer (Procesador de textos)
  • Calc (Planilla de cálculos)
  • Draw (Gráficos vectoriales)
  • Impress (Presentaciones)
  • Math (Fórmulas matemáticas)

Con la misma determinación con la que sigo al General Perón, recomiendo a la masa obrera, a mis grasitas, que prueben este software, que les permitirá trabajar con documentos odf sin tener que vender el parquet para comprar más memoria RAM. Dejen que el niño gorila siga usando el M$ Office, en esclavo de los monopolios se está convirtiendo.
Mis queridos descamisados, siempre estoy con ustedes, cuidando de sus necesidades y abriendo mi mano servidora para llevarlos tomados de ella, por los caminos de la justicia social, la libertad y la soberanía. Viva Perón!

Evita: San Martín, Debian, Perón. Libertad para el pueblo

   Publicado:
"Nada de lo que yo tengo; nada de lo que soy; nada de lo que pienso, es mío: es de Perón. Yo no le diré la mentira acostumbrada; yo no le diré que no lo merezco; sí, lo merezco, mi general. Lo merezco por una sola cosa, que vale más que todo el oro del mundo: lo merezco porque todo lo hice por amor a este pueblo. Yo no valgo por lo que hice, yo no valgo por lo que he renunciado; yo no valgo ni por lo que soy ni por lo que tengo. Yo tengo una sola cosa que vale, la tengo en mi corazón, me quema en el alma, Me duele en mi carne y arde en mis nervios. Es el amor por este pueblo y por Perón. Y le doy las gracias a usted, mi general, por haberme enseñado a conocerlo y a quererlo. (Eva Perón)"

“La guerra la tenemos que hacer del modo que podamos. Si no tenemos dinero, carne y un pedazo de tabaco no nos han de faltar. Cuando se acaben los vestuarios nos vestiremos con las bayetitas que trabajan nuestras mujeres, y sino andaremos en pelotas como nuestros paisanos los indios. Seamos libres, que lo demás no importa nada” (José de San Martín)

"Debian es un sistema operativo (S.O.) libre, para su computadora. El sistema operativo es el conjunto de programas básicos y utilidades que hacen que funcione su computadora. Debian utiliza el núcleo Linux (el corazón del sistema operativo), pero la mayor parte de las herramientas básicas vienen del Proyecto GNU; de ahí el nombre GNU/Linux.
Debian GNU/Linux ofrece más que un S.O. puro; viene con 25000 paquetes, programas precompilados distribuidos en un formato que hace más fácil la instalación en su computadora. (Proyecto Debian, que ha cumplido 17 años el pasado 16 de agosto) "
Share