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.