jump to navigation

LaKademy 2015 – here we go! May 19, 2015

Posted by Sandro Andrade in planetkde-sandroandrade.
add a comment

ArteLakademy2015Hi there,

Everything is ready for the 3rd edition of LaKademy – The KDE Latin America Summit \o/. The meeting will take place from 03-06 June, 2015, in Salvador, north-eastern Brazil. Besides of being the city where I live in :), it was the venue of the 1st Akademy-BR in 2010, when we began some efforts to create and then expand the culture of KDE hacking sprints in Brazil and, after, in Latin-America. Hence, we are now somewhat with that cosy feeling of returning to the grandma’s house for a portion of home-made cookies :). For this year, we decided on having only hacking sessions and quick meetings, rather than talks and/or introductory short-courses. We want to leverage contributions and have more things done during these four nice days of LaKademy 2015. We aren’t, by any means, alien to newcomers, though. The LaKademy 2015’s Call for Participation was already announced and everyone interested in knowing more about KDE contributions may join us at the hacking sessions, ask questions, get involved, and have fun.

For these four days, seven KDE contributors (and, hopefully, some visitors) will meet at the Information Technology Offices of the Federal University of Bahia. We are still settling the details of the program, but I would like to revisit some stuff I’ve done for KDevelop in the past, Filipe should keep working in Cantor enhancements, Lamarque in Plasma Network Manager, and Aracele in translation and promo stuff. As usual, we have also a promo meeting involving all participants where we set the plans for conquering the world with KDE :).

Keep tuned for upcoming news about LaKademy 2015 ! See you …

Major Release December 29, 2014

Posted by Sandro Andrade in planetkde-sandroandrade.

It’s been awhile since my last smoke signals here in Planet KDE. I’d been quiet, a bit outdated on KDE things, focusing some efforts and calming down my heart for being so long away from this amazing community. What I’ve been doing, you ask ? Well, after six long tiring years, I’ve finished my Ph.D. in Computer Science last week. The defense was quite smooth and it’s rewarding to know that you did your best and left the game glad about the work you’ve done.

Doing a Ph.D. is experienced differently by different people. I’ve learned to exercise my patience, to be more pragmatic about my goals, to cope with my anxiety … I’ve survived and got away several times from The Valley of Shit :), met some deplorable Ph.D’s and another inspiring ones.


Although I’d been using Qt and KDE since 1999-2000, it was only in 2008 when I became more seriously involved in KDE. I was already in academia and that gives you the chance to meet some insane 😉 students like Tomaz Canabrava.

Since then, we had a lot of things to be proud of: we made nice friends around the world, we strengthened local KDE communities in Brazil, we’ve been representing KDE for seven years in a row in major FLOSS Brazilian conferences. There were countless talks, short courses, hunting for new contributors, the first Akademy-BR and two LaKademies. That makes me happy but I’m, above all, a programmer. I’ve been missing the commits I haven’t done, the features I haven’t implemented and the bugs I haven’t fixed. I joined KDE already chased by that voice: “you have a Ph.D. to complete …” and it’s quite easy to let your passions dominate the priorities of your tasks 🙂 I’m not saying that I hated my Ph.D. research topic. Not at all. But KDE took me like a burst of passion 🙂 I’m glad I did not give up of my academic carrier and this “major release” makes me free to experience being part of KDE in a different way. So, the bottom line is: you can count on me for KDE in 2015 🙂 I just need some couple weeks for getting some rest.

For those of you who are wondering about what I’ve done in my research, it’s mostly related to automating the design of architectures for a sort of software-intensive systems named self-adaptive systems (those which regulate themselves in response to changes in the operational environment and in the software itself). We focused on a particular class of self-adaptive systems that adopts control theory as its underlying self-managing mechanism. We proposed a generic meta-modeling language (named DuSE) for systematically capturing the prominent design dimension in such a domain and applied techniques from multi-objective optimization field to reveal those candidate architectures that minimize/maximize some quality attributes of interest. We’ve been using our approach to generate effective self-managing architectures for self-adaptive web servers and elastic cluster platforms for MapReduce applications. Further information may be found here and here.

Two development outcomes of my research are directly related to Qt and KDE: the QtModeling and QtOptimization Qt5 modules and the DuSE-MT tool. QtModeling provides the basic features for handling software models and serializing them by using the XMI format. It also implements the metamodels of MOF, UML, and DuSE modeling languages. QtOptimization is an application framework for solving multi-objective optimization problems. So far, only the NSGA-II evolutionary algorithm is available, along with a bunch of common operators for selection, crossover, and mutation. DuSE-MT is a tool that integrates the features provided by QtModeling and QtOptimization in order to evaluate the approach I proposed in my Ph.D. thesis. Its architecture, however, was conceived to support the seamless integration of new features. Now, the plan is make the last polishments to have a first release of such modules. After that, maybe you can expect some model-related new features in Qt Creator and KDevelop 🙂 or an even more shining Umbrello :).

Well, that’s all for now, but just for a while 😉

See ya,

How cute can modeling be ? November 18, 2013

Posted by Sandro Andrade in planetkde-sandroandrade, planetqt-sandroandrade.

Heya planet,

It’s been a long time since my last post (as usual 🙂 – hopefully that’s going to change in next months). A lot of things have happened in QtModeling land tough. In case you haven’t read my previous ‘call for arms‘ and ‘XMI serialization and metamodel plugins‘ posts, QtModeling is intended to provide a complete and flexible infrastructure for software (meta)modeling, (automated) architecture design and analysis, model recovery, and whatever comes in mind when you think about software models. Although we are still far from have those features fully available, some interesting capabilities are quite functional.

MOF/UML Metamodel Implementation

The new refactored templates for automatic metamodel implementation make programmatic model manipulation easier by taking ownership of properties with ‘composite’ aggregation and automatically removing elements from all involved property lists when it’s deleted. While Qt properties features described in QTBUG-17301 are still being considered, QtModeling extends Qt property system by defining roles for aggregation, opposite association ends, redefined and subsetted properties, and derived and derived union constructors. Some UML functionalities defined as derived properties/operations still miss implementation but basic features involving class and components diagrams are already in place. XMI serialization, profiles and stereotypes definitions/applications, and imported elements/packages are also currently available.

When building QtModeling, the following Qt Add-ons modules will be available:

  • QtModeling: defines base classes for model elements (QModelingElement and QModelingObject) and QXmiWriter/QXmiReader classes for XMI serialization.
  • QtModelingWidgets: provides two new model classes (QModelingObjectModel and QModelingObjectPropertyModel) and two new view classes (QModelingObjectView and QModelingObjectPropertyEditor) for manipulating models and model element’s properties.
  • QtUml: implements the full UML 2.4.1 metamodel. It comprises 239 classes which are 91.83% automatically implemented by templates. The remaining code represents derived properties and are being implemented on demand.
  • QtMof: implements the full MOF (Meta Object Facility) 2.4.1 metamodel. It comprises 51 classes also almost entirely implemented automatically.
  • QtDuSE: implements the DuSE language/metamodel (part of my PhD research) for automated software architecture design and analysis.
  • QtSADuSEProfile: defines an UML Profile for automated software architecture design of self-adaptive systems. This is required by SADuSE – a specific DuSE design space instance devoted to self-adaptive systems design.
  • Qt metamodel plugins: bind the previous model modules as Qt plugins used during XMI serialization.


DuSE-MT is a software modeling framework built on top of QtModeling which provide underlying mechanisms for defining new modeling languages (metamodels), creating models described in available languages (currently UML, MOF, and DuSE), manipulate models via JavaScript, and basic constructs for UML diagrams.


DuSE-MT defines a plugin-based architecture (shamelessly 🙂 inspired by Qt Creator’s one), which supports not only Qt metamodel plugins but also extensions implementing new DuSE-MT functionalities such as concrete syntax handling, architecture recovery, automated architecture design, and so on. One of the good things of being a professor is to have students eager to graduate 🙂 and willing to do their final projects in some Qt/KDE related project. Let’s see what happens …

DuSE-MT Plugins

Model Scripting

DuSE-MT’s JavaScript Console allows for defining scripts which might, for example, verify well-formedness rules and/or extend/change the currently opened model. For instance, if you know in advance you are going to use Java to implement the currently modeled system, you might use the following script to verify if any multiple inheritance was found in your model:

DuSE-MT JavaScript Console

While a full OCL parser isn’t already available, such kind of scripts can be really useful (actually it’s even more expressive than OCL since it’s not limited to read-only operations).

QML for UML Concrete Syntax

It’s really amazing how QML seems to be born to make certain things real without much pain 🙂 Even in such highly dynamic cases with many requirements for integrating with C++ objects, QML property binding and some new defined QML items can rapidly gives you some nifty diagrams:

DuSE-MT UML Concrete Syntax

Wondering how much QML code was required to do that ? Here it is:

import QtQuick 2.0

UmlElement {
    UmlSlot {
        id: nameSlot
        anchors.top: parent.top
        Text {
            id: label
            text: element.name
            anchors.centerIn: parent
    UmlSlot {
        id: attributeSlot
        anchors { top: nameSlot.bottom; topMargin: -1 }
        height: (parent.height - nameSlot.height)/2
        ListView {
            model: element.ownedAttributes
            anchors { fill: parent; margins: 4 }
            delegate: Text {
                text: visibility(modelData.visibility) + modelData.name + ": " + (modelData.type ? modelData.type.name:"<no type>")
    UmlSlot {
        anchors { top: attributeSlot.bottom; topMargin: -1; bottom: parent.bottom }
        ListView {
            model: element.ownedOperations
            anchors { fill: parent; margins: 4 }
            delegate: Text {
                text: visibility(modelData.visibility) + modelData.name
    function visibility(visibilityEnum)
        switch (visibilityEnum) {
        case 0: return " "
        case 1: return "+"
        case 2: return "-"
        case 3: return "#"
        case 4: return "~"

… and for UML associations:

import QtQuick 2.0
import QtModeling.Uml 1.0
import "util.js" as Util

Relationship {
    name: element.name
    relationshipType: "association"
    source: Util.findQuickItem(parent, element.memberEnds[0].class_.name)
    target: Util.findQuickItem(parent, element.memberEnds[0].type.name)
    sourceAggregation: aggregation(element.memberEnds[0].aggregation);
    targetAggregation: aggregation(element.memberEnds[1].aggregation);
    sourceMultiplicity: element.memberEnds[0].lowerValue.value + ".." + element.memberEnds[0].upperValue.value
    targetMultiplicity: element.memberEnds[1].lowerValue.value + ".." + element.memberEnds[1].upperValue.value
    function aggregation(aggregationEnum)
        switch (aggregationEnum) {
        case 0: return "none"
        case 1: return "shared"
        case 2: return "composite"

… where Relationship is a new QML item we implemented based on QPainter API (I still need to learn how to use the new SG API). With such things done, UML concrete syntax implementation becomes the simple creation of QML files with names matching the corresponding UML metamodel element (UmlNode, UmlState, and so on).


Supporting automated architecture design involves, among other things, the use of some search-based approach to find out several candidate architectures and then choose one that satisfies some specific quality attribute criteria. Elitist population-based algorithms have been successfully applied in such scenario because of their improved performance and fast convergence. If you’ve already played before with JMetal or some other framework for multi-objective optimization, that’s exactly what QtOptimization is intended to be. Currently, only NSGA-II (Nondominated Sorting Genetic Algorithm) is implemented (QNsga2 class), in conjunction with classes for bitwise mutation (QBitwiseMutationOperator), crossover (QCrossoverOperator), polynomial mutation (QPolynomialMutationOperator), simulated binary crossover (QSbxCrossoverOperator), and tournament selection (QTournamentSelectionOperator) operators.

Here is a brief description on how to use QtOptimization for a single-variable/two-objective optimization problem:

// Define objective function 1
class MyObjectiveFunction1 : public QObjectiveFunction
    explicit MyObjectiveFunction1(QtOptimization::OptimizationGoal optimizationGoal = QtOptimization::OptimizationMinimizes) :
        QObjectiveFunction(optimizationGoal) {}
    virtual qreal evaluateOnIndividual(const QIndividual *individual) const
        qreal x = individual->realVariableValue(0);
        return x*x;

// Define objective function 2
class MyObjectiveFunction2 : public QObjectiveFunction
    explicit MyObjectiveFunction2(QtOptimization::OptimizationGoal optimizationGoal = QtOptimization::OptimizationMinimizes) :
        QObjectiveFunction(optimizationGoal) {}
    virtual qreal evaluateOnIndividual(const QIndividual *individual) const
        qreal x = individual->realVariableValue(0);
        return (x-2)*(x-2);

QNsga2 nsga2;
MyObjectiveFunction1 *f1 = new MyObjectiveFunction1;
MyObjectiveFunction2 *f2 = new MyObjectiveFunction2;
nsga2.setObjectiveFunctions(QList<QObjectiveFunction *>() << f1 << f2);

nsga2.setSelectionOperator(new QTournamentSelectionOperator);
nsga2.setCrossoverOperator(new QSbxCrossoverOperator(0.9, 5.0));
nsga2.setMutationOperator(new QPolynomialMutationOperator(0.5, 10.0));

// Improve population by 250 generations
for (int i = 0; i < 250; ++i) {

We’re currently implementing some quality indicators for Pareto-fronts and finish integration of such features in DuSE-MT in order to support better automated architecture design and analysis.

So, interesting stuff coming … I’d really love to see those things effectively integrated in QtCreator, KDevelop, and Umbrello. If you are willing to join the effort, fell free to try it from gitorious and don’t hesitate to contact me if you face any trouble.

See you,


QtMof/QtUml: XMI serialization and metamodel plugins January 21, 2013

Posted by Sandro Andrade in planetkde-sandroandrade, planetqt-sandroandrade.

Hi there,

A lot has happening since my last post about QtMof/QtUml – a Qt5 add-on module devoted to (meta-)modeling and model-driven support in Qt (currently in Qt Playground). Auto-generation of meta-models has been further improved, making of use Qt5’s new features for metatypes, XMI serialization is already in place even though not all specified configuration parameters are currently supported by now. In addition, QtUmlEditor example has been a full testbed for QtMof/QtUml and can probably be useful as a working application afterwards.

Demo video here

Meta-models (like MOF and UML) are now implemented as Qt plugins. That enables editor (and XMI serializer) to be fully independent from modeling language and also sets the stage to deal with user-defined meta-models. We are currently implementing the OCL (Object Constraint Language) parser which will allow users to define and execute ‘sanity checks’ and conformance rules on models. That will also enhance auto-generation of meta-models since a lot of operations and derived properties can indeed by specified in OCL (as already happen in Uml meta-model).

How to try it !

Contribute !

As usual, any help with testing, developing, and reviewing is quite welcome 🙂 Maybe we can expect some model-driven features in QtCreator and KDevelop in a near future ? 🙂

See you …

Call for arms: QtMof/QtUml December 11, 2012

Posted by Sandro Andrade in planetkde-sandroandrade, planetqt-sandroandrade.

Hi planet,

As roughly mentioned in a previous post, in last two months I’ve been working on a Qt5-based implementation of OMG’s MOF (Meta Object Facility) and UML (Unified Modeling Language) specifications. For those of you who are more familiar with a user-perspective view of UML, it’s worth mention that UML (and your defining metalanguage, MOF) provides a powerful infrastructure which enables, for example, programmatic handling of models, early analysis of architectural models, effective middleware/framework-driven artifact generation, use of deployable models in run-time, and so on. A considerable amount of work has been done towards the development of high-quality tools which leverage the use of models in software development processes. Efforts like the Eclipse Modeling Framework have been setting the stage for a number of plugins, environments, or even tailored Eclipse versions (Eclipse Modeling Project), which rely on modeling features to provide a complete toolset for model-driven engineering. QtMof/QtUml aim at bringing such features to the Qt5 world.

QtMof/QtUml rationale has been driven by the following desired properties:

  • We should support automatic code generation as much as possible. Only 8.17% of UML 2.4.1 metamodel properties are declared as ‘derived’ (and not derived unions), which prevent automatic code generation. For those properties, the specification provide the guidelines for implementation but maybe some of them could be automatically derived from their OCL specifications. QtMof/QtUml already provides a mapping from UML to Qt5 by first generating a more Qt-ish representation of a UML model (XQuery-based xmi to qtxmi conversion) and then generating source code from a couple of well-design templates. Such infrastructure has successfully been used to generate the initial skeletons of QtMof/QtUml and can also be used to convert user-defined UML models into Qt5 source code. As a consequence, we hopefully end up with a faithful implementation of OMG’s standardized metamodels.
  • We should provide a metamodel-agnostic tool for editing, analysing, and converting any MOF-based model. By having no compile-time commitments with any specific MOF-based metamodel, such tool would be also able to handle other MOF-based metamodels (such as CWM) or even user-defined meta-models.
  • QtMof/QtUml should provide a powerful modeling notation for early analysis of MOF-based models. A number of preset scripts for checking well-formed rules should be available and specific scripts may be defined by the user. OCL is a potential candidate as script language, but XQuery or even QtScript can also be considered. That would make possible, for example, analysis of conformance to architectural styles/patterns, continuously integrated models, and so on.
  • A flexible mechanism for mapping of models into middleware/framework-specific artifacts should also be provided. A uml2qt mapping is already in place, but new ones should be easily defined.

Getting right down to the business instead of talking on abstractions 🙂 that’s what a QtUml application currently looks like:

QWrappedObjectPointer<QModel> model = new QModel;

QWrappedObjectPointer<QPackage> package = new QPackage;

QWrappedObjectPointer<QPrimitiveType> primitiveType = new QPrimitiveType;

QWrappedObjectPointer<QEnumeration> enumeration = new QEnumeration;
QWrappedObjectPointer<QEnumerationLiteral> directionIn = new QEnumerationLiteral;

QWrappedObjectPointer<QClass> class_ = new QClass;



// query model or perform 'well-formed/sanity/architectural conformance' checks

delete model.data();

Let’s shed some light on the code above. First of all, UML 2.4.1 metamodel specifies a set of 242 metaclasses (193 out of those are concrete metaclasses) with a couple of dreaded diamonds. In order to overcome the inherent QObject disabilities to cope with virtual inheritance, QtMof/QtUml provides (and relies on) the QtWrappedObjects library: an easy-to-use Qt5-based implementation of “smart delegators” and “delegation-based multiple inheritance”. All behind-the-scene hard work is handled by a new smart pointer (QWrappedObjectPointer) and a new casting operator (qwrapperobject_cast). Secondly, model elements can easily be imported from other (meta)models instead of explicitly instantiating them by “new QPrimitiveType“, for example (use QElementImport/QPackageImport for that purpose). Thirdly, an element takes ownership of any (multi-valued or single-valued) UML property which was declared with “aggregate = composite”, so that a single “delete model.data()” do the whole work.

Even though not 100% implemented, UML Profiles and profile applications may currently be defined programmatically:

// Create a profile
 QWrappedObjectPointer<QProfile> profile = new QProfile;

// Add a stereotype to profile
 QWrappedObjectPointer<QStereotype> stereotype = new QStereotype;

// Show profile's owned stereotypes
 QScopedPointer<QStereotypeList> ownedStereotypes (profile->ownedStereotypes());
 qDebug() << "Owned stereotypes:";
 foreach (QStereotype *ownedStereotype, *ownedStereotypes)
qDebug() << " " << ownedStereotype->name();

// Adding attribute to stereotype
 QWrappedObjectPointer<QPrimitiveType> booleanPrimitiveType = new QPrimitiveType;
 QWrappedObjectPointer<QProperty> property = new QProperty;

The following lines apply an existing UML profile to a package:

// Create UML meta-model element import
 QWrappedObjectPointer<QElementImport> elementImport = new QElementImport;

// Add meta-class reference to profile

// Create extension
 QWrappedObjectPointer<QExtension> extension = new QExtension;

QWrappedObjectPointer<QProperty> stereotypeProperty = new QProperty;

QWrappedObjectPointer<QExtensionEnd> extensionEnd = new QExtensionEnd;



Of course, a helper function or a QtScript can be created to provide a simpler API for creating and applying profiles. As for the editor, current status is still far from usable but it already works as a proof-of-concept for a metamodel-agnostic tool (it links only against QtWrappedObjects):


Potential future uses of QtMof/QtUml include: development of model-driven mechanisms in QtCreator/KDevelop, full UML2.4.1/2.5 support in Umbrello, effective Qt code generation from UML models, and so on.

So, if you like modeling and would like to do some code reviewing and/or help hacking QtMof/QtUml you are quite welcome :). You can grab QtMof/QtUml source code at Qt Playground Repository. Alternatively, if you run openSUSE, there is an OBS repository which provides QtMof/QtUml binaries. In order to use them you must include Qt5 and QtMof/QtUml repositories and install the required packages. The libQtMof-devel package provide the examples for profiles and the current editor:

zypper ar -f http://download.opensuse.org/repositories/KDE:/Qt50/openSUSE_12.2 openSUSE-12.2-Qt5
zypper ar -f http://download.opensuse.org/repositories/home:sandroandrade/openSUSE_12.2 openSUSE-12.2-QtMof
zypper ref
zypper in libQtUml-devel

See you …

FISL13 and Release Party Salvador August 8, 2012

Posted by Sandro Andrade in planetkde-sandroandrade.

FISL13 is over and it’s always hard to say goodbye to dear friends who make up the KDE Brazil. But certainly the one we’ll miss most about is our beloved Konqi who invaded FISL this year. He’s right now long hibernating at Henrique & Camila’s place (thank you guys, you’re amazing) and recharging his energies for Latinoware 2012, to take place in late October. We had this year Sebas joining us for nice KDE conversations, some beers, and spreading the use of Plasma Active. We’ve got some new people interesting in artwork (we have some amazing screencasts on Krita in action, where are they Tomaz ?) and we managed to have some t-shirts and konqi pins at KDE booth.

Last Saturday we had the release party for 4.9 deliverables here in Salvador – Bahia. Ekaty guys were there trying to justify the reason for still not having 4.9 in their repos 🙂 and Luis always elaborating his ideas 🙂

See you …

LaKademy, Hierarchical Edge Bundles, and KDevelop May 6, 2012

Posted by Sandro Andrade in planetkde-sandroandrade.

Hi there,

Yes, LaKademy is over. They were days of hard work, meeting old and new friends, and having much fun while realizing how far those crazy guy’s imagination can go. I’d say it was a great summit and, when compared to first (and only one so far) Akademy-BR carried out in 2010, it’s a clear evidence we are getting there in the effort of building a strong and mature KDE community in Latin America. Henrique and Camila managed to book a lovely hostel in Porto Alegre and, even though I usually don’t get used to traditional food in Rio Grande do Sul, we were all nicely accommodated through these days. Sorry for haven’t posted before, I’m rather taking an “all-in-one” approach to report LaKademy outcomes.

LaKademy brought together 19 participants, including developers, translators, designers, and promo people. Trying to keep this post simple and concise, I’ll briefly enumerate major LaKademy outcomes related to artwork and localization, promo, and developing. In particular, my own developing outcomes are presented later.

Artwork and Localization Outcomes

It seems that Tomaz has unintentionally taken over the task of bringing new designers for KDE here in Brazil. The difficulty arises from the proprietary background designers usually possess and then excuses of reduced productivity are a major obstacle to migrate to open source tools. At LaKademy, Tomaz, Manu, and Fabiana discussed current artwork needs of KDE and had a conference call with Nuno, trying to clarify tool differences and line up goals. Actually, I still notice that designers are maybe the most difficult people to be aware of real underpinnings of free software contribution and we haven’t found the means to provide that to them yet. Rocs’ “weird lemon add node icon” 🙂 is still there but hopefully some artwork fresh blood will help us to get rid of it.

Aracele, Diogo, Camila, and Henrique have been working hard 🙂 in userbase and techbase localization. Techbase pt_BR localization coverage run from 6% to 30% by the end of LaKademy.

Promo Outcomes

The promo meeting at LaKademy took an entire morning with discussion topics like: lessons learned from previous promo efforts, KDE Brazil/LatAm web presence, upcoming FLOSS conferences, and promo material manufacturing. Expected short-term accomplishments include:

  • KDE Brazil|Argentina|Peru ?|LatAm web site (re)design. We aren’t sure about the need for a KDE LatAm web site (that discussion is going to continue on kde-latam mailing list) but we all agree on a re-design of KDE Brazil website. I’ve just noticed that ar.kde.org redirects to a drupal-based website.
  • KDE LatAm Webcasts. Chicão has already pushed some tutoriais about making video tutorials about KDE.
  • “KDE Masters of Latin-America” (TM by Guilhermo Amaral) 🙂 Podcasts
  • Git repository for standard KDE kick-ass presentations (btw, how to create translatable LibreOffice documents ?)
  • “Myths and Facts about KDE Technology” marketing campaign. The intended audience is those people who still have a KDE Plasma 4.0-4.2 conceiving and haven’t given it another try since then. Our participation in FLISOL, while at LaKademy, have confirmed that we need such campaign.
  • Upcoming FLOSS conferences in Latin-America. A bunch of FLOSS conferences (Congresso da SBC/ENECOMPFISLLatinowareGNUGraphFSLDCHack’nRioLinuxWeek(Peru), CaFeCon(Argentina), Software Freedom DayCampus Party PeruCampus Party Pernambuco) are going to happen and we need to articulate the KDE participation in those.
    • In particular, we considered that a “KDE Day” (in a format similar to FLISOL) taking place simultaneously in various Latin-America cities might be a fruitful marketing strategy, even though with minimal technical outcomes. Initial tentative date is 27th October, just one week after Latinoware (so that we could do some announcement there).
  • Quite minimal, enduser-oriented KDE portal. Something like descubra.kde.org (discover.kde.org) would provide, with a minimal simplified mapsite, the general reasons to use KDE and how to get it running in an easy way. That would support a KDE promotion effort in those fields aren’t related to technology at all. We see a huge potential of KDE adoption in Latin America and maybe we are driven our efforts to a most restricted audience.

Developing Outcomes

A number of developers were in LaKademy making improvements in projects like Rocs, KMyMoney, Plasma Network Management, Cantor, Digikam, KDevelop, Amarok, Plasma Active, and Telepathy. We had roughly 18 bugs fixed in Rocs by Tomaz and Wagner, Vitor has been working on a kipi plugin, Ronny worked in ports of KDE Games to Qt Quick, Arthur and Lamarque managed to have a working pilot for a new QML-based Plasma Network Management (part of his GSoC project), Filipe has started a new Python backend for Cantor, Alvaro has fixed bugs in KMyMoney, Lucas is finding his way towards a GSoC project in Amarok, Luis has made some improvements in Spinet architecture and GUI, and Chicao (who unfortunately couldn’t attend LaKademy) is already working on his GSoC project in Krita. As for myself, I dedicate my LaKademy attendance also to have hierarchical edge bundles working in KDevelop. Keep reading …

Compound Graphs and Hierarchical Edge Bundles

Information/Software Visualization techniques has been providing increasingly powerful paradigms for understanding huge amount of data and that certainly would help to support more effectively software design and evolution activities. In particular, a number of techniques for visualizing tree structures have been proposed in last years:

An even more interesting scenario is the use of compound graphs to represent adjacency relationships (between tree’s leaves) along with hierarchical relationships already provided by trees. One should consider, for example, professors hierarchically grouped by departments and also having adjacency relationships when co-authoring a paper or co-mentoring a student. In a software development project, that would easily be represented by hierarchically grouped artifact containments (like namespaces, classes, functions, etc) and some dependency relationship (for example, uses) between classes or functions. The use of arrows to represent adjacency relationship directions would produce more visual clutter so edges are drawn from source (green) to target (red).

A common issue when visualizing such compound structures is the visual clutter you rapidly come up even for small sized graphs. A pretty interesting paper by Danny Holten, “Hierarchical Edge Bundles: Visualization of Adjacency Relations in Hierarchical Data”, proposes a strategy for compound graph visualization which reduces visual clutter while still highligths implicit adjacencies in higher level containments:

So at the end of LaKademy I wanted to have at least the radial layout with edge bundles running in KDevelop.


Hierarchical edge bundles in mirrored radial tree view (rightmost view above) were implemented in a separated library so that other applications could use it for visualizing tree data other than KDevelop projects. Classes were designed to easily support the future inclusion of new tree layouts while reusing the edge bundle generation part. The RadialGraphicsTreeView class (first implementation of IGraphicsCompoundTreeView) works with any tree-based Qt model (representing the hierarchical model) and accepts a second table-based Qt model representing the adjacency relations. Any tree-based and table-based Qt models representing hierarchical and adjacency relations, respectively, should be correctly visualized by libgraphicstreeview. A number of parameters (node radius, inter level spacing, inter span spacing, bundling strength, mirroring radius increment, etc) can be used to tailor the visualization for specific purposes.

libgraphicstreeview provides a demo application which visualizes a file system Qt model populated with a dummy adjacency model and allows the user to play with visualization parameters:

Check out libgraphicstreeview demo app video

 Whilst already functional, some improvements and new features must still be done in libgraphicsview:

  • More realistic implementation of interpolated B-splines. Current implementation is based on Qt’s quad and cubic splines but knot vectors should be used to support smoother and more bundled adjacency edges.
  • Background generation of graph layout and edge bundles. QtConcurrent and mapreduce would be a potential support technology for that.
  • Filtering of adjacency edges by picking them with a linear selection.
  • General profiling and optimization.

KDevelop, Control Flow Graphs, and Hierarchical Edge Bundles

Some years ago I developed the control flow graph plugin for KDevelop. It’s still in playground and, although functional, it suffers from the following drawbacks (part of the reasons for still being in playground):

  • Actually it doesn’t provide control flow graphs in its original definition. It rather provides a consolidated control flow graph at the least abstraction level supported by DU-chain.
  • It doesn’t support efficient visual escalability. We couldn’t represent large control flow graphs in a restricted region of screen.
  • It needs a major refactoring to separate some concerns and make evolution easier.
  • All its cognitive information about a KDevelop project can also be carried out by a mirrored radial with hierarchical edge bundles while still solving the previously cited issues. Actually I still need further elaborate that to decide about the future of control flow graphs in KDevelop.

Hierarchical edge bundles in KDevelop already represents the hierarchical project structure but it’s still using a dummy model for adjacency relations. The hierarchical model is quite similar to the ClassModel class used in classbrowser plugin, but (at least by now) there is no need to retrieve information about attributes, and base/derived classes. I’m not an expert in KDevelop architecture but it seems plugins aren’t able to communicate other than by means of KDevIDEExtension. Maybe Aleix or Milian could have any hint for properly sharing ClassModel. 🙂

Navigation from radial tree visualization to code still needs to be done, as well as a picking mechanism for filtering adjacency edges of interest. Checkout the following video showing libgraphicstreeview as a KDevelop plugin.

Several future improvements could also be done, such as the assignment of metrics (for example, the CK metrics suite) to visual attributes like color, opacity, size, speed of animation, etc. Evolution information also provides some interesting information about software architecture and software development processes.

Check out KDevelop’s bundled tree view plugin video

I’m watching myself for having a couple hours per week to improve libgraphicstreeview and KDevelop’s bundled tree view. Of course, any help is quite appreciated since I’m still bogged down with PhD duties. You can git clone source code for libgraphicstreeview and KDevelop plugin at:



See you !

One week to go until LAkademy 2012 April 19, 2012

Posted by Sandro Andrade in planetkde-sandroandrade.
add a comment

Hi there,

Two years ago the 1st Akademy-BR took place at Praia do Forte (BA), bringing together roughly 30 KDE Brazilian contributors, from coders to promo and translation. In that time, new regional KDE groups in Minas Gerais, Piauí and Rio Grande do Sul had just been formed and fellows like Lamarque, Filipe, and Aracele are still rocking on KDE. Akademy-BR was a nice opportunity to meet those guys in person and try to balance our efforts in pushing KDE and Brazilian community forward. From that time till now things got somehow stabilized (actually put myself as an outlier for that statistics – PhD last year sucks :)).

An early attempt to have the 2nd Akademy-BR last year in Minas Gerais couldn’t be successfully acomplished but, as a positive side-effect, that fortunately culminated in the 1st LAkademy: Latin-American KDE Summit. From 27th April to 1st May, we shall meet at Porto Alegre to evaluate our current scenario, plan our actions in 2012-2013 (in particular, I advocate we need a second LA boost like the one we had in Brazil in 2009) and, of course, hacking. KDE contributors from Argentina, Peru, and Brazil are confirmed. Many thanks to CamilaRaw and Henrique for taking care of local arrangements and KDE e.V. and Claudia in particular to support LAkademy.

Stay tuned, see you …

KDE at Latinoware 2011 October 20, 2011

Posted by Sandro Andrade in planetkde-sandroandrade.

Hi there,

It’s been a while since my last post. Just finishing some boring academic duties, I hope to be returning soon to KDE hacking again. In the meanwhile, we managed to prepare some cool stuff for KDE participation at Latinoware 2011 (Latin-American Conference on Free Software). KDE have been attending Latinoware in a more structured way since 2008. It’s the second biggest conference on Free Software in Brazil (roughly 4000 participants) and we are usually granted with enough room for talks and a cool roomy area for KDE booth arrangements.

This year we were close to my dreams’ KDE booth :). A nice KDE banner + amazing KDE 15 years t-shirts + a lot of KDE swags + big TV set to show off great KDE videos.

Our banner (thanks Wade)

Latinoware 2011 has deployed an interesting technology to spread out promotional material from all booths whilst yet reducing paper consumption during the meeting. All attenders received a small device configured with their personal email addresses which could then be used to request information by putting it closer to sensors installed at booths. The desired promo stuff are then sent to the participant’s email (we were previously asked to provide all digitized material to Latinoware organizing staff).

KDE stuff

Booth Heading

As usual, a Call for Presentations was issued at KDE Latin-America mailing list asking for talks and short-courses proposals from KDE communities in Argentina, Chile, Peru, and others. This year, we have Juan Muguerza from KDE Argentina presenting a talk about OwnCloud. As for the KDE program at Latinoware 2011 we had yesterday a short-course about “Developing Mobile Applications with Qt” which grabbed roughly 25 participants willing to deploy Qt applications in their beloved devices. Filipe Saraiva presented a talk about KDE-Edu and tomorrow we are going to have talks about KDE 15 years, KDE Frameworks, OwnCloud and Plasma Active.

Our fellow Juan from KDE-Argentina

The Open Source Rock Festival at Latinoware Opening

So, that’s all so far. See you …

KDE 4.6 Release Party in Salvador, Brazil February 15, 2011

Posted by Sandro Andrade in planetkde-sandroandrade.
1 comment so far

Hi there,

After waiting a couple of weeks until students return from vacation we finally could enjoy a nice sunset followed by some beers, acarajés, and of course celebrate our beloved newborn, talk about free software and amenities in general. The party took place at “Largo da Dinha”, neighborhood of “Rio Vermelho” – quite popular place for bohemians (only by coincidence is in the neighborhood where I live :)).

A pretty nice photo from my home just before going out to the release party

Largo da Dinha – Rio Vermelho

KDE 4.6 Release Party

See you …