Publicaciones sobre marave

El software libre es bueno conmigo.

Me gano la vida trabajando con software libre (De paso, si necesitás sysadmins que sepan lo que hacen, contactános: http://www.netmanagers.com.ar)

Pero eso no es tan importante, yo podría ganarme la vida haciendo otra cosa. Estoy seguro que sería competente para algo, aún si no se me ocurre nada en este momento.

Más importante es que me da libertad para jugar. Por lo tanto este post es una especie de reporte de las cosas con las que jugué. No juegos, no son lo mío, pero cosas que hago por diversión.

Sí, algunas de estas significan que soy un tipo muy raro.

Limitándome al último par de semanas o algo así:

Hubo bastante interés en Marave, mi editor sin distracciones y es porque salió en Linux Journal.

Leí el artículo (lamentablemente no puedo poner un link) y fué super positivo, algunas citas:

"marave makes the dull world of text editing romantic and immersive with beautiful minimalism"

"... it doesn't just have minimalism and simplicity, it has minimalism and simplicity combined with beauty and a palpable design ethic. marave has soul, and I love that."

Así que gracias por la amabilidad al autor, y algo que noté: se encontró con un bug enorme y no se dio cuenta :-)

El icono del destornillador debería mostrar el diálogo de configuración. Sin embargo, parece que en Ubuntu (y tal vez en otras distros, no lo sé) no aparece, y todo lo que se ve es que el texto se mueve un poco. Esto es lo que debería haber visto:

marave15

Yo nunca lo pude reproducir, pero voy a instalar una VM de Ubuntu para verlo, así que tal vez pronto.

En cosas relacionadas, marave salió en una revista alemana hace un par de meses, pero no pude obtener una copia del artículo. (De paso: no es razonable enviar una copia de estas cosas al autor del programa que estás probando? Ninguna revista no siquiera me avisó!)

En cualquier caso, si alguien tiene esta revista y me puede decir que dice el artículo sobre editores sin distracciones, me va a poner contento:

Acá está el adelanto del artículo

Y esta parece ser la revista:

https://shop.linuxnewmedia.de/store/eh01/EH10165/de/product_image/variant/bounding_product

En cuanto a proyectos nuevos (sí, siempre tengo proyectos nuevos) me encontré con este excelente artículo de Roger Alsing acerca de aproximar la Mona Lisa con 50 polígonos <http://rogeralsing.com/2008/12/07/genetic-programming-evolution-of-mona-lisa/ > y, siendo un nerd con asombrosas herramientas de programación a mi alcance... escribí un framework para probar esa clase de algoritmos.

Le puse evoluto y está en http://evoluto.googlecode.com.

Sólo hice un algoritmo muy simple, basado en triángulos semitransparentes, pero funciona... mirado con cariño.

Se puede ver como el ojo derecho se queda trabado en un mínimo local :-)

Evoluto tiene una biblioteca de algoritmos (actualmente vacía) y se pueden editar y reaplicar instantáneamente si uno quierem y ver las generaciones cambiar en pantalla.

Necesitaría bastante trabajo para ser un programa pulido, pero algo es algo.

Estuve paveando con crear un programa para ver presentaciones en PDF pero todavia le falta una vida:

109301062

En lo que es tal vez mi proyecto más establecido, rst2pdf. Corregí varios bugs, y le está haciendo falta un release:

Issue 186: El texto no rodea las imágenes cuando se especifica
Lo arreglé con una opción nueva, así que el comportamiento por default es el mismo, pero anda. No quedo muy bueno, pero anda.
Issue 307: La directiva replace no funciona en header/footer en algunos casos
Fué un problema muy interesante, muy divertido!
hacerlo funcionar con Sphinx 1.*
Hay una parte que sigue rota, pero lo que arreglé no fué terrible.
Desrromper bookrest
le falta muchísimo laburo, pero por lo menos lo que andaba antes anda de nuevo. Si no sabés que es bookrest, es un frontend gráfico para rst2pdf / procesador de textos, acá lo ves en acción:

También hice varios releases de mis paquetes de AUR

Además trabajé, y algunas otras cosas. Bastante productivo!

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

¿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.

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.

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.

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

Sí, guardar.

11011111220-My-Desktop

Doble click para abrir.

11011111417-My-Desktop

Sí, estoy de acuerdo.

11011111514-My-Desktop

Hmmm, bueno.

1101111167-My-Desktop

Bárbaro...

11011111750-My-Desktop

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 <[email protected]>
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!

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

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

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