sábado, enero 03, 2015

2014 at work

Time to do a balance, at least related to the work I did in the year.
As I found difficult remember all I did in the year, and we moved to GitHub,did a few scripts and used the statistics provided by the site.


First, a disclaimer. Measure work in commits as any other way of measure,have a very relative value. Different work have difficult than can't be compared. In my case, work in activities usually is much easier and fast than work in the toolkit or Sugar. At times reviews and testing the work of other takes a lot of time, and so. But these are the numbers I have, then, let's play with that.

This is a distribution of the commits in the different repositories I maintain:
 

Of course, many hackers contributed to these projects. From the logs I can find to: Aneesh Dogra, Cristian García,Daksh Shah,gauravp94, Goutam, Guillermo Trinidad,Ignacio Rodríguez, James Cameron, Martin Abente Lahaye, Sai Vineet, Sam Parkinson and Sebastian Silva. Paul Cotton provided improved designs for many activities.

My Open Source Report Card say I am one of the 8% most active Python users... I suppose that is pretty good, but more than nothing, could be because I have the fortune of do all my work in the open.

This year, I released a version of art4apps module, and new versions of Develop, Domino, Finance, FotoToon, Help, ImageViewer, Log, Maze, Memorize, Poll and Read. Many improvements in these activities were developed by students participating in Google Summer of Code and Google Code In contests.

I was lucky to of participate in the Young Hackers Summit in Montevideo, and travel to San Francisco to represent SugarLabs in the Google CodeIn Summit with the contest winners Ignacio Rodríguez and  Jorge Gomez.

Finally, I am happy to note we organized with the help of Manuel Quiñones and Martin Abente the first SugarLabs Backgrounds Contest and that backgrounds will be available in the next version of Sugar.

lunes, septiembre 08, 2014

Cumbre Juvenil - Montevideo, Uruguay (September 20 a 23 de 2014)

Comparto invitación al evento

Queridos colegas,
ANEP (Administración Nacional de Educación Pública) y Sugar Labs se han propuesto organizar una Cumbre Mundial Juvenil de Programadores, un lugar de encuentro entre jóvenes de distintas partes del mundo que se encuentran trabajando en el desarrollo de software. Aprovechando este espacio de encuentro, queremos convocar a líderes de programas educativos interesados en el potencial que la tecnología tienen en el aprendizaje, y el promover participación auténtica de los estudiantes en este contexto.

Quiénes deben participar:
- Jóvenes de los diferentes programas educativos, que se hayan destacado por su interés en la programación y/o que hayan realizado contribuciones concretas al desarrollo del ambiente de aprendizaje Sugar.
- Líderes de los programas, interesados en participar en una serie de reuniones estratégicas para definir el futuro del ambiente de aprendizaje Sugar.

Por qué participar en este encuentro:
- Para trabajar y aprender con jóvenes desarrolladores de Python, reconocidos internacionalmente,
- Ayudar a definir el futuro del ambiente de aprendizaje Sugar y las futuras generaciones de software para aprendizaje,
- Para conectar con expertos, convencidos del potencial de la tecnología en el desarrollo y aprendizaje de los jóvenes,
- Para fortalecer la comunidad de usuarios del ambiente de aprendizaje Sugar alrededor del mundo.

Todos los interesados en participar en este importante encuentro deben ponerse en contacto con nosotros inmediatamente. ANEP ha ofrecido financiación de gastos locales para los jóvenes que participarán en este evento.
Cordialmente,

José Miguel Garcia
(ANEP)

Walter Bender
(Sugar Labs)

Para incribirse solo deben ingresar al siguiente formulario:

jueves, abril 03, 2014

Que hay de nuevo en Sugar 0.100 y Sugar 0.102

Para nuestra charla mensual con docentes, organizada por Claudia Urrea, preparé dos videos, para mostrar que hay de nuevo en las últimas versiones de Sugar.


Concurso de fondos de pantalla de Sugarlabs



SugarLabs invita a participar del concurso para crear fondos de pantalla para la próxima version de Sugar.

Ahora que en Sugar se puede cambiar el fondo de pantalla, sería genial poder acompañarlo con una colección del mejor arte hecho por nuestros usuarios. Creemos que es una forma de estimular las capacidades artísticas e involucrar a los niños en el proyecto de forma creativa.

Se pueden crear las imágenes con cualquier actividad, Pintar, Grabar, TortugArte, e inclusive con otros programas. El concurso comienza el 1ro de Abril y termina el 31 de Mayo.

Los invitamos a difundirlo para que participen la mayor cantidad de niños posible.

El sitio del concurso es http://contest.sugarlabs.org/

viernes, septiembre 06, 2013

EDUJAM! 2013! - 10 a 13 Octubre - Asunción, Paraguay

Hola comunidad:

ceibalJAM! está organizando, en coordinación con Paraguay Educa, una edición de eduJAM 2013 en Asunción del Paraguay entre los días 10 y 13 de Octubre, en sincronía con el TurtleDay a realizarse en los mismos días.
Los objetivos serán:
1. Compartir experiencias entre varios deployments del mundo.
2. Incentivar la formación de comunidades locales y fortalecer las ya existentes.
3. Conocer la actual situación de OLPC, Sugar, Turtle y proyectos del MIT.
4. Estimular la participación de las comunidades locales en el proyecto global.

Para ello vamos a trabajar a distintos niveles:
1) Coordinar la organización con Paraguay Educa
2) Búsqueda de sponsor para cubrir al menos parte de los costos del viaje al evento
3) Proponer una serie de charlas y/o talleres a ser realizados por los asistentes de ceibalJAM! y otras organizaciones afines en el mundo.

Convocamos a los interesados en dar charlas o talleres en el evento a hacer sus propuestas, y enviarlas a edujam@googlegroups.com hasta el día 13 de Setiembre.

Asimismo, convocamos a los interesados en asistir al evento a indicarlo por mail a edujam@googlegroups.com Preguntas serán bienvenidas en este espacio.

La información de los eventos estará pronto disponible en Internet. Les mantendremos informados de las novedades.

Comisión de organización - eduJAM! 2013
Asociación civil ceibalJAM!

------

Hello community:
ceibalJAM! is organizing eduJAM 2013, in partnership with Paraguay Educa,. The event will held in Asuncion, Paraguay between October 10th and 13th. (International TurtleArt Day will be held concurrently.)

The objectives are:
1. Sharing experiences among global Sugar and OLPC deployments;
2. Encouraging the creation of local communities and strengthening existing ones;
3. Getting updates on the current activities of OLPC, Sugar, TurtleArt and technology and learning projects of MIT;
4. Encouraging the participation of local communities in the overall project.

We are currently working on several themes:
1) Coordinating between Paraguay Educa and Plan Ceibal;
2) Searching for sponsorship to cover at least part of the costs of travel to the event;
3) Proposing a series of conferences and workshops by ceibalJAM! And other related organizations.

We invite all those interested in giving lectures and workshops at the event to send proposals to edujam@googlegroups.com by September 13th.
Also, we invite those interested in attending the event to email us at edujam@googlegroups.com. Additional event information will be available soon. Questions are most welcome!.

Organizing Committee - edujam! 2013

domingo, julio 21, 2013

Sugar programming: Improvements in ObjectChooser

A few little improvement will be available for activity programmers in Sugar 0.100. Some are related with the ObjectChoooser.

The first is a more powerful filter. Previously, you could select one of the generic type of files defined (Text,Image, Audio, Video, Link) or a activity id. The generic types were defined as a collection of mime types, the user can't modify. In the case of filter by activity, the ObjectChooser will show all the objects opened or created by the activity. The election of what filter type use was automatic, then the programmer could do:

chooser = ObjectChooser(self._activity, what_filter='Image')

or

chooser = ObjectChooser(self._activity, what_filter=.get_bundle_id())

This was simple but had problems. Some activities can open file types with mime types different to the generic defined types, by example, the Text files supported by Read activity were different than the Text files supported by Write activity. Jukebox activity can open Audio & Video files, but ObjectChooser can open only one type at time. There are a few variations of TurtleArt activities, and all can open the same files.

We decided improve this in two ways:
* Add a new filter mode, where the developer can select the activity id, and the ObjectChooser will filter all the objects with mime types than the activity can open (Sugar knows what mime types can open the activity because is defined in the activity.info file)
* The developer now should select explicitly the filter type, instead of let the ObjectChooser guess. In this way we can add more filter types in the future too.

Now the call to the ObjectChooser can be:

        try:
            chooser = ObjectChooser(parent=self,
                                    what_filter=self.get_bundle_id(),
                                    filter_type=FILTER_TYPE_MIME_BY_ACTIVITY)
        except:
            chooser = ObjectChooser(parent=self,
                                    what_filter=mime.GENERIC_TYPE_TEXT) 

In this case, Read activity will open all the objects defined in the activity.info file.
The except is for compatibility with old versions of Sugar.

Another case should be:

        chooser = ObjectChooser(self._activity, what_filter='Image',
                                filter_type=FILTER_TYPE_GENERIC_MIME)

returning all the Image files, or:

            chooser = ObjectChooser(parent=self,
                                    what_filter=self.get_bundle_id(),
                                    filter_type=FILTER_TYPE_ACTIVITY)

to get all the objects created or edited by the activity.

Another improvement is the posibility of display the previews in the objects, specially useful when the user need select one image from the Journal to use in a activity, like in Paint,Write, Fototoon or Memorize.

        chooser = ObjectChooser(self._activity, what_filter='Image',
                                filter_type=FILTER_TYPE_GENERIC_MIME,
                                show_preview=True)

Will show something like this:


Finally, ObjectChooser startup time was improved. 
These are only part of the changes available soon in Sugar 0.100, stay tuned. 

sábado, mayo 25, 2013

Nice cairo trick to draw transparent shapes with borders

I have learned a new cairo trick, and how I didn't find this explained in any place will share it here.

Imagine you want draw two figures with a border, is really easy:


The code is:


#!/usr/bin/python

from gi.repository import Gtk


class MinimalCairoTest(Gtk.Window):

    def __init__(self):
        super(MinimalCairoTest, self).__init__()
        self.set_size_request(300, 300)
        self.connect("destroy", Gtk.main_quit)
        darea = Gtk.DrawingArea()
        darea.connect("draw", self.__draw_cb)
        self.add(darea)
        self.show_all()

    def __draw_cb(self, widget, cr):

        cr.set_line_width(10)

        cr.set_source_rgb(1.0, 0.0, 0.0)
        cr.rectangle(140, 20, 120, 120)
        cr.fill_preserve()

        cr.set_source_rgb(0.0, 0.0, 1.0)
        cr.stroke()

        cr.set_source_rgb(1.0, 1.0, 0.0)
        cr.arc(150, 150, 70, 0, 2 * 3.14)
        cr.fill_preserve()
        cr.set_source_rgb(0.0, 1.0, 1.0)
        cr.set_line_width(10)
        cr.stroke()


MinimalCairoTest()
Gtk.main()

If we want draw the same figures using alpha, we can do:




#!/usr/bin/python

from gi.repository import Gtk


class MinimalCairoTest(Gtk.Window):

    def __init__(self):
        super(MinimalCairoTest, self).__init__()
        self.set_size_request(300, 300)
        self.connect("destroy", Gtk.main_quit)
        darea = Gtk.DrawingArea()
        darea.connect("draw", self.__draw_cb)
        self.add(darea)
        self.show_all()

    def __draw_cb(self, widget, cr):

        cr.set_line_width(10)

        # now the same but using alpha
        cr.set_source_rgba(1.0, 0.0, 0.0, 0.3)
        cr.rectangle(140, 20, 120, 120)
        cr.fill_preserve()

        cr.set_source_rgba(0.0, 0.0, 1.0, 0.3)
        cr.stroke()

        cr.set_source_rgba(1.0, 1.0, 0.0, 0.3)
        cr.arc(150, 150, 70, 0, 2 * 3.14)
        cr.fill_preserve()
        cr.set_source_rgba(0.0, 1.0, 1.0, 0.3)
        cr.set_line_width(10)
        cr.stroke()


MinimalCairoTest()
Gtk.main()





No very good. The problem is, the area filled and the border are superposed, because the path is defined by the middle of the stroke, and ignores the line width[1].



I tried use the stroke as a mask, to avoid filling the area defined by the width of the stroke [2]:


#!/usr/bin/python

from gi.repository import Gtk
import cairo


class MinimalCairoTest(Gtk.Window):

    def __init__(self):
        super(MinimalCairoTest, self).__init__()
        self.set_size_request(300, 300)
        self.connect("destroy", Gtk.main_quit)
        darea = Gtk.DrawingArea()
        darea.connect("draw", self.__draw_cb)
        self.add(darea)
        self.show_all()

    def __draw_cb(self, widget, cr):

        cr.set_line_width(10)

        cr.rectangle(140, 20, 120, 120)
        cr.set_source_rgba(1.0, 0.0, 0.0, 0.3)
        cr.fill_preserve()

        # use the border as a mask
        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.set_source_rgba(1.0, 1.0, 1.0, 1)
        cr.stroke_preserve()
        cr.set_operator(cairo.OPERATOR_OVER)

        cr.set_source_rgba(0.0, 0.0, 1.0, 0.3)
        cr.stroke()

        cr.arc(150, 150, 70, 0, 2 * 3.14)
        cr.set_source_rgba(1.0, 1.0, 0.0, 0.3)
        cr.fill_preserve()

        cr.set_operator(cairo.OPERATOR_SOURCE)
        cr.set_source_rgba(1.0, 1.0, 1.0, 1)
        cr.stroke_preserve()
        cr.set_operator(cairo.OPERATOR_OVER)

        cr.set_source_rgba(0.0, 1.0, 1.0, 0.3)
        cr.stroke()


MinimalCairoTest()
Gtk.main()





There are a problem: the border looks like if is not transparent. The problem really is the cairo operator source, with white, clear all what is in the surface.

I tried different alternatives, and finally asked in #cairo irc channel. The solution was provided by Søren Sandmann itself:


#!/usr/bin/python
 
from gi.repository import Gtk
import cairo
 
 
class MinimalCairoTest(Gtk.Window):
 
    def __init__(self):
        super(MinimalCairoTest, self).__init__()
        self.set_size_request(300, 300)
        self.connect("destroy", Gtk.main_quit)
        darea = Gtk.DrawingArea()
        darea.connect("draw", self.__draw_cb)
        self.add(darea)
        self.show_all()

    def __draw_cb(self, widget, cr):
 
        cr.set_line_width(10)

        cr.push_group()
        cr.rectangle(140, 20, 120, 120)
        cr.set_source_rgba(1.0, 0.0, 0.0, 1)
        cr.fill_preserve()
        cr.set_source_rgba(0.0, 0.0, 1.0, 1)
        cr.stroke()
        cr.pop_group_to_source()
        cr.paint_with_alpha(0.3)

        cr.push_group()
        cr.arc(150, 150, 70, 0, 2 * 3.14)
        cr.set_source_rgba(1.0, 1.0, 0.0, 1)
        cr.fill_preserve()
        cr.set_source_rgba(0.0, 1.0, 1.0, 1)
        cr.stroke()
        cr.pop_group_to_source()
        cr.paint_with_alpha(0.3)
 
MinimalCairoTest()
Gtk.main()


Excelent!
And the code is even cleaner. push_group creates a temporary surface, and can be painted, with alpha, using pop_group_to_source and paint_with_alpha.






[1] http://cairographics.org/tutorial/
[2] http://cairographics.org/operators/

domingo, enero 13, 2013

More Wikipedia news. Automatic index!

In one week with mixed news, I received a two good news, +Kartik Kumar Perisetla and +Anish Mangal prepared a Hindi version of the wikipedia activity, and 
+Ignacio Rodríguez worked in a Portuguese version. Kartik wrote a nice post about this too.

I asked to Kartik what other languages can be of interest in India, and he replied: "In india, Hindi, Gujrati and Punjabi are most common languages is North and West India; Telugu, Tamil, Malyalam, Kannada, Bengali are common in South and West india". Without doubt, India is a challenge!

One part of the process to create a offline wikipedia activity is tedious right now, create the list of articles used to start the selection, and prepare the index.html page used as home with the links to that articles. We have a good selection of pages in the English version, and usually is a good idea translate this selection and later add or remove a few articles. Then I decided create a script to use the interwiki links in the English articles to create a list of articles and index page  to use as a base.

My first experiments can be seen here:

A Farsi version:  

A Guaraní version:

A Italian version:

The script add a class to the links without a translation, and show it with a red background.
Of course, this does not do all the job, in a few cases there are garbage., somebody need check the words, found the remaining translations, add or remove articles depending on the target audience, etc, but I think is a  nice improvement.

sábado, enero 12, 2013

Informe del SugarDay del 15/11 en Buenos Aires

Ufff, este post tiene dos meses sin publicarse.
El SugarDay realizado durante la PyCon en noviembre, fue un éxito.
Participaron unas 15 personas. Algunos viejos conocidos y unos cuantos nuevos. Durante la mañana, hicimos varias charlas, y por la tarde trabajamos en grupos.
La primer charla fue una introducción al proyecto OLPC y SugarLabs.
La segunda, "Sugar en la Escuela" a cargo de +Laura Rosenfeld, +Yanel Cepeda y +Alvar Maciel, trató acerca de los usos que se le dá al software, las posibilidades y aportó interesantes sugerencias para el mejoramiento del mismo.

En la tercera charla, "Mate Marote", +Diego Fernández Slezak y +Matias Lopez y Resenfeld, del Laboratorio de Inteligencia Artificial Aplicada de la U.B.A, nos contaron acerca de sus investigaciones relacionadas con las neurociencias, y como con pequeñas aplicaciones se pueden desarrollar determinadas habilidades, como la memoria o la concentración. Una vez realizadas pruebas en laboratorio, Diego, Matias y su equipo, desarrollaron una actividad para las Xo, con juegos que desarrollan estas habilidades, y también una plataforma que permite agregar más juegos en la medida que se desarrollen. La charla concluyó con una invitación a programadores interesados en participar. La actividad para las XO fue puesta en uso en La Rioja, y ya han podido evaluar los primeros resultados.

  


Por último, hablamos de los desarrollos que se hicieron a lo largo del último año en OLPC y SugarLabs. Fundamentalmente, mostramos los prototipos de la nueva XO-4 y los cambios en Sugar para uso con touch.

Luego del almuerzo, fuimos trabajando por grupos. Algunos vieron como mejorar la performance de MateMarote y su uso de PyGame, otros instalaron entornos de desarrollo, algunos trabajaron en solucionar bugs y otros simplemente intercambiaron experiencias.

Fue productivo, mi agradecimiento a los organizadores de la PyCon por darnos este espacio.

.............


Unos días después de la PyCon, fui a presenciar la defensa de la tesis de licenciatura de Matias con su trabajo acerca de MateMarote. Dos puntos me resultaron particularmente interesantes: primero, cuando explicó los antecedentes, nos hizo acordar que hace unos pocos años, las notebooks eran objetos muy poco comunes, aun en un ámbito como la carrera de sistemas de la UBA, en esa época, hablar de una computadora por niño, era aun más loco de lo que hoy resulta. El segundo punto interesante, fue su explicación de las características innovadoras de Sugar, aun no disponibles en otros entornos. Después de un tiempo inmerso en el trabajo de resolver problemas, y hacer pequeñas mejoras, todos los días, fue refrescante escucharlo de alguien ajeno al proyecto.

sábado, noviembre 03, 2012

OLPC in BBC Horizons program

En el capítulo dedicado a "Accesible Tecnology", la tercera parte muestra el uso de las XO en Ntugi, Kenya.
El deployment es obra de un grupo canadiense de voluntarios y se puede leer una interesante resseña de su trabajo aqui.
Para ver el video, seguir este link y seleccionar la tercera parte.