Personal Website

My Web: MindEchoes.com

Monday, November 21, 2011

Como Postear Codigo en Blogger

Esto puede servir para postear código en Blogger o en cualquier otro asumo.
En el post anterior me puse a hacer la típica búsqueda de como hacer para postear código en blogger, porque cada vez que tuve que hacerlo lo hice de una u otra forma, pero nunca me dejo conforme y además siempre me olvidaba como era...
Y esta vez estuve un rato buscando, hasta que dije: " Y POR QUÉ NO COPIO A MI AMIGO PASTE.UBUNTU ?

Entonces, cree mi paste, y después me puse a ver el código que generaba a ver que onda, copié la parte del html que me interesaba y me agregue el css en mi documento (con algunas modificaciones minimas en mi caso para que se adapte mejor a mi configuracion de Blogger, pero también se podría hacer simplemente como a continuación).

Entonces, para postear código en Blogger, hay que entrar a la edición en HTML, y solo pegar este código:


<link rel="stylesheet" type="text/css" charset="utf-8" media="screen" 
href="http://paste.ubuntu.com/static/pastebin.css">

<div class="paste">
<table class="pastetable"><tbody>
<tr><td class="code"><div class="paste">

<pre>#INSERT CODE HERE!
</pre>
</div>
</td></tr>
</tbody></table>
</div>


Y listo!!
Reemplacen obviamente el "#INSERT CODE HERE!" por su código y ya esta!!

Descargar Archivos random de Wikipedia

Este es un script que acabo de hacer porque tenemos que conseguir más de 5000 articulos para un trabajo de la facultad, donde tenemos que implementar un motor de busqueda sobre documentos, y para conseguir la base de documentos y con cierto formato que sea parseable que mejor que wikipedia.
Entonces para poder bajar una buena cantidad de documentos hice (seguramente podría mejorarse):



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

import os
import random
import urllib

from BeautifulSoup import BeautifulSoup


class Browser(urllib.FancyURLopener):
    version = ('Mozilla/5.0 (Windows; U; Windows NT 5.1; it; '
               'rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11')


def read_page(link):
    browser = Browser()
    page = browser.open(link)
    return page.read()


AZ = [chr(c) for c in xrange(65, 91)]
az = [chr(c) for c in xrange(97, 123)]

#http://es.wikipedia.org/wiki/Wikipedia:%C3%8Dndice_alfab%C3%A9tico
combinations = [unicode(pageA + pagea) for pageA in AZ for pagea in az]
combinations += [unicode(pageA + pageA) for pageA in AZ for pagea in AZ]

path_save = '/home/gato/Desktop/wiki'
base_url = 'http://es.wikipedia.org/wiki/Especial:Todas'
wiki_url = 'http://es.wikipedia.org'

for page in combinations:
    print 'COMBINATION:', page
    url = os.path.join(base_url, page)
    soup = soup = BeautifulSoup(read_page(url))
    links = soup.findAll('a', {"class": "mw-redirect"})
    length = len(links) - 1
    indexes = [random.randint(0, length) for i in xrange(8)]
    indexes = list(set(indexes))
    for index in indexes:
        filename = os.path.basename(links[index]['href']) + '.html'
        wiki_page = wiki_url + links[index]['href']
        print wiki_page
        content = read_page(wiki_page)
        with open(os.path.join(path_save, filename), 'w') as f:
            f.write(content)
        print 'Saved:', filename

Tuesday, October 18, 2011

Algunas cosas que podrias no saber de Unity

Hace unos días, junto con el release, me pase a Ubuntu 11.10, y a diferencia de Ubuntu 11.04 no tenemos la opción de usar el escritorio clásico de Gnome2, lo que si se puede hacer llegado el caso es usar gnome shell (pero en mi caso al menos funcionaba muy lento gnome shell... tengo entendido que en otros casos funciona muy bien).

Unity es en parte una reinvención del escritorio, un nuevo "paradigma" por decir de una forma, y a primera vista a quienes venimos acostumbrados con gnome2 nos puede parecer que nos faltan cosas, o sentir cierta resistencia al cambio.
Por ese motivo quise hacer un post, porque ahora un par de días después de haberlo empezado a usar ya la verdad que me siento cómodo y varias de esas cosas que me resultaba que me faltaban, pude encontrar que simplemente estaban presentes de otra forma.


Primero que nada nos vamos a encontrar que la tradicional barra en la parte inferior de la pantalla donde veiamos las aplicaciones abiertas (para quienes teniamos esa barra) ya no esta más, y ahora tenemos una barra de launchers al costado izquierdo del escritorio, que a primera instancia pareceria ser como una especie de Dock, pero tiene varios detalles a tener en cuenta.

Primero que nada, todas los launchers que figuran se pueden quitar, o agregar nuevos simplemente presionando el boton derecho sobre los existentes o las aplicaciones que están corriendo y elegir la opción "Keep in launcher" (en inglés).

Que otra información nos brinda este launcher??




Podemos ver que sobre aquellas aplicaciones que se encuentren abiertas, vamos a tener una especie de flechita ">" sobre el lado izquierdo del icono.
Ahora, si nos fijamos bien vamos a ver que de los iconos que se muestran arriba, hay 2 (Home Folder, Ubuntu Software Center) que tiene la flechita ">" como si estuviera rellena, eso es porque esas aplicaciones se encuentran abiertas sobre el escritorio en el que me encuentro en ese momento:


Y también podemos observar que sobre el icono de "Home Folder" tenemos a su vez una flecha "<" sobre el lateral derecho del icono, esto nos indica que esa es la ventana que tiene actualmente el foco.

Otra cosa acerca del launcher, es que si mantenemos presionada la tecla Super unos segundos (esa que tiene un logo que se parece a otro sistema operativo... no se bien cual :P)
Nos aparece un numero/letra sobre cada icono con el que podemos acceder de forma directa apretando sobre el:

Si nos fijamos sobre el icono de Chromium (2) hay 2 flechitas, eso es porque hay 2 instancias de Chromium abiertas, en este caso si mantenemos apretado Super+2 (2: en este caso para acceder a Chromium), nos va a llevar a la última instancia que obtuvo el foco, pero si no soltamos Super y volvemos a presionar 2, nos muestra todas las instancias de esa aplicación abierta y con las flechas del teclado o el mouse podemos elegir a cual darle el foco:



Después tenemos algunas funciones tradicionales como ver todos los escritorios con Super+S:


Y ver todas las aplicaciones abiertas con Super+W:



Ahora más detalles nuevos:
Unity nos permite acceder de forma fácil y rápida a las aplicaciones todo a través del teclado, si bien tenemos los launchers que son de fácil acceso para el mouse, podemos buscar cualquier aplicación (se encuentre o no en el launcher) presionando una Super+A:


Quizás algunos extrañen el menu de Aplicaciones (como me pasaba a mi), pero esto esta pensado para que el usuario en realidad escriba a que quiere acceder de manera intuitiva y las aplicaciones se vayan filtrando en base a lo que escribe. Si se presta atención, se puede ver que no solo muestra las aplicaciones instaladas, sino que también las aplicaciones que estarían relacionadas a nuestra busqueda y por ahí nos interesaría instalar.
Por ejemplo, si yo quisiera buscar para jugar al Ajedrez, pero actualmente no tengo ningun juego de Ajedrez instalado, el resultado que me mostraría sería el siguiente:


Pero si por el contrario queremos un acceso más general, ya sea a aplicaciones, carpetas, archivos, etc.
Podemos simplemente presionar "Super" y nos aparece otra opción de búsqueda, la cual filtra sobre todas las categorías antes mencionadas:


Y de todas formas sino, para aquellos que estemos muy acostumbrados a otra herramienta, siempre podemos instalar el famoso "Synapse" (o derivados) para el mismo tipo de funcionalidad:


Ahora en cuanto a los famosos indicadores que muchos soliamos tener en la barra superior del escritorio (para temperatura, etc), también los tenemos presentes en Ubuntu 11.10, nomás que los podemos encontrar de otra forma.
Principalmente yo agregue 2:


- Indicador del clima (que se puede instalar directamente desde el Ubuntu Software Center): indicator-wheater
- ClassicMenu (un indicador para ver el menu tradicional), a mi me pasa que a veces estoy buscando una aplicación, pero no recuerdo ni cerca cual era su nombre, pero si en que categoría la podria encontrar, y para eso me venia de 10 el menu tradicional de Aplicaciones.


Pueden consultar más de estos indicadores acá: Ask Ubuntu

Y por último, un detalle que al principio me producía ciertas trabas, es el hecho de que Alt+Tab ahora itera sobre todas las aplicaciones abiertas sin importar en que escritorio esten, y en mi caso yo suele trabajar mucho desplazandome a un escritorio y cambiar de aplicación sobre las que tengo ahí abiertas mientras trabajo en ese escritorio. Bueno, esto podemos solucionarlo instalando CompizConfig Settings Manager:

sudo apt-get install compizconfig-settings-manager

Y luego activando el Ring-Switcher y clickeando la opción del Ring-Switcher para decirle que itere solo sobre las aplicaciones en el Escritorio actual.
A su vez, varias cosas de Unity, como el tiempo de algunos efectos, la cantidad de escritorios, etc, podemos configurarlo usando el mismo CompizConfig Settings Manager (de manera mas user-friendly, en lugar de ir a usar gconf-editor... que también tendriamos que instalarlo).



Y eso es todo por ahora!


------------------------------------------------------------------------------

19 de Octubre del 2011:

Y me faltó agregar que amo la fuente UbuntuMono!!!!!

Thursday, October 13, 2011

Mas Mails que da gusto recibir

Otro mail que te alegra el día :P recibido a través de Github (donde probablemente estemos migrando ninja-ide dentro de poco).

Mail de: v3ss0n
Asunto: BEST Python IDE Ever!
Today is 1st day i tried and I am immidiately fall in love!
This is Bestest , not best Python IDE i ever tried!
Fast , Lightweight , Responsive thats all i am asking for and you guys make it right!
This repo is not updated right? Which one is most updated? I want to use latetest code !


Ahora a seguir trabajando en la versión 2.0 para poder liberarla con todas las features y mejoras que queremos lograr!! :D

BTW, la consola Python incluida en NINJA-IDE (si lo utilizan desde repositorio) ya posee autocompletado!

Thursday, September 22, 2011

Aniversario NINJA-IDE

Hoy se cumple 1 año desde que comenzamos con el proyecto, y más felices no podríamos estar, se han logrado muchísimas cosas, y mañana además vamos a estar liberando la versión 2.0-Beta en la PyConAr, junto a un nuevo rediseño del sitio web, acorde al nuevo logo y estética que el diseñador que se sumo al equipo le dio!!

Acá dejo un vídeo que hicimos para el aniversario:

 

Sunday, September 11, 2011

Mails que da gusto recibir

Hubo un par de veces donde me han llegado mails por NINJA-IDE, pero siempre se me paso de incluirlos acá en el Blog, pero la verdad que ahora me dieron ganas de publicar este, porque es muy copado recibir mails de este tipo, y la verdad que te motivan mucho para seguir metiendole pilas al proyecto y contribuyendo con el software libre!!

Asunto: Thanks :)

Hey, I just wanted to thank you all for the Ninja-IDE project which is a promising, great IDE(A). After using Python on Eclipse (PyDev) boredly, Ninja IDE looked too flexible and easy-to-use to me. I wish you luck on it. 
I'm also wondering whether code completion feature will be ready on next release ( yeah, it is the first thing that i'm checking on an IDE :) Lastly, if you have some translation page on launchpad or elsewhere, i'd like to translate it into Turkish.
Have a good day.

La verdad que con esta versión 2.0 en la que estamos trabajando actualmente, esperamos que mucha gente encuentre un montón de features copadas en NINJA-IDE que le hagan programar en Python de forma mucho más fácil y divertida!

Saludos!

Monday, August 22, 2011

PyConAr 2011

El 23 y 24 de Septiembre se realiza en Argentina la PyCon, y la verdad que parece que se viene con todo!!

Así que si no te decidiste todavía, acá te dejo el afiche como incentivo para que veas los invitados que va a tener...
NO TE LO PODES PERDER!!


Sunday, August 21, 2011

PyDay San Luis

Bueno, recién vuelvo del PyDay San Luis!
La verdad una experiencia muy copada, muy buena onda la gente y le pusieron muchas pilas para organizar el evento!
Estuvo bueno ver como mucha gente se quedo hasta el último taller que termino recién por las 21hs y algo, se ve que la gente realmente se prendió con Python y da gusto! :D

Yo tuve la suerte de poder dar una charla de "Introducción a PyQt" y acompañar a Ramiro Algonzino en el taller de PyQt que dio él (que la gente realmente se engancho)!

También estuve tratando de lavarle el cerebro a la gente en una lightning talk para que usen NINJA-IDE! (infaltable), y me gane UN PENDRIVE DE 4 GB en el sorteo al final de las lightning talks!!

Acá dejo el material de la charla:
Acá les dejo algunas fotos que saco Emilio Ramirez durante el evento:





Lamentablemente la única foto que tenemos de la tremenda choripaneada que se hizo es la siguiente... ya que después estábamos todos demasiados ocupados comiendo :P

Servicio al consumidor: No vayan al "Hostel Quijadas" en San Luis!
Bastante mala onda para atender, nos alquilaban las toallas, no nos daban jabon, el desayuno fue ratonazo mal, y cuando terminamos de desayunar nos dicen: "chicos tienen que lavar lo que usaron"... ¬¬
Como protesta silenciosa... rotamos el cuadro de la pieza!!
TOMA ESO INJUSTICIA!

Esta es la escalera que paseando por la ciudad encontramos y fue denominada "escalera al suicidio"... era una escalera por donde subías hacia la NADA!

Y este es el Casino de San Luis por fuera, que esta muy bueno como lo decoraron todo onda New York (que es el nombre)! (hay más fotos copadas del casino, pero no las tengo :P)


Tuesday, August 16, 2011

Algunos Adelantos de NINJA-IDE 2.0

Actualmente nos encontramos trabajando en la versión 2.0 de NINJA-IDE, la cual incorpora muchísimos cambios con respecto a la 1.1 que fue la última versión liberada.
La arquitectura misma del IDE fue rediseñada para que sea más optima y se consiguió un mejor orden de las partes del programa y se gano un incremento importante en Performance! :D

A su vez, para esta nueva versión (que actualmente esta en desarrollo, pero es completamente usable) ya se han agregado muchas nuevas features, y todavía quedan varias más por agregar!

Algunas de las Nuevas Features son:

Recent Projects:
En la versión 1.1 se podían visualizar y abrir los proyectos recientes desde la página de inicio de NINJA-IDE, ahora estos proyectos pueden quitarse de la lista, y dockearlos a la misma para que queden siempre en los primeros puestos.


Soporte para Virtualenv:
Se agregó soporte para Virtualenv, el cual puede ser especificado en la creación del proyecto desde NINJA-IDE o sobre un proyecto ya existente.

Profiles:
A veces trabajamos con varios proyectos que están relacionados, y si les gusta tener abierto solo lo que es necesario, ahora en NINJA-IDE 2.0 se puede crear un perfil sobre los proyectos abiertos, agrupándolos bajo un nombre, de esta forma cuando abrimos un determinado perfil cierra todo lo que este abierto y carga todos los proyectos asociados a ese perfil, lo que nos permite cambiar de a varios grupos de proyectos en muy pocos clicks.

Import From Everywhere:
Hay casos donde estamos escribiendo código en un archivo que ya tiene varias lineas y empezamos a agregar clases que se encuentran en otros paquetes en nuestro código y el caso común probablemente sería scrollear hasta la cabecera del archivo, agregar nuestros imports y volver adonde estábamos. Para evitar tener que andar scrolleando de un lado a otro, NINJA-IDE nos permite incluir imports desde cualquier punto del código y automáticamente los inserta en la cabecera y los agrupa con otros imports que estén relacionados.

Code Locator:
Esta Feature nos permite tener acceso de forma rápida y directa a cualquier archivo, función o clase de cualquiera de los proyectos que tengamos cargados en NINJA-IDE con solo presionar un par de teclas!!
Al presionar "Ctrl+K", nos aparecerá un popup sobre un campo de texto, en el que podremos ir escribiendo y a medida que escribimos los resultados se irán filtrando en el popup. Es importante saber que si buscáramos la función: "obtain_editor", no sería necesario comenzar a escribir "obta...", sino que podemos escribir cualquier parte del nombre y será filtrada de todas formas, por ejemplo podríamos escribir: "_edit" y "obtain_editor" sería uno de los resultados en el filtro.
También una característica de esta Feature, es que cuando seleccionamos una Clase o Función, nos abre el archivo en el que se encuentra y nos ubica en la linea donde es definida dicha estructura.
Esta funcionalidad posee unos pre-filtros que se pueden aplicar para por ejemplo:

  • f: filtrar solo por archivos python.
  • m: filtrar solo por métodos.
  • c: filtrar solo por clases.
  • . filtrar solo por las clases y métodos contenidos en el archivo siendo visualizado.
  • n: filtrar solo por archivos no python.



Find Usages:
Desde la versión 1.1 contamos con "Find in Files", una Feature que nos permite buscar una o varias palabra, una expresioń regular, etc en todo el árbol del proyecto. Ahora para la versión 2.0 se ha mejorado esa funcionalidad, y a la vez se ha agregado "Find Usages", la cual se encuentra como una opción en el menu contextual del Editor y nos permite encontrar todas las ocurrencias de determinada palabra sobre la que estemos posicionados.

Show Errors and Pep8:
En la versión 1.1 estas funcionalidades estaban presentes, pero en la 2.0 se ha mejorado el rendimiento de las mismas, y se han agregado opciones adicionales en preferencias para poder configurarlas a gusto con la posibilidad de mejorar aún más la performance.
También podemos ver que en los archivos que contienen errores de pep8 nos muestra un icono de advertencia en la solapa donde se encuentra abierto ese archivo, y en los archivos que contienen errores estáticos de código nos muestra un icono de bug en esa solapa. De esta forma con solo abrir el archivo ya sabemos si hay algo a tener en cuenta en ese archivo y no es necesario tener que scrollear y ver si hay alguna notificación en alguna linea.


Menu Tabs:
Se ha agregado en los Tabs que contengan un Editor un menu contextual el cual permite splittear la ventana desde ahí mismo, realizar distintas operaciones de cerrado de tabs, reabrir  los últimos tabs cerrados, cambiar dinamicamente el tipo de resaltado de sintaxis, y algunas cosas más.

Web Inspector:
Para aquellos proyectos que utilizan la previsualización de una página web desde NINJA-IDE, se agregó un web inspector, el cual podría decirse que es un pseudo firebug, el cual nos permite ver la información del HTML siendo renderizado, y poder manipular en vivo el CSS, debuggearlo, etc.

Navigate Code:
En esta nueva versión se incorpora una funcionalidad que es de mucha ayuda, la cual nos permite presionar la tecla "Ctrl" y mover el mouse sobre las variables o funciones y ver como estas se pintan como si fuera links y al hacer click sobre una de ellas, NINJA-IDE nos llevara a la definición de dicha variable o función, de esta forma podemos saltar de un punto a otro del código con mucha facilidad.

Bookmarks, Breakpoints and Jumps:
Ahora es posible colocar breakpoints (para el debugger en desarrollo) y bookmarks sobre el Sidebar Widget del editor, sobre la misma area donde se ubican los indicadores de Code Folding. Y en la esquina superior derecha del manejador de Tabs de editores, podemos ver 2 flechas (izquierda-derecha), las cuales nos permiten navegar el historial de saltos en el código de la siguiente forma:
  • Flechas Naranja: permiten navegar el historial de los saltos que se hizo usando "Jump to Line", o Ctrl+Click sobre alguna función o variable en el editor.
  • Flechas Rojas: permiten navegar entre todos los breakpoints que hayamos agregado, de esta forma podemos con un simple click, ir recorriendo linea por linea y archivo por archivo donde se hayan colocado breakpoints.
  • Flechas Azules: permiten navegar entre todos los bookmarks que hayamos agregado, de esta forma podemos con un simple click, ir recorriendo linea por linea y archivo por archivo donde se hayan colocado bookmarks. Esto es muy util cuando estamos trabajando en varias partes de distintos archivos para una funcionalidad que engloba varias cosas, entonces colocando bookmarks podemos saltar precisamente a cada uno de estos lugares.

Hay varias Features más que se han agregado, pero este es un simple pantallazo de lo que se viene para NINJA-IDE 2.0, para más información se encuentran las Release Notes o nuestro Twitter: ninja_ide

Y como siempre, para cualquier consulta estan las listas de correo de NINJA-IDE y el canal de IRC:

ninja-ide@googlegroups.com
ninja-ide-dev@googlegroups.com

#ninja-ide (at Freenode)

Visitas a NINJA-IDE

Gráfico de las visitas a http://ninja-ide.org en el último mes!


Obtener Arbol Sintactico en Python

El fin de semana estuve de "paseo" en Buenos Aires, llegue el domingo como a las 7 de la mañana, pero recién tenia el check-in en el Hostel como a las 12... así que tenia que hacer tiempo!
Dije: "bueno... voy a pasear al shopping... debe ser lo único abierto y por ahí engancho una peli"... WRONG!!
Llegue al shopping como a las 8am... y recién abría a  las 10am... así que a buscar alguna confitería donde pudiera hacer un largooooooo desayuno... Y A PROGRAMAR NINJA-IDE!

Para mi sorpresa descubrí que Palermo (por donde estaba) es bastanteeeeeeeee caro!! (no, no tengo idea de nada de las zonas de BsAs)

Así que pedí mi desayuno:

Y a empezar a programar!
Lo que quise hacer fue agregar la parte de "Tree Symbols" de NINJA-IDE, básicamente la función es mostrarte un árbol con la información del archivo que se esta visualizando, es decir:

  • Variables del Módulo
  • Funciones del Módulo
  • Clases
  • Funciones de Clase
  • Atributos de Clase
Para la versión 1.1 de NINJA-IDE, habíamos hecho una implementación de esto pero obteniendo esos datos utilizando Rope, la cual es una muy buena librería, PERO genera bastante basura en el directorio del proyecto y la documentación es mala.... lo que si tiene son muchos tests, y básicamente podes aprender a usarla leyendo los tests, pero para la versión 2.0 estamos tratando de que la única dependencia que tenga el IDE sea con PyQt, de esta forma algunas libs que usamos (que no son muchas por el momento), las hemos incluido con el IDE mismo, y las hemos modificado para que se adapten mejor a ninja, funcionando más rápido para nuestras necesidades.

Entonces tenia que armar el Widget con el Árbol de Sintaxis, pero sin usar Rope que por el momento no la pensamos incluir... y que mejor que usar: AST (Abstract Syntax Trees)

Con AST se puede obtener mucha más información sobre el código, como los Imports, ImportsFrom, donde se están agregando For, Ifs, etc.
Y varios de los elementos (funciones, clases, for, etc), son nodos que pueden ser navegador internamente para seguir obteniendo información de las cosas que contienen.

En el caso de NINJA-IDE, solo me interesaba que obtuviera la info que se mencionó antes (Variables del Módulo, Funciones del Módulo, Clases, Funciones de Clase, Atributos de Clase), por lo que cree un método "obtain_symbols", que recibe un string con el código fuente (también podríamos modificar simplemente esta función para que recibiera un path de un archivo y trabajara con eso, pero en NINJA-IDE como se van a mostrar los símbolos sobre el archivo siendo visualizado, ya tengo el código cargado en un string, y me es más rápido que ir a leer a disco), y se encarga de parsear el cuerpo de ese código fuente, almacenando en un diccionario los atributos, funciones y clases que encuentra.
En el caso de las Clases, como sabemos que estas pueden llegar a contener Atributos o Métodos, al momento de parsear la clase, no solo guardamos en que linea del código esta declarada, sino que llamamos a un método para que ahora parsee el cuerpo de la clase (vamos un nodo más abajo): "_parse_class_body", la cual recorre las funciones y atributos de la clase almacenándolos en una nueva estructura de diccionario y sobre las funciones vuelve a realizarse una búsqueda interna sobre otros atributos de la clase que se encuentren definido dentro de las funciones llamando a: "_parse_cls_function_body".

El código de esto sería:

# -*- coding: utf-8 -*-
import ast


def _parse_cls_function_body(funcBody):
    attr = {}
    for at in funcBody:
        if type(at) is ast.Assign and \
        type(at.targets[0]) is ast.Attribute:
            attr[at.targets[0].attr] = at.targets[0].lineno
    return attr


def _parse_class_body(classBody):
    attr = {}
    func = {}
    for sym in classBody:
        if type(sym) is ast.Assign:
            attr[sym.targets[0].id] = sym.lineno
        elif type(sym) is ast.FunctionDef:
            func[sym.name] = sym.lineno
            moreAttr = _parse_cls_function_body(sym.body)
            for ma in moreAttr:
                attr[ma] = moreAttr[ma]
    return {'attributes': attr, 'functions': func}


def obtain_symbols(source):
    try:
        module = ast.parse(source)
    except:
        module = ast.parse(source[source.find('\n'):])
    symbols = {}
    globalAttributes = {}
    globalFunctions = {}
    classes = {}
    for sym1 in module.body:
        if type(sym1) is ast.Assign:
            if type(sym1.targets[0]) is ast.Attribute:
                globalAttributes[sym1.targets[0].attr] = sym1.lineno
            else:
                globalAttributes[sym1.targets[0].id] = sym1.lineno
        elif type(sym1) is ast.FunctionDef:
            globalFunctions[sym1.name] = sym1.lineno
        elif type(sym1) is ast.ClassDef:
            classes[sym1.name] = (sym1.lineno, _parse_class_body(sym1.body))
    if globalAttributes:
        symbols['attributes'] = globalAttributes
    if globalFunctions:
        symbols['functions'] = globalFunctions
    if classes:
        symbols['classes'] = classes

    return symbols



Al principio de la función "obtain_symbols" estoy haciendo un try-except porque los archivos que definían un encoding fallaban al tratar de ejecutarse el "parse", y obviando la linea del encoding podían ser parseados tranquilamente... obviamente voy a tener que hacer más pruebas para asegurarme que no tenga otros efectos secundarios :P
Esta fue la primera implementación y hace EXACTAMENTE lo que quiero, quizás después deba fijarme si sería conveniente usar algo como NodeVisitor o no.

Si llamaramos a la función "obtain_symbols" pasandole como código este mismo módulo, obtendríamos como resultado:

{'functions': {'_parse_class_body': 14, 'obtain_symbols': 28, '_parse_cls_function_body': 5}}

Lo cual no es una información muy loca que estemos obteniendo, pero cuando llamamos a esta función con el código del módulo "editor.py" de NINJA-IDE, los datos que obtenemos son los siguientes:

{'functions': {'_parse_class_body': 14, 'obtain_symbols': 28, '_parse_cls_function_body': 5}}
editor^[{'functions': {'create_editor': 733}, 'classes': {'Editor': (36, {'attributes': {'syncDocErrorsSignal': 72, 'errors': 67, '_mtime': 110, 'highlighter': 71, 'newDocument': 70, 'extraSelections': 599, 'textModified': 69, 'pep8': 66, 'ask_if_externally_modified': 82, '_sidebarWidget': 61, '__actionFindOccurrences': 92, '_patIsWord': 77, 'braces': 79}, 'functions': {'jump_to_line': 181, '_find_occurrences': 194, 'mousePressEvent': 524, 'get_text': 174, 'go_to_definition': 537, 'keyPressEvent': 374, '_sync_tab_icon_notification_signal': 130, 'dropEvent': 530, 'has_write_permission': 145, 'show_pep8_errors': 116, 'show_static_errors': 123, '__init__': 55, 'indent_more': 231, 'zoom_in': 204, 'get_parent_project': 220, '_text_under_cursor': 432, 'set_flags': 97, 'set_cursor_position': 226, 'keyReleaseEvent': 369, 'contextMenuEvent': 462, 'zoom_out': 212, 'check_external_modification': 138, 'find_match': 325, 'register_syntax': 168, 'indent_less': 272, 'mouseMoveEvent': 493, 'wheelEvent': 450, 'go_to_line': 198, 'get_cursor_position': 223, 'set_font': 177, '_match_braces': 563, 'get_selection': 551, '_file_saved': 161, 'highlight_current_line': 598, 'restyle': 150, 'replace_match': 339, 'paintEvent': 437, 'focusInEvent': 362, 'set_id': 108}})}}

Los cuales una vez parseado por el Widget del Árbol de Símbolos de NINJA-IDE, nos muestra la información de esta forma:

Y nos permite navegar hacia cualquiera de esos símbolos solo haciendo click en el.

Y ahora para el espacio cultural del Post, dejo algunas fotos que saque en Buenos Aires:




Y después al mediodia del Lunes cuando almorce en Aeroparque... descubrí que todos los lugares de comida eran sucursales del Restaurant "Uy, nos rompieron el orto" de Capussotto.


Ejemplo 1:
sandwich de jamon y queso + gaseosa = 52


Vale aclarar que se aceptan mejoras sobre el código las cuales seguramente terminarán incluidas en NINJA-IDE! :P

Sunday, July 10, 2011

Conversacion Real


La siguiente es una conversación real que se dio ayer :D
Amigo: algún soft recomendando para grabar dvd que no sea el nero?
Yo: k3b
siempre uso ese
Amigo: q talco?
Yo: para mi de 10
hace años ke lo uso
Gabriel: pero eso es solo para linux
Yo: ah.... pense que usabas un os decente


Friday, June 24, 2011

Por que Mario Bros es drogadicto?

En este momento estoy caminando al trabajo y se me ocurrio que el inventor de Mario Bros tenia ciertos problemas de adicción...

Por que? Basicamente porque diseño un personaje que:
  • Se come un hongo y empieza a ver las cosas de tamaños desproporcionados y se cree que es mas grande.

  • Consume una "plantita" y de repente empieza a flashear con que puede tirar fuego...

  • Y por último, pero no menos importante, ingiere una "estrella" y le agarra un Panic-Attack que le hace ver todo de colores y correr para todos lados...

Ojala pudiéramos decir que recibió tratamiento, pero al ver todo lo que empezó a consumir en Mario 3 y Super Mario World, etc... creo que ya no tiene cura... Shame on you Mario!


Btw, la aplicación de Blogger para android esta bastante buena, del navegador de android no había chance de que me funcione...

Saturday, June 18, 2011

Nuevo Logo Para NINJA-IDE

Estamos evaluando la posibilidad de cambiar el Logo de NINJA-IDE por un nuevo diseño que nos enviaron!!

Y queremos escuchar las opiniones de la comunidad para ver que opinan acerca de los Logos!

Logo Actual



Nueva Propuesta de Logo 


Pueden votar en esta: Encuesta

Gracias!