Joaquin Cañete: Mi Certificado Microsoft MAP 2010
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:

No me parece que esté tan mal.
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.
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:
Una versión, más desprolija, pero en dónde se lee mejor:
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?
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:

No hay grandes features nuevos en 0.7 pero hay cambios internos grandes, y bugs importantes corregidos:
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!
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 :-)
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:
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 ;-)
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
).
# 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
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
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:
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.
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:
Captura de pantalla gratuita:

Roberto Alsina: El momento ajá!
Hoy quise hacer una cosita en Marave. El objetivo era:
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.
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.
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:
¿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:

Si se habilita este plugin, cuando el usuario use ese shortcut, se llama al método "run" del plugin.
É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í:

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())
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.
Fabián Flores: Nos tomamos un descanso
Roberto Alsina: Afeitando yaks: 16/2/2010
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:
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
Fabián Flores: Manual de XLogo
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.
Fabián Flores: The Zope Book
Fabián Flores: Análisis de impacto en redes TCOS
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
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.
Fabián Flores: Introducción a LYX
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.
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
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!
Sí, guardar.
Doble click para abrir.
Sí, estoy de acuerdo.
Hmmm, bueno.
Bárbaro...
Genial!
Ahora este Marave puede funcionar o no pero eso es para más adelante...
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...
¿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...
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...
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.
Es parte del "Visual C++ redistributables"
Instalarlo no es garantía de que ande (sí, lo probé)
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!
Fabián Flores: La conquista silenciosa del ciberespacio.
Luis Larrateguy: Google Buzz!! Bzzz!!!! bzzz!!!!!
Ajjj 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
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.
Fabián Flores: Manual de AJAX. Las entrañas de AJAX
Fabián Flores: Constantine. Aprende a usar Fedora desde cero
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:
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
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:
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
Fabián Flores: HHS - Introducción a la seguridad de sistemas para adolescentes
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:
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
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.
Fabián Flores: Aplicaciones didácticas con GIMP
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 (
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.
Por supuesto que es bastante configurable:
Algunos de los features:
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:
Descarga Marave 0.1
OJO! 0.2 disponible, en http://code.google.com/p/marave/downloads/list
Fabián Flores: Manual de TCOS
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.
Fabián Flores: Manual de TCOS para administradores
Fabián Flores: Automátas y lenguajes. Un enfoque de diseño.
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:
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).
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).
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.
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
Fabián Flores: La interfaz persona-ordenador
Fabián Flores: Java a tope: Compiladores
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:
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:
Fabián Flores: Java a tope: JavaMail en ejemplos
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:
Status:
No está terminado, pero tiene esto:
También faltan algunas cosas:
Y al menos un bug conocido:
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 :-)
Fabián Flores: Java a tope: J2ME
Fabián Flores: Introducción a PL/SQL
Fabián Flores: A Beginner's Guide to Gambas
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.
Como ya les dije, tengo ganas de retomar, así que sean alentadores en sus comentarios
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