Blogs de miembros del LUGLi

viernes, 05 marzo

12:13

Joaquin Cañete: Mi Certificado Microsoft MAP 2010


Muchas gracias por la distincion, esto me impulsa a seguir aportando a la comunidad.

miércoles, 03 marzo

16:28

Roberto Alsina: Un par de horitas hackeando Kuatia...

Como he comentado hace un tiempito, de a ratos ando tratando de hacer un procesador de texto tipo "prueba de concepto". Por ahora está hsoteado en googlecode y se llama kuatia.

Obviamente no está ni cerca de ser útil para algo, pero... puede hacer listas itemizadas o numeradas anidadas.

Acá hay una captura del editor y de la salida PDF que produce vía reStructured Text:

editando2

No me parece que esté tan mal.

01:45

Juanjo Conti: os.path en el settings.py de Django para mayor comodidad

En el archivo de configuración settings.py de un proyecto Django, por lo general tenemos que setear variables como MEDIA_ROOT o STATIC_DOC_ROOT. Su contenido en una instalación Windows suele ser algo como: 'C:\Windows\camino\hasta\mi\projecto'. Y en Linux: '/home/usuario/camino/a/mi/proyecto'. El problema surge cuando el proyecto es desarrollado en varias máquinas a la vez, y con distintos sistemas operativos. Más aún, si hacemos lo anterior, seguramente versionaremos el proyecto y con él, al archivo de configuración. No sería raro que tras una actualización, el archivo se actualice con los valores que puso algún compañero de trabajo.

Mi solución es definir primero una variable para el proyecto:

PROJECT_PATH = os.path.abspath(os.path.dirname(__file__))

Luego podemos usarla para definir el path absoluto a la carpeta con archivos de media:

MEDIA_ROOT = os.path.join(PROJECT_PATH, 'media')

nuestros templates:

TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
os.path.join(PROJECT_PATH, 'templates')
)

o cualquier otra variable de configuración que requiere una ruta de directorios.

Con esta solución podemos cambiar el proyecto de carpeta, disco o computadora y seguirá funcionando.

jueves, 25 febrero

17:14

Juanjo Conti: Los 6 magníficos: divertimentos matemáticos

Cuando estaba en los primeros años de ingeniería, en la sala de consultas de Materias Básicas (el departamento que reúne las matemáticas, las físicas, las químicas, etc…) vi una calcamonía que me llamó la atención. Planteaba una igualdad entre cinco números: pi, i, e, 0 y 1.

Ayer, durante una reunión en la misma sala, volví a encontrarla. Seguía en el mismo rincón de un pizarrón, con una punta ajada. No resistí la tentación de fotografiarla y quedármela para siempre. Se las comparto:

Imagen778

Una versión, más desprolija, pero en dónde se lee mejor:

Imagen779

Una primera pregunta es: ¿Es verdad esa igualdad? Resulta que sí. Lo que me llamó la atención por años es conocido como Identidad de Euler.

Pero lo que realmente desvela es que la calcamonía se titulaba “Los seis magníficos” y remata “¿y el que falta?”.¿ Alguien tiene la respuesta?

08:16

Roberto Alsina: Marave 0.7 liberado

Acabo de subir la versión 0.7 de Marave mi editor de pantalla completa a http://marave.googlecode.com

Marave es un editor "relajado" inspirado por ommwriter, DarkRoom y muchos otro. Posee una interfaz espartana a pantalla completa con elementos que se "desvanecen" para no interponerse entre el usuario y su texto.

Soporta resaltado de sintaxis, corrector ortográfico en línea, música de fondo, feedback audible de teclado, temas, extensión via plugins, y mucho más.

La captura de pantalla obligatoria:

marave18

No hay grandes features nuevos en 0.7 pero hay cambios internos grandes, y bugs importantes corregidos:

  • Corregido bug que rompía abrir archivos si no había corrector ortográfico
  • Implementado soporte para lenguajes RTL
  • Varios arreglos menores
  • Refactoreado completo del componente editor

miércoles, 24 febrero

11:13

Roberto Alsina: Un adelanto de una idea

Vengo pensando en qué es lo que realmente pero realmente necesito en un procesador de textos. Y en qué se necesitaría para crear una cosa así.

Unos minutos jugando me han llevado por el camino de este adelanto (video acá por si no lo ven <):

¿Se convertirá en algo? ¡Quién sabe!

martes, 23 febrero

11:23

Roberto Alsina: Editor: un QTextEdit mejor

Escribir un editor de texto es reinventar la rueda. Ya lo sé. Me digo a mí mismo Marave es una linda rueda, con características propias, y creo que eso es cierto, pero, si estás reinventando la rueda, no sirve de nada reinventar el eje y el rayo también.

Por eso refactoreé todas esas cosas que yo creo que un editor de texto debe tener en una linda biblioteca, para que la próxima vez que alguien deba reinventar la rueda, pueda usar los bonitos rayos y eje de Marave.

Entonces, aquí está Editor, la clase con el nombre más obvio posible! Es un widget de edición de texto para PyQt con features extra, que se puede usar como reemplazo de QTextEdit o QPlainTextEdit.

Por ahora, vive adentro del SVN de Marave pero tal vez algún día salga de ahí.

Éstos son los features:

  • Resaltado de sintaxis:

    Y no "en teoría", como QTextEdit y demás! Editor puede resaltar un montón de lenguajes porque usa GNU source highlight via el Source Highlight Qt de Loreno Bettini.

  • Corrector ortográfico

    Si instalás PyEnchant con los diccionarios correctos, hace corrección ortográfica online.

  • Widgets de Buscar y Buscar y Reemplazar

    La clase Editor te da lindos widgets para buscar y buscar y reemplazar ya conectados con el widget del editor, para que lo agregues fácilmente a tu aplicación.

  • Métodos new/open/save/saveas:

    No implementes abrir/guardar, etc! Eso es siempre el mismo código!

Ojalá le sirva a alguien más :-)

09:03

Roberto Alsina: Capítulo adelanto de "Grok 1.0 Web Development"

La gente en Packt Publishing me mandó una copia de Grok 1.0 Web Development por Carlos de la Guardia para que la comente.

Lo estoy leyendo, y voy a escribir algo en unos días (De paso: está bueno! Propongo este slogan para Grok: Como Zope, pero sin el Java [1]), y acá hay un capítulo de muestra para que vean de qué se trata. Es fácil de leer sin el resto del libro:

Chapter 5: Forms

Esta semana estuve peleando con ese engendro que eran los Django oldforms (sitio viejo, ni pregunten), así que los forms de Grok me parecieron encantadores! ;-)

[1] Sí, por supuesto que Zope no tiene Java, sólo se siente como si fuera Java ;-)

lunes, 22 febrero

09:27

Luis Larrateguy: Traducir un archivo PO con Google Translator y Python

Mediante el uso de POedit, uno puedo crear traducciones para internacionalización sobre un archivo base, el cuál contiene las cadenas de texto de cierto software. Sin embargo si las cadenas son muchas, podemos hacer uso de alguna herramienta de traducción, y limitarnos a luego revisar y encontrar la traducción más adecuada para el contexto en el que se encuentra cada texto.

Particularmente necesitaba traducir un tema de Wordpress que traía su propio archivo .po en inglés (en-EN.po). Hice un pequeño script en Python que hace uso de py-translate. Este módulo hace uso de la API de Google Translate. Quizá a alguno le resulte útil o pueda adaptarlo a sus necesidades (ya que está todo harcodeado dentro :-P ).

# coding=utf-8
import gtrans
 
fo = open("en_EN.po","r")
fi = open("es_ES.po","w")
 
for line in fo:
    if line.find("msgid") == 0:
        cad = gtrans.translate("en","es",line.split("\"")[1])
        #print line.encode("utf-8"),
        fi.write(line.encode("utf-8"))
        fi.write("msgstr \""+cad.rstrip().encode("utf-8")+"\"\n")
    elif line.find("msgstr") == 0:
        pass
    else:
        #print line.encode("utf-8"),
        fi.write(line.encode("utf-8"))
 
fo.close()
fi.close()

Sé que Mancho hizo algo parecido en PHP. Apenas pueda lo enlazo.
Enlace al artículo de Mancho


09:08

Luis Larrateguy: OLAP explicado en video

Slice & Dice, en español tajar y rotar, son una de las operaciones que se pueden hacer mediante consultas MDX en un cubo OLAP. Algunas de estas cuestiones mostramos con Milton cómo lograrlas con Pentaho en la charla que dimos en 5to año de ISI en el 2009 (Sistemas de Gestión II) y en la Maestría de Sistemas de Información el mismo año. Pueden encontrar algo de código de ejemplo en el repositorio del Gabinete de Software Libre. No somos expertos BI, pero nos gustaría serlo apenas tengamos la oportunidad ;-) .

Mientras tanto, me encuentro con esto mediante Todo BI. Una analogía de cómo una ama de casa hace Slice & Dice a diario jeje.

Pinche aquí para ver el vídeo


domingo, 21 febrero

21:54

Roberto Alsina: ¿Tenemos tan poca idea de lo que cuesta el software?

Esto dice Ohloh del costo de desarrollar Marave:

Realmente, Marave es como mucho un mes de programar part-time. Cómo puede eso humanamente ser U$S71355 o "1 año persona"?

¿Esta basura es lo mejor que tenemos para estimar costos? Si es así, la próxima vez que vean algo como "El programa X llevaría Y años y costaría Z dólares", recórtenlo por un factor de 10 o más.

Ésto es lo que costó desarrollar Marave:

  • Nada

Bueno, ésto es lo que hubiera costado si lo cobrara:

Estoy suponiendo unas 100 horas de mi tiempo. A mi precio de "ojalá me lo paguen", U$S 40/hora, son U$S 4000, que quiere decir que Ohloh le pifia por un 1600%.

Por otro lado, por tanto trabajo freelance no te voy a cobrar precio completo, lo más seguro es que te cobra algo como U$S 20/hora lo que quiere decir que Ohloh está un 3000% arriba.

En conclusión: si te gusta mi código (y lo podés ver por vos mismo), contratame, soy o increíblemente barato o increíblemente rápido.

18:49

Roberto Alsina: Marave 0.6 en la calle

La versión 0.6 de Marave, mi tranquilo editor a pantalla completa está en el lugar de siempre: http://marave.googlecode.com

Cosas nuevas:

  • Resaltado de sintaxis
  • Plugins
  • Bugs arreglados
  • Animaciones más bonitas
  • Limpieza de código

Captura de pantalla gratuita:

viernes, 19 febrero

19:07

Roberto Alsina: El momento ajá!

Hoy quise hacer una cosita en Marave. El objetivo era:

  1. Hacer un "fade in" de un widget
  2. Setear una variable
  3. Hacer un "fade in" de otro widget

Es importante hacerlo en ese orden y es importante que la aplicación siga respondiendo.

Acá está el código que usé (simplificado):

def fadein(thing, target=1., thendo=None):
    """
    * thing is a QWidget
    * thing.proxy is a QGraphicsWidget
    * thendo is callable
    * target is the desired opacity
    """

    thing.anim=QtCore.QPropertyAnimation(thing.proxy, "opacity")
    thing.anim.setDuration(200)
    thing.anim.setStartValue(thing.proxy.opacity())
    thing.anim.setEndValue(target)
    thing.anim.start()
    thing.anim.finished.connect(thing.anim.deleteLater)
    if thendo:
        thing.anim.finished.connect(thendo)

Y se usa así:

def later():
    avar=avalue
    fadein(widget2)

fadein(widget1, thendo=later)

¿No es lindo? Tener funciones como objetos de primera clase significa que puedo tomar later como un closure, junto con widget2 y avar que sólo necesitan estar definidas en el scope local, y la cadena de llamadas funciona ¡exactamente como quiero!

Sí, en muchos otros lenguajes se hace lo mismo, y en Javascript es un truco común... ¡pero PyQt es un wrapper de C++!

Me parece que este tipo de uso muestra el valor agregado que PyQt te da, no es solamente que con python evitás la compilación aburrida, o que tenés la increíble biblioteca estándar, sino que el lenguaje mismo te deja hacer cosas que no son prácticas en C++.

La única manera que se me ocurre de hacer esto en C++ es crear un slot que sea el equivalente de later, y encadenarlo a la señal... lo que quiere decir que ese later descartable se convierte en parte de la interface de la clase. (!?)

Habría que definir later en algún otro lado del archivo, separado de su único uso (tal vez inine en el header).

Aún así, eso no es equivalente: avalue podría ser algo no fácil de acceder cuando se ejecuta later (por ejemplo, el timestamp del primer fadein), habría que buscar donde guardarlo para que later lo encuentre, no se puede volver a hacer esto hasta después que se ejecute later... se pone complicado.

A veces programar es como una cachetada... te das cuenta que cosas que usás sin pensar no son nada triviales.

Así que recuerda joven aprendiz: podés elegir las herramientas. Elegí con cuidado.

jueves, 18 febrero

15:50

Roberto Alsina: Extendiendo Marave

Marave es un editor de texto. Si hay una cosa que es cierta de todos los editores es ésta: siempre les falta un feature que necesitás.

Entonces la solución, en la antigua tradición de Emacs y Vim es... hacerlo extensible.

Soy un gran fan de los programas extensibles por el usuario.

Así que... acá está la anatomía de un plugin de Marave tal como funciona ahora mismo en SVN trunk, lo que por supuesto puede cambiar en cualquier momento.

Creando un plugin

Sólo hay que crear un archivo .py en la carpeta plugins. Éste es el plugin más básico, que no hace nada:

# -*- coding: utf-8 -*-

from plugins import Plugin
class Smarty(Plugin):
    name='smarty'
    shortcut='Ctrl+.'
    description='Smart quote and dash replacement'
    mode="qBde"

Valores por default de algo configurable (en este caso "mode") se ponen en la clase.

Los campos obligatorios:

  • shortcut: un atajo de teclado que dispara este plugin
  • name: un nombre corto
  • description: una descripción de una línea

¿Qué hace esto? Agrega el plugin a la lista en el diálogo de preferencias, y se puede abrir el diálogo de configuración del plugin, donde se puede cambiar el shortcut:

maraveplugin1

Si se habilita este plugin, cuando el usuario use ese shortcut, se llama al método "run" del plugin.

Haciéndolo Configurable

Éste plugin soporta distintos modos de operación. Para hacer que esto sea accesible al usuario, hay que implementar unos pocos métodos mas.

El método addConfigWidgets toma como argumento un diálogo, y agrega lo que uno quiera ahí:

@classmethod
def addConfigWidgets(self, dialog):
    print 'Adding widgets to smarty config'
    l=dialog.ui.layout
    self.q=QtGui.QCheckBox(dialog.tr('Replace normal quotes'))
    if 'q' in self.mode:
        self.q.setChecked(True)
    self.b=QtGui.QCheckBox(dialog.tr('Replace backtick-style quotes (` and ``)'))
    if 'B' in self.mode:
        self.b.setChecked(True)
    self.d=QtGui.QCheckBox(dialog.tr('Replace -- by en-dash, --- by em-dash'))
    if 'd' in self.mode:
        self.d.setChecked(True)
    self.e=QtGui.QCheckBox(dialog.tr('Replace ellipses'))
    if 'e' in self.mode:
        self.e.setChecked(True)
    l.addWidget(self.q)
    l.addWidget(self.b)
    l.addWidget(self.d)
    l.addWidget(self.e)

Y entonces el diálogo de configuración se ve así:

maraveplugin2

También queremos que esas opciones se puedan guardar en algún lado, entonces reimplementamos saveConfig:

@classmethod
def saveConfig(self, dialog):

    self.shortcut=unicode(dialog.ui.shortcut.text())
    self.settings.setValue('plugin-'+self.name+'-shortcut', self.shortcut)

    newmode=""
    if self.q.isChecked():
        newmode+='q'
    if self.b.isChecked():
        newmode+='B'
    if self.d.isChecked():
        newmode+='d'
    if self.e.isChecked():
        newmode+='e'
    self.mode=newmode

    self.settings.setValue('plugin-smarty-mode',self.mode)
    self.settings.sync()

Y queremos que esas opciones se lean antes de crear el plugin, entonces:

@classmethod
def loadConfig(self):
    print 'SMARTY loadconfig', self.settings
    if self.settings:
        sc=self.settings.value('plugin-'+self.name+'-shortcut')
        if sc.isValid():
            self.shortcut=unicode(sc.toString())
        mode=self.settings.value('plugin-smarty-mode')
        if mode.isValid():
            self.mode=unicode(mode.toString())

Que haga algo!

Y sí, hay que hacer que sirva para algo. El plugin tiene acceso a un "client" que es la ventana principal de Marave. Todo está ahí, en alguna parte ;-)

def run(self):
    print 'running smarty plugin'
    text=unicode(self.client.editor.toPlainText()).splitlines()
    prog=QtGui.QProgressDialog(self.client.tr("Applying smarty"),
                               self.client.tr("Cancel"),
                               0,len(text),
                               self.client)
    prog.show()
    output=[]
    for i,l in enumerate(text):
        output.append(unescape(smartyPants(l,self.mode)))
        prog.setValue(i)
        QtGui.QApplication.instance().processEvents()
    prog.hide()
    self.client.editor.setPlainText('\n'.join(output))

Y ya está, si se habilita el plugin smarty, se pueden "arreglar" las comillas, guiones y elipsis con una combinación de teclas :-)

Código fuente completo aquí: http://code.google.com/p/marave/source/browse/trunk/marave/plugins/smarty.py

Falta hacer: otras maneras de integrar plugins en la interface, botones, paneles, etc.

martes, 16 febrero

20:43

Fabián Flores: Nos tomamos un descanso


Reiniciaremos el ciclo de publicaciones en el mes de marzo.

16:20

Roberto Alsina: Afeitando yaks: 16/2/2010

afeitar yaks
(figurado) Cualquier actividad aparentemente inútil que, al permitirte superar dificultades intermedias, te permite resolver un problema mayor.

Hace un tiempo escribí acerca de como implementé un resaltador de sintaxis generalizado para PyQt usando pygments.

Recibí un pedido de un feature similar en Marave, así que desenterré ese código y... no sirve para nada. Es demasiado lento para un uso razonable.

Entonces a este yak ya le creció de nuevo todo el pelo, y ¡justo tengo este par de tijeras nuevas!

La meta es lograr resaltar sintaxis en un QPlainTextEdit de forma que:

  • No requiera programar para añadir un nuevo resaltador.
  • No requiera programar para añadir un esquema de colores.
  • No requiera que me pase el 2010 escribiendo resaltadores para lenguajes existentes.
  • Sea suficientemente rápido

Una búsqueda rápida en google muestra que para C++ se puede usar Source highlight qt que está basado en GNU source highlight.

Obviamente, no hay binding python que yo vea, así que... ¡me escribí uno!

Acá está: http://marave.googlecode.com/svn/trunk/marave/highlight/

Y ésta es una captura del programa de demo corriendo, mostrandose a sí mismo entero:

Se puede crear un esquema de colores usando CSS, un lenguaje se define con un archivo de texto, hay una pila ya hechos, y parece lo bastante rápido.

Entonces declaro a este yak afeitado, y otro feature (no terminado!) para Marave

09:00

Fabián Flores: Manual de XLogo


LOGO es un lenguaje desarrollado a finales de los años 60 por Seymour Papert. Es un lenguaje excelente para comenzar a estudiar programación, y enseña lo básico acerca de temas como bucles, condicionales, procedimientos, etc. El usuario puede mover un objeto llamado "tortuga" dentro de la pantalla, usando instrucciones (comandos) simples como "avanza", "retrocede", "giraderecha" y similares.

lunes, 15 febrero

15:47

Roberto Alsina: Como implementar "reemplazar todos" en un QPlainTextEdit

Esto no le va a interesar a nadie, pero ya que no lo pude encontrar en google y fué un poco molesto de adivinar:

Así es como se implementa 'reemplazar todos' en un QPlainTextEdit (o un QTextEdit, probablemente) usando PyQt (es similar para C++).

def doReplaceAll(self):
    # Replace all occurences without interaction

    # Here I am just getting the replacement data
    # from my UI so it will be different for you
    old=self.searchReplaceWidget.ui.text.text()
    new=self.searchReplaceWidget.ui.replaceWith.text()

    # Beginning of undo block
    cursor=self.editor.textCursor()
    cursor.beginEditBlock()

    # Use flags for case match
    flags=QtGui.QTextDocument.FindFlags()
    if self.searchReplaceWidget.ui.matchCase.isChecked():
        flags=flags|QtGui.QTextDocument.FindCaseSensitively

    # Replace all we can
    while True:
        # self.editor is the QPlainTextEdit
        r=self.editor.find(old,flags)
        if r:
            qc=self.editor.textCursor()
            if qc.hasSelection():
                qc.insertText(new)
        else:
            break

    # Mark end of undo block
    cursor.endEditBlock()

Hay otras maneras más fáciles, pero esta hace que todo aparezca en una sola operación en la pila undo/redo y esas cosas.

09:00

Fabián Flores: The Zope Book


Zope is a free and open-source, object-oriented web application server written in the Python programming language. Zope stands for "Z Object Publishing Environment." It can be almost fully managed with a web-based user interface. Zope publishes on the web Python objects that are typically persisted in an object database, ZODB. Basic object types, such as documents, images, and page templates,

domingo, 14 febrero

23:40

Fabián Flores: Análisis de impacto en redes TCOS


Es un proyecto de software Libre, que permite la utilización y administración de varios terminales obsoletos conectados a uno o mas servidores de la red, compartiendo el mismo sistema operativo y otros recursos tecnológicos, tales como: impresora, el acceso a Internet, la sesión gráfica, el CD­ROM, el almacenamiento usb, o el almacenamiento centralizado de los archivos de los usuarios,

viernes, 12 febrero

19:25

Roberto Alsina: Marave 0.5 publicado

Acabo de subir Marave 0.5 al lugar habitual. Marave es un editor de texto relajado, a pantalla completa, que trata de no distraerte.

¡Hasta incluye un pequeño reproductor musical para que no tengas que pensar en otra aplicación!

Esta versión tiene varios bugs arreglados, y se ve un poco más bonita.

El nuevo feature es... internacionalización. Por ahora sólo una traducción al castellano, pero si alguien quiere ayudar traduciéndolo a otro idioma, por favor, adelante!

Hay sólo unas 60 frases, por lo que no debería ser más de una hora de trabajo.

Aquí hay una captura de pantalla de esta versión:

.. raw:: html marave7

Marave es software libre bajo la GPLv2, y debería funcionar en cualquier plataforma donde funcione PyQt, lo que quiere decir Mac, Windows, y sistemas operativos tipo unix, por lo menos.

09:00

Fabián Flores: Introducción a LYX


LyX es un procesador de documentos que fomenta para la escritura un enfoque basado en la estructura del documento (WYSIWYM) y no simplemente en su aspecto (WYSIWYG). LyX combina la potencia de TeX/LaTeX con la facilidad de uso de una interfaz gráfica. Esto resulta en un soporte universal para la creación de contenido matemático (mediante un editor de ecuaciones totalmente integrado) y

jueves, 11 febrero

11:00

Roberto Alsina: Empaquetar es DIFÍCIL

Vengo trabajando muy duro en Marave, un editor a pantalla completa al estilo de ommwriter, DarkRoom, WriteRoom, pyRoom, etc. Vengo trabajando duro, y quiero que sea usado.

O ni siquiera eso, quiero que la gente tenga la oportunidad de usarlo.

Eso significa que quiero que funcione en Windows (y tal vez en OSX algún día, si alguien me da una mano). Lo que significa que tengo que hacer una versión para Windows.

hagamos una comparación rápida desde el punto de vista del usuario y del desarrollador.

El usuario, en Linux

Esto es en Arch Linux, que es lo que yo uso, en otras variantes es más o menos lo mismo una vez que Marave sea mas conocido.

yaourt -S marave-svn --noconfirm

Eso obtiene el código de SVN (por ahora es lo mejor, más adelante empaquetaré releases), todas las dependencias, y lo instala. Tarda unos 15 segundos en mi notebook.

Después de eso, tenés un Marave funcionando.

En caso de que no esté en tu distro, tenés que instalar PyQt (que seguro si está) y correr:

easy_install marave

El usuario, en windows

Vas a http://marave.googlecode.com, click en "Marave-0.5.win32.exe" (No lo busques, todavía no está) bajás un programa de 10MB. Eso es un programa de 10MB porque windows no cree en paquetes y en dependencias. En Linux un paquete de Marave sería 1MB (casi todo imágenes), y sería datos, no ejecutable.

Por supuesto hoy en día un browser no te ejecuta un programa que bajaste, asi que... hagamos una galería!

110111105613-My-Desktop
110111105613-My-Desktop by Roberto Alsina

Sí, guardar.

11011111220-My-Desktop
11011111220-My-Desktop by Roberto Alsina

Doble click para abrir.

11011111417-My-Desktop
11011111417-My-Desktop by Roberto Alsina

Sí, estoy de acuerdo.

11011111514-My-Desktop
11011111514-My-Desktop by Roberto Alsina

Hmmm, bueno.

1101111167-My-Desktop
1101111167-My-Desktop by Roberto Alsina

Bárbaro...

11011111750-My-Desktop
11011111750-My-Desktop by Roberto Alsina

Genial!

Ahora este Marave puede funcionar o no pero eso es para más adelante...

El desarrollador, en Linux

Primero, este es el mayor problema un "empaquetador" puede tener en Linux:

Como Marave es una aplicación nueva, y la desarrollo en Arch Linux que es medio cutting edge, usa features que sólo están en versiones nuevas de PyQt. De hecho no funciona con PyQt < 4.6, que no está en algunas distros "lentas" o en un Ubuntu que no es el último.

Solución? Bueno, podría ignorarlo, pero que tanto, vamos a arreglarlo!

Graias a PyInstaller ni siquiera es tan difícil, este es el archivo spec:

a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'marave/main.py'],
            pathex=['/home/ralsina/trunk/trunk'])

pyz = PYZ(a.pure)
exe = EXE(pyz,
        a.scripts,
        exclude_binaries=1,
        name=os.path.join('build/pyi.linux2/main', 'marave.exe'),
        debug=False,
        strip=False,
        upx=True,
        console=0 )

coll = COLLECT( exe,
            a.binaries,
            [('radios.txt','marave/radios.txt','DATA')],
            Tree('marave/icons','icons'),
            Tree('marave/backgrounds','backgrounds'),
            Tree('marave/clicks','clicks'),
            Tree('marave/stylesheets','stylesheets'),
            Tree('marave/themes','themes'),
            a.zipfiles,
            a.datas,
            strip=False,
            upx=True,
            name=os.path.join('dist', 'marave'))

Usando esto, PyInstaller produce una linda carpeta llena de todo lo que Marave necesita para funcionar en cualquier Linux.

Por otro lado, si se puede contar con que haya un PyQt reciente disponible, también es fácil. Éste es el archivo de configuración para un paquete similar en Arch Linux (todavía no hice uno para Marave). Para otros Linux es más o menos lo mismo, y normalmente alguien te lo hace:

# Contributor: Roberto Alsina <ralsina@kde.org>
pkgname=python-rst2pdf
pkgver=0.12.1
pkgrel=4
pkgdesc="Create PDFs from simple text markup, no LaTeX required."
arch=('i686' 'x86_64')
url="http://rst2pdf.googlecode.com"
license=('custom')
depends=('python' 'setuptools' 'docutils' 'pygments' 'python-reportlab' 'python-simplejson' 'pil')
source=(http://rst2pdf.googlecode.com/files/rst2pdf-$pkgver.tar.gz LICENSE.txt)
optdepends=('uniconvertor: vector images support'
            'python-svglib: SVG support'
            'python-wordaxe: hyphenation'
            'pythonmagick: PDF images support')
build() {
cd $startdir/src/rst2pdf-$pkgver
python setup.py install --root=$startdir/pkg || return 1
install -D ../LICENSE.txt $startdir/pkg/usr/share/licenses/python-rst2pdf/COPYING
install -D doc/rst2pdf.1 $startdir/pkg/usr/share/man/man1/rst2pdf.1
}
md5sums=('ea6beda9a46f34ba42c4c94d48cc607a'
        '416f8046c66b9476cdbacda69a673afe')

Y eso es todo lo que hay que saber del proceso de empaquetar tu aplicación para Linux, es fácil de hacer, y la mayor parte del tiempo, fácil de hacer bien.

Ahora, la sección final...

Windows para el desarrollador

¿Primero, te acordás de eso de depender de la versión de sistema de Qt? Olvídalo, no hay versión de sistema. Tampoco hay Python, así que no importa. Y nadie los va a instalar para tu aplicación, así que tenemos que meter todo nosotros, o nada.

Pero lo bueno es que PyInstaller funciona para Windows! Entonces, usando el mismo spec funciona, no?

Bueno, hay dos problemas...

Problema 1: El instalador

Los usuarios de Windows no van a abrir un zip y conectar el binario con el menú de inicio ni nada parecido, así que hay que hacer un instalador.

Esto es lo que hice para NSIS, un creador de instaladores gratuito:

;--------------------------------
;Include Modern UI

!include "MUI2.nsh"

;--------------------------------
;General

;Name and file
Name "Marave"
OutFile "Marave-0.5.win32.exe"

;Default installation folder
InstallDir "$LOCALAPPDATA\Marave"

;Get installation folder from registry if available
InstallDirRegKey HKCU "Software\Marave" ""

;Request application privileges for Windows Vista
RequestExecutionLevel user

;--------------------------------
;Interface Settings

!define MUI_ABORTWARNING

;--------------------------------
;Pages

!insertmacro MUI_PAGE_LICENSE "LICENSE"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
;Languages

!insertmacro MUI_LANGUAGE "English"

;--------------------------------
;Installer Sections

Section "Install"

SetOutPath "$INSTDIR"
File /r "dist\marave"


;Store installation folder
WriteRegStr HKCU "Software\Marave" "" $INSTDIR

;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"

;Create shortcuts
CreateDirectory $SMPROGRAMS\Marave
CreateShortCut "$SMPROGRAMS\Marave\Marave.lnk" "$INSTDIR\marave\marave.exe" ; use defaults for parameters, icon, etc.
CreateShortCut "$SMPROGRAMS\Marave\Uninstall Marave.lnk" "$INSTDIR\Uninstall.exe" ; use defaults for parameters, icon, etc.

SectionEnd


;--------------------------------
;Uninstaller Section

Section "Uninstall"

Delete "$INSTDIR\Uninstall.exe"
RMDir /r "$INSTDIR"

DeleteRegKey /ifempty HKCU "Software\Marave"

SectionEnd

Es comparable al esfuerzo de hacer un arhivo de empaquetado, excepto que cada vez que lo querés probar... lo instalás. No hay manera (que yo vea) de saber qué hay adentro del instalador excepto correrlo.

Cuando las cosas fallan, no hay mensajes de error, por lo menos no del tipo que es útil para un desarrollador, el que necesita saber que salió mal.

Después de que termina, tal vez no funcione porque...

Problema 2: bibliotecas de sistema. Ja!

Los binarios de Python 2.6 están compilados con Visual Studio. Eso quiere decir que necesitan el Visual Studio Runtime, específicamente MSVCR90.DLL. Ésta contiene cosas que en Linux serían considerado parte de la libc (linuxero: imaginate aplicaciones que dependen de una libc específica... ¡no es fácil!)

En Linux eso es parte del sistema. Más aún, si lo necesitas, lo redistribuís. En Windows... es diferente.

  1. Es parte del "Visual C++ redistributables"

  2. Instalarlo no es garantía de que ande (sí, lo probé)

  3. La licencia de esos 'redistributables' dice que no lo podés hacer disponible para descarga.

    Me han dicho que incluírlo en tu instalador es legal, pero a mí me parece que eso es hacerlo disponible para descarga!

¿Qué se hace cuando necesitás una biblioteca, no la podés distribuir y el usuario no la va a instalar?

Bueno, por algo no hay binarios de Marave para Windows todavía ;-) Por supuesto si alguien lo puede resolver, me encantaría!

09:00

Fabián Flores: La conquista silenciosa del ciberespacio.


La conquista silenciosa del ciberespacio explora una de las tendencias más profundas en el gobierno de nuestras sociedades: a saber, el cambio de paradigma regulativo que emerge en el heterogéneo campo de las regulaciones en Internet. El trabajo analiza las luchas, tensiones y estrategias políticas que enfrentan la apertura y la libertad, con la clausura y el control en las capas superiores

miércoles, 10 febrero

18:40

Luis Larrateguy: Google Buzz!! Bzzz!!!! bzzz!!!!!

google buzz logoAjjj Google Buzz! un nuevo servicio que se agregó dentro de mi Gmail. Hoy no tengo ganas de probar nada nuevo! ningún beta nada. Menos algo invasivo que se me metió de golpe ahí tan visible. Creo que igual le di aceptar cuando me logueé en el sistema, pero no recuerdo. Por suerte existe un link al pie de página para desactivarlo. Turn Off Buzz :-D

Lo que aplaudo por ahora es el nombre. Nada más sincero que llamarlo Google Buzz. En el norte le llaman Buzz o a lo que hace “ruido”*. Claro, viene de la onomatopeya buzzzz ruido de abejas o algo así. Luego aparecen las Buzz Words, los Buzz Topics, etc. AJAX, The Cloud, Cloud Computing, Business Intelligence (bueno.. este.. esta me gusta ja). Términos acuñados para hacer un poco de ruido con cosas existentes… meterle un poco de márketing.

En fin… contradictoriamente, que vivan las buzzwords que muchas veces nos dan de que hablar jajaja :-)

* Me entero que a veces se usa con otras intenciones o puede tener otras connotaciones.


09:00

Fabián Flores: Manual de AJAX. Las entrañas de AJAX


Esta es la segunda edición del manual de AJAX que en su primera versión se llamó: "El poder de AJAX", escrito como práctica de final de carrera de Juan Mariano Fuentes Serna en la Universidad de Málaga, España. Para esa ocasión el autor de esta obra intentó probar a fondo las características de AJAX, incluyendo su escalabilidad, para lo que desarrolló un juego online multi-jugador. En

martes, 09 febrero

13:58

Fabián Flores: Constantine. Aprende a usar Fedora desde cero


Nunca es fácil empezar con algo, y no iba a ser diferente con los sistemas operativos. Probablemente has oído que GNU/Linux es uno de los más complicados de utilizar, que todo se hace escribiendo comandos, etc... Te aseguramos que eso no es así. Desde hace bastantes años, la comunidad Linux ha estado desarrollando diferentes interfaces de usuario que permiten que el usuario novato (es decir,

13:04

Roberto Alsina: Marave 0.4 en la calle!

Acabo de sacar la versión 0.4 de Marave, un editor a pantalla completa sin distracciones, en http://marave.googlecode.com

Esta versión incluye varios bugs arreglados y nuevos features comparado con 0.3:

  • Funciona bien con WindowMaker (los diálogos salían atrás de la ventana principal)
  • Funciona mejor con el estilo GTK+ de Qt (y otros) en los que los combos eran inusables
  • Nuevo soporte de fondos en SVG
  • Limpieza de código

Marave es software libre bajo la GPL, y debería funcionar en todas las plataformas importantes.

Me encantaría ver reacciones a este release, así como ideas para el futuro de Marave, si quieres ayudar, por favor únete a la lista de correo:

http://groups.google.com/group/marave-discuss

Por supuesto, si te gusta Marave, eres libre de darme dinero

lunes, 08 febrero

18:17

Roberto Alsina: Marave 0.3 en la calle!

Acabo de sacar la versión 0.3 de Marave, un editor a pantalla completa sin distracciones, en http://marave.googlecode.com

Esta versión incluye varios bugs arreglados y nuevos features comparado con 0.2:

  • Nuevo soporte de 'Estilos', se puede cambiar el aspecto de Marave con sintaxis CSS
  • Mejorado soporte de temas, se incluyen algunos.
  • Arreglado bug de preferencia de color de texto
  • Arreglado bug de cambio de tipografía
  • Usa el nombre del documento en el título de la ventana
  • Notificación de qué estás escuchando

marave es software libre bajo la GPL, y debería funcionar en todas las plataformas importantes.

Me encantaría ver reacciones a este release, así como ideas para el futuro de Marave, si quieres ayudar, por favor únete a la lista de correo:

http://groups.google.com/group/marave-discuss

Por supuesto, si te gusta Marave, eres libre de darme dinero

09:00

Fabián Flores: HHS - Introducción a la seguridad de sistemas para adolescentes


Bienvenido al programa Hacker Highschool! Este programa está diseñado para animarte a estar al día y valerte por tí mismo. El tema principal de instrucción es satisfacer la curiosidad hacker que hay en tí y guiarte progresivamente a través de una educación hacker para ayudarte a crecer en un rol responsable capaz de determinar los problemas de seguridad y privacidad y ayudarte a tomar

domingo, 07 febrero

16:49

Roberto Alsina: Salió Marave 0.2!

La versión 0.2 de Marave, un editor libre de distracciones está disponible ahora en http://marave.googlecode.com.

Ésta versión incluye unos cuantos arreglos y nuevas características implementadas desde 0.1.1:

  • Se corrigió el menú de botón derecho corrupto (Issue 20)
  • No más parpadeo al cambiar el fondo
  • Información más detallada de licencias
  • Más probado en Windows
  • Ayuda (F1)
  • Buscar y Reemplazar (pero "reemplazar todas" no está)
  • Nuevo arte
  • Notificaciones de status
  • Info del documento (Ctrl+I)
  • Mejor feedback en la interfaz (sobre todo los botones)
  • Guarda tamaño de tipografía correctamente
  • Arreglado el problema de "Arranca en el fondo" (Issue 17)

Marave es software libre liberado bajo la GPL, y debería funcionar en todas las plataformas principales.

Me encantaría obtener feedback de esta versión, así como ideas para el futuro de Marave, por lo que se abrió una lista de correo:

http://groups.google.com/group/marave-discuss

Por supuesto, si te gusta Marave, sos libre de darme dinero

sábado, 06 febrero

11:35

Juanjo Conti: Aplicar un decorador a todas las funciones de un módulo en Python

En la lista de PyAr preguntaron si había alguna forma de aplicar un decorador a todos las funciones de un módulo. Envié una solución sin probarla, que al verla unos días más tarde parece bastante buena :)

La comento aquí con un ejemplo. modulo.py contiene definiciones de funciones:

def a():
    pass

def b():
    print 42

def c():
    a()
    b()

y decoradores.py un decorador que imprime el nombre de la función llamada:

def nombrador(f):
    def inner(*a, **kw):
        print "Ejecutando %s" % f.__name__
        return f(*a, **kw)
    return inner

(Si no sabés lo que es un decorador, podés leer mi post Decoradores en Python I: Introducción)

En lugar de modificar las definiciones de funciones en modulo.py para aplicar el decorador a cada una de las funciones, ya sea usando el azúcar sintáctica de Python:

@nombrador
def a():
    ...

o mediante una llamada a la función:

a = nombrador(a)

podemos agregar el siguiente código al final de modulo.py:

for n,v in locals().items():
   if inspect.isfunction(v) and n != 'nombrador':
       locals()[n] = nombrador(v)

Vamos a explicarlo:

la llamada a la función built-in locals retorna un diccionario representando el espacio de nombres local: cada clave es un string representando el nombre de un objeto y cada valor es el objeto en si. Iteramos sobre la lista de pares (key, value) del mencionado dict y por cada uno verificamos si:

a) es una función (inspect.isfunction es apropiado para esto)
b) el nombre no es el del decorador que queremos aplicar (para no aplicar el decorador sobre si mismo!)

Si las condiciones a y b se cumplen, podemos guardar en el diccionario del espacio de nombres, bajo el nombre de la función que cumplió las condiciones, una versión decorada de la misma.

Agregamos algo más de código a modulo.py para que se llame a las funciones cuando lo ejecutemos:

if __name__ == '__main__':
    a()
    b()
    c()

Esta es la salida obtenida:

juanjo@fenix:~/python/muchosdecos$ python modulo.py
Ejecutando a
Ejecutando b
42
Ejecutando c
Ejecutando a
Ejecutando b
42

¿Querés probarlo? Bajá muchos.zip

Nota: para acceder a locals() no se puede utilizar iteritems por que el diccionario cambia durante la ejecución.

09:00

Fabián Flores: Aplicaciones didácticas con GIMP


Este curso trata sobre una de las herramientas de manipulación de imágenes más potentes que existen actualmente. Si a ello unimos que GIMP (GNU Image Manipulation Program) es un programa libre de creación y tratamiento de imágenes digitales nos encontramos con la herramienta ideal para trabajar en nuestros centros. Escanear, digitalizar, crear imágenes digitales nos resultará más accesible y

01:30

Emiliano Lopez: ubuntu remix to classical desktop

Ni bien instalé el ubuntu remix en mi netbook me pareció atractivo, interesante, novedoso, pero definitivamente incómodo! bien, siempre fui un buen usuario y me acostumbré a usarlo.ubuntu remix 9.10Sin embargo, meses después me di cuenta que realmente me era incómodo y que necesitaba volver al escritorio que ya estaba acostumbrado. Después de naufragar un par de horas, y leer unos cuantos foros (

jueves, 04 febrero

16:58

Roberto Alsina: Marave 0.1 liberado, necesita testers!

La primera versión "buena" de Marave mmi editor de texto relajante está liberada.

¿Qué es Marave?

Marave es un editor que no te distrae. Tiene una interfaz de pantalla completa, y la mayor parte del tiempo, mientras escribís, se ve sólo tu texto, y tal vez un fondo.

marave1
marave1 by Roberto Alsina

Por supuesto que es bastante configurable:

marave2
marave2 by Roberto Alsina

Algunos de los features:

  • Fondos personalizados (imágenes o colores)
  • Tipografía configurable
  • El editor puede cambiar de tamaño posición u opacidad.
  • Interfaz "desvaneciente", cuando escribís, todo desaparece.
  • Música opcional (por ahora apunta a streaming de audio, tal vez pronto soundscapes)
  • Opcional feedback de audio de teclado (por si extrañas la Olivetti)
  • Soporta temas
  • Corrector ortográfico multilingüe (requiere pyenchant)

Marave está implementado usando PyQt, por lo que debería funcionar en todas las plataformas principales de escritorio, Windows, Linux y Mac OSX, mientras tengas PyQt instalado.

En el futuro, binarios sencillos de utilizar se proveerán para Windows y Mac.

Esta versión no está completa. Específicamente:

  • Buscar+Reemplazar no funciona
  • Puede haber configuraciones no implementadas

Descarga Marave 0.1

OJO! 0.2 disponible, en http://code.google.com/p/marave/downloads/list

09:00

Fabián Flores: Manual de TCOS


Hay lugares en los que las redes de computadoras están formadas por equipos de última generación y, que en algunos casos, son utilizados para realizar tareas que consumen poco procesamiento, como por ejemplo: teclear oficios, elaborar planillas electrónicas y navegar por Internet. Mientras tanto, en empresas y escuelas con bajo poder adquisitivo, las computadoras de las redes son obsoletas

miércoles, 03 febrero

09:31

Roberto Alsina: Apple's iPad is a sad, sad thing.

Everything I will say here was probably better said by Mark Pilgrim <http://diveintomark.org/archives/2010/01/29/tinkerers-sunset> but what the heck, let's give it a shot.

Here's what's wrong with the iPad: it sucks for me.

Before anyone says "don't buy it then!" I'll say it first: I don't intend to buy one.

I think there is a place for iPads and it would go agains most of my beliefs to say it shouldn't exist, but I also expect it to make our world poorer, if it's popular enough.

Yes it's hostile to tinkering. Yes, to read about that, see Mark Pilgrim's article, he's a much better writer than I.

I once posted the README file for a piece of software called Atlast. It said things like "make everything programmable" and "[It is] far better to invest the effort up front to create a product flexible enough to be adapted at will, by its users, to their immediate needs."

The iPad and most other Apple products are the antithesis of that. They are products meant to be exactly as they are, and that's all they are goint to be. If you want to change the way it acts, you need to pay and be subject of Apple's whim, or "break into" your own device.

That hurts me. I see people give up even the possibility of changing what a (let's say it) pretty, useful, powerful device is capable of, just because they don't what that freedom. I can understand that from, say, a used car salesman, or whatever, someone without any inclination for that craft.

But I see freaking programmers buying apple kit. And I see them happy with their iPhones and iPods and (soon, surely) iPads, buying apps from the only source enabled to sell them, buying the apps that are allowed by a single party, that decides, hey, this app? you won't need it!

I see them and I say to myself, dude, that thing you hold in your hand is more powerful than anything we had 10 years ago, there must be something cool you could do with it that noone else is doing.

What's the vision a programmer has of his future if he endorses Apple's closed kit? A future where he can program something only if Apple approves? A future where a "real" computer is a SDK for the things "real people" use in their everyday lifes?

What is wrong with you? What happened to you? Are you now the kind of guy that's just happy with what he's given? Are you now a freaking utilitarian? Are you old now?

Have you noticed the trend in Apple's new products is towards less control by the user? First it was just handhelds, now there's a tablet. What was the last new interesting Apple product that wasn't locked up?

Here they had a device which could have OSX or Iphone OS, and they went with Iphone OS. There is a reason for that: it makes them more money.

For OSX, they make money of the hardware, the OS upgrades, and some apps. On the iPad, they make money every time you buy any app, every time you buy a book to read in it, every time you use 3G with the prepaid plan, and I am sure they are going to find other ways too.

And what's the key to making money that way? Control. If they had no exclusive control of the App store, they lose a source of revenue. If they allowed for easy development of hobby apps, they would lose revenue. If they could let you replace the freaking battery, they would lose revenue.

And if there's one thing companies hate is losing revenue. Apple saw two paths ahead, one leading to huge money, the other to just big money. They have taken the huge money path, and it's working for them. They are not going back.

If everyone goes along for the ride, it will be a sad thing.

09:00

Fabián Flores: Manual de TCOS para administradores


TCOS es un conjunto de herramientas tanto para el arranque de terminales ligeros como para su control licenciado como Software Libre bajo el amparo de la GPL2. Hay lugares en los que las redes de ordenadores están formadas por equipos de última generación y, que en algunos casos, son utilizados para realizar tareas que requieren poco procesamiento, como por ejemplo: teclear documentos, leer el

martes, 02 febrero

09:00

Fabián Flores: Automátas y lenguajes. Un enfoque de diseño.


Ramon F. Brena Pinero es profesor en el Tecnológico de Monterrey, Campus Monterrey, universidad privada situada en el norte de México. Impartió clases relacionadas con Autómatas y lenguajes por más de 10 años. El presente libro es resultado de una experiencia de impartir el curso de Teoría de la Computación por más de 10 semestres en el ITESM, en Monterrey, México. Durante este lapso, aunque

lunes, 01 febrero

22:59

Juanjo Conti: Novelas que leí en Enero/2010

Durante el año realmente siento que me falta tiempo para leer. No para leer el diario o material de estudio, sino para leer por el placer de hacerlo. Leer literatura. A parte de algunos cuentos de Asimov, este enero pude leer 4 novelas. Las 4 muy distintas entre si, pero igualmente entretenidas. Se las paso a comentar, por si alguno tiene ganas de leer y sacó sus vacaciones en febrero (enero ya se fue). Si a alguien le interesa leer alguno, los tengo para prestar:

El enigma de Copérnico

el-enigma-de-coopernicoAutor: Juan-Pierre Luminet

Género: Novela histórica

Páginas: 365 (incluyendo notas del autor)

Editorial: Ediciones B/Zeta

ISBN: 978-84-9872-040-2

El primer libro que leí me lo regaló mi tía Lupe para Navidad. Es una versión novelada de la vida de Nicolás Copérnico (si, el que dijo que los planetas se movían al rededor del son y no TODO al rededor de la tierra como se venía creyendo) escrita por un científico francés y es la primera de una serie de 4 entregas titulada Los constructores del cielo.
Me gustó mucho, los capítulos son un poco largos (me gustan más cortos, así uno puede dejar el libro en cualquier momento) pero la trama es atrapante. Desconocía los detalles de la vida de Copérnico, por lo que no se cuanto hay de verdad y cuanto de ficción. Pero sin duda es una buena aproximación para conocer un poco más sobre la historia del mundo.
Los otros libros de la serie son sobre Brahe, Kepler y Newton (el último aún no ha sido escrito).

En la arena estelar

en-la-arena-estelarAutor: Isaac asimov

Género: Ciencia ficción

Páginas: 200

Editorial: Ediciones Martinez Roca

ISBN: 84-270-0516-4

La segunda novela la leí durante mis vacaciones y la compré en una casa de usados en Pinamar. Es una entrega más de Asimov, una especia de aventura de Cowboys por el espacio. En este caso se intenta encontrar un misterioso documento perdido hace muchos años a la vez que el último planeta conquistado por los humanos intenta conquistarlos a los demás para formar un Imperio Galáctico. Por supuesto, la resistencia se levanta para evitar que esto suceda. Aventura, romance (del pícaro que hace Asimov), conspiraciones y un final bien Asimoviano (era MUY norteamericano el tipo… para ser ruso).

Las grietas de Jara

las-grietas-de-jaraAutor: Claudia Piñeiro

Género: Policial

Páginas: 250

Editorial: Alfaguara

ISBN: 978-987-04-1296-0

La tercer novela la compré para leer a la vuelta (16 horas en colectivo no se digieren fácil). Compré una edición “económica” 15 pesos más barata que en todas las otras librerías. La verdad, no pude notar la diferencia.
Las grietas de Jara está escrita con esa forma característica de Claudia Piñeiro, un policial urbano, con personajes bien humanos, donde mucha parte de la historia pasa dentro de sus cabezas.
Me gustó más que Las viudas de los jueves, pero menos que Tuya.

El principe de la nieble

el-principe-de-la-nieblaAutor: Carlos Ruiz Zafón

Género: Fantasía/Juvenil

Páginas: 230

Editorial: Booket

ISBN: 978-987-580-321-3

El escritor, Carlos Ruiz Zafón, se hizo famoso hace unos años con su novela La sombra del viento, y a continuación El juego del angel (que transcurre una generación antes que La sombra del viento). Sin embargo, estas no son sus primeras novelas. Zafón cuenta también con una trilogía del género que algunos denominan “Novela juvenil”; personajes sub 18, más fantasía que en sus novelas para “adultos”, pero como aclara el autor en el prologo, pueden disfrutarla tanto jovenes como lectores con más años

10:20

Fabián Flores: La interfaz persona-ordenador


La Interacción Persona-Ordenador, IPO, es un área de desarrollo reciente, como tantas otras ligadas al campo de los ordenadores, con un carácter marcadamente interdisciplinario y que en los últimos años está viviendo un auge espectacular en sus diversas vertientes. Este auge se produce gracias a la capacidad cada vez mayor de los equipos informáticos y a la existencia de herramientas y

sábado, 30 enero

09:00

Fabián Flores: Java a tope: Compiladores


El presente volumen introduce al lector en uno de los aspectos más potentes de la informática tradicional: el análisis y comprensión de ficheros de texto. Las técnicas y herramientas que aquí se examinan, se encuentran ampliamente difundidas y no están orientadas exclusivamente a la construcción de compiladores e intérpretes, sino que establecen un marco general con el que el informático

viernes, 29 enero

21:11

Juanjo Conti: Cabañas Cayastá

El fin de semana mi familia estuvo de paseo en las Cabañas Cayastá. Yo iba a unirme desde el viernes, pero como estuve un poco enfermo solo pude pasar en las cabañas una sola una noche. Ya conocíamos el lugar, puesto que habíamos pasado un fin de semana allí hace dos años. Es un predio parquizado muy grande (5 hectareas) con 26 cabañas, salida al río y mucha infraestructura.

Las cabañas tiene hasta 6 camas, baño, aire acondicionado, 2 pisos, una cocina equipada con todos los cubiertos y trastos, heladera, mesa y sillas, parrillas y tele (alguien lo necesita?). Se puede cocinar en la cabaña, pedir comida a la habitación o comer en el comedor del lugar (los sábados a la noche suele haber Cena Show). A la tardecita te dejan en la puerta de la cabaña una canasta con el desayuno para el otro día.

El lugar está muy bueno para descansar, tiene muchas comodidades y se puede hacer de todo:

  • Pescar
  • Cabalgar
  • Andar en bicicleta
  • Pileta
  • Juegos (muy buenos para chicos, desde los típicos de plaza a otros como una casa en el árbol o un laberinto)
  • Hacer asado

Está a unos minutos del pueblo (Cayastá), por lo que podés comprar ahí lo que te olvides, y a menos de 100 km de Santa Fe, por lo que llegás en una hora.

También tengo entendido que se suele utilizar para organizar convenciones (tiene un salón para 300 personas).

Dejo algunas fotos del lugar para entusiasmar:

09:00

Fabián Flores: Java a tope: JavaMail en ejemplos


El presente volumen aborda uno de los tipos de comunicaciones más antiguos utilizados en internet: el correo electrónico. Ello se hace desde la perspectiva del programador en Java, de tal manera que es posible incorporar en un programa las funcionalidades necesarias para enviar y recibir mensajes. Los aspectos tratados en los distintos capítulos abordan la mayoría de situaciones reales con

jueves, 28 enero

17:05

Roberto Alsina: Nuevo proyecto: marave, un editor de textos relajado

Anuncio:

Marave (nada, in guaraní) es un editor de textos relajado. Su meta es que te puedas concentrar en escribir, libre de distrcciones visuales.

Está escrito en PyQt, por lo que debería funcionar en todas las plataformas importantes, y está liberado bajo la licencia GPLv2, así que es softwre libre.

Se puede encontrar el SVN actualizado (no hay todavía una versión empaquetada) en http://marave.googlecode.com

Screenshots:

snapshot10
snapshot10 by Roberto Alsina
snapshot9
snapshot9 by Roberto Alsina
snapshot8
snapshot8 by Roberto Alsina

Status:

No está terminado, pero tiene esto:

  • Se puede editar texto
  • Interfaz minimalista, "evanescente"
  • (Opcional) feedback de audio para el teclado
  • (Opcional) música relajante (requiere internet)
  • Se puede personalizar el fondo, la tipografía, los colores y sonidos.
  • Corrector ortográfico (requiere pyenchant)

También faltan algunas cosas:

  • Buscar y Buscar/Reemplazar no está hecho
  • Las personalizaciones no se guardan
  • Falta limpiar más la interfaz
  • No pide guardar cuando cierra
  • Guardado automático no está hecho

Y al menos un bug conocido:

  • En windows los widgets no están bien ubicados Arreglado en SVN

Breve historia:

Hace unos días vi ommwriter mencionado en un tweet o algo similar.

Estaba pensando "lindo", pero una voz en mi cabeza me decía "eso debe ser fácil de hacer". Después de todo, la parte difícil de crear un programa es hacer que haga algo, ¿no?

Bueno, sí y no. Me las arreglé para hacer algo parecido en un día, pero hacer que quede exacto como yo quiero me vuelve loco :-)

09:00

Fabián Flores: Java a tope: J2ME


El presente volumen introduce al lector en uno de los aspectos más fascinantes y potentes del lenguaje de programación Java: J2ME (Java 2 Micro Edition). La plataforma J2ME proporciona al desarrollador los medios necesarios para construir aplicaciones Java destinadas a ejecutarse en dispositivos con pocos recursos, principalmente teléfonos móviles y PDAs. Con una descriptiva introducción en

miércoles, 27 enero

09:00

Fabián Flores: Introducción a PL/SQL


PL/SQL es un lenguaje de programación estructurado. Es un lenguaje procedimental que amplía la funcionalidad de SQL, añadiendo estructuras habituales en otros lenguajes de programación. Este breve manual es una introducción que permitirá a desarrolladores que usan PostgreSQL adentrarse rápidamente en el manejo de PL/SQL para la creación de procedimientos almacenados y disparadores.

martes, 26 enero

15:00

Fabián Flores: A Beginner's Guide to Gambas


A Beginner's Guide to Gambas is the first definitive reference for the Linux-based Gambas programming language. Gambas ships with a graphical development environment based on the Basic programming language. It supports object-oriented programming and is similar to Microsoft's Visual Basic product. Gambas uses the Qt toolkit and supports other toolkits like GTK+. With Gambas, you can quickly

lunes, 25 enero

16:43

Juanjo Conti: Celular – cuento

Siendo un ávido lector, hace un par de años me llegó el momento, como a todo lector, de creer que también puedo ser un escritor. Fue así que me entregué con furia a la escritura de cuentos, uno tras otros, solo para darme cuenta de que el siguiente era peor que el anterior :(
De todas formas, como soy cabeza dura, y tengo ganas de volver a intentarlo, les dejo el primero que escribí, y como los subsiguientes fueron cada vez peores, el mejor que tengo.
Se titula Celular, y lo escribí una noche en el verano 2007-2008 en mi pieza, en Carlos Pellegrini. La idea del cuento me había llegado como un rayo, al mirar por la ventanilla cuando me tomaba el 16 en la esquina de mi departamento, bolso en mano, camino a la terminal de ómnibus de la ciudad de Santa Fe.

Celular_jjconti

Como ya les dije, tengo ganas de retomar, así que sean alentadores en sus comentarios ;-)

13:26

Christian Pfarher: Mostrar escritorio sin esconeder screenlets en ubuntu 9.10

Muchas veces me ha pasado que al apretar el botón del escritorio, se me desaparecían los screenlets que tenia abierto... algo un poco molesto aveces porque justamente lo que quería ver eran datos que me mostraban los mismos como clima, temperatura y demás... la solución es la siguiente:

Editamos como superusuario el archivo __init__.py:
sudo gedit /usr/share/pyshared/screenlets/__init__.py

buscamos dentro de dicho archivo la linea:
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_TOOLBAR)

y la modifimcamos para que quede de la siguiente manera:
self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)

y eso es todo. Debería lograr el objetivo!. Espero que les sirva

Grazr OPML - FOAF - RSS - Log

Blogs

Alejandro Regodesebes
Roberto Alsina
Cesar E. Diaz
Fabián Flores
Luis Larrateguy
Lucas Maggio (Freesoft)
Gastón Ramos
German Bortoli
Joaquin Cañete
Juanjo Conti
Christian Pfarher
Marcos Raul Carot Collins
Maximiliano Boscovich
Lucas C
Daniel Alejandro Mendoza
Cesar Portela
Gustavo Courault
Federico Baroni
Juan Pablo Taulamet
Emiliano Lopez