Fri 18 April 2014

[Logilab] Ecriture de liaisons C++ pour Python

Dans le cadre des travaux d'interfaçage de l'application Code_TYMPAN avec du code Python, nous avons réalisé l'étude ci-dessous sur les différents moyens de générer des liaisons Python pour du code C++. Cette étude n'a pas vocation d'être exhaustive et s'est concentrée sur les aspects qui nous intéressaient directement pour les travaux susmentionnés.

Solutions existantes

Une recherche des solutions existantes a été effectuée, qui a permis d'obtenir la liste suivante pour une écriture manuelle du code d'interfaçage :

  • Cython, un langage de programmation inspiré de Python, basé sur Pyrex
  • Boost.Python, une librairie C++ de la collection Boost permettant d'écrire des liaisons Python
  • PyBindGen, un outil implémenté en Python et permettant de décrire des liaisons C++ directement dans ce langage
  • Swig, un outil permettant de générer des liaisons C++ pour plusieurs langages de programmation
  • Shiboken, un générateur de code d'enrobage pour des bibliothèques C/C++ basé sur du CPython

Des solutions existent pour automatiser cette écriture. Ce sont des outils qui se basent sur des compilateurs (gcc, clang) pour faire l'analyse grammaticale du code C++ et générer le code d'interfaçage correspondant. Par exemple :

  • XDress, qui permet de générer des fichiers Cython (.pyx, .pxd) à partir de gcc-xml ou de libclang
  • PyBindGen dispose de fonctionnalités permettant de générer des liaisons python à partir de gcc
  • Ce billet explique comment utiliser libclang pour parcourir l'AST d'un code C++ et générer des liaisons Boost.Python

Aspects pris en compte

Cet article est intéressant car il aborde de façon très complète les problématiques découlant de l'écriture de liaisons C++ pour des langages de haut niveau. Il a été écrit lors des travaux de développement de Shiboken.

Dans notre cas, les critères pour le choix d'une solution finale portaient sur différents aspects :

  • Le coût de développement : prise en main de l'outil, quantité de code à écrire pour enrober une classe C++ donnée, coût de l'intégration dans le système de build, degré d'automatisation de la solution, lisibilité du code généré, etc.
  • La gestion de la mémoire : comptage de référence, gestion de la propriété des objets
  • La qualité et l'exhaustivité du support C++ : compatibilité STL, gestion des références et pointeurs, des templates, surcharges d'opérateurs, etc.
  • La pérennité de la solution : technologies mises en œuvre par l'outil, qualité de la documentation, support, taille et degré d'activité de la communauté de développeurs

Solutions envisagées

Swig n'a pas été retenu partant de l'a priori que c'était une solution plutôt lourde et davantage orientée C que C++, constat tiré lors de travaux réalisés par Logilab il y a quelques mois de cela. La solution Boost.Python n'a pas été explorée car notre souhait était de nous rapprocher davantage du Python que du C++. Shiboken semble prometteur, bien que peu documenté et mal référencé (les premières recherches tombent sur d'anciennes pages du projet, donnant l'impression que la dernière release date d'il y a plusieurs années, alors qu'en fait, non). Il a été écarté par manque de temps.

PyBindGen et Cython ont fait l'objet de tests.

La cible des tests a été l'interfaçage de smart pointers, puisque cela correspond à un de nos besoins sur le projet Code_TYMPAN.

Les essais ont été réalisés sur des classes simplifiées:

  • MyElement, classe qui représente un élément à encapsuler dans un smart pointer et hérite de IRefCount qui implémente un comptage de référence
  • SmartPtr, classe smart pointer "maison" de l'application
  • Quelques fonctions de test manipulant des smart pointers SmartPtr

Voici un extrait des en-têtes du code C++:

#ifndef MY_ELEMENT_H
#define MY_ELEMENT_H
#include <iostream>
using namespace std;
#include "SmartPtr.h"

class MyElement : public IRefCount
{
    public:
        MyElement ();
        MyElement (string);
            string Name(){ return _name; }
            virtual ~MyElement ();

    protected:
        string _name;
};
typedef SmartPtr<MyElement> SPMyElement;
#endif

#ifndef SMART_PTR_H
#define SMART_PTR_H
template <class T> class SmartPtr
{
    public:
        SmartPtr();
        SmartPtr(T*);
        const T* getRealPointer() const;

    protected:
        T* _pObj;
}
#endif

SPMyElement BuildElement();
void UseElement(SPMyElement elt);

Cython

Cet outil offre maintenant un bon support du C++ (globalement depuis la version 0.17). Son avantage est qu'il permet la manipulation d'objets à la fois C++ et Python dans des fichiers Cython.

Utilisation
  • Écriture (facultative) d'un fichier .pxd qui contient une recopie des headers à enrober (avec un lien vers les fichiers): déclarations des types, classes, fonctions...
  • Écriture d'un fichier .pyx qui contient des appels de fonctions, constructions d'objets C ou python. Les fonctions et classes de ce module sont utilisables depuis un script Python
  • Compilation du code Cython décrivant les interfaçages C++, génération et compilation du code C++ correspondant et production d'une librairie Python.

Cython offre un support pour les conteneurs de la STL, les templates, la surcharge de la plupart des opérateurs ("->" non supporté), le passage d'arguments par référence et par pointeur, etc.

Actuellement en version 0.20.1, la dernière release date du 11 février 2014. Les outils Cython sont relativement bien documentés et sa communauté de développeurs est active.

Exemple

Voici le code d'interfaçage Cython correspondant à l'exemple exposé ci-dessus:

setup.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(name='smartptr',
    ext_modules=cythonize('*.pyx',
        ),
)

smartptr.pxd:

from libcpp.string cimport string

cdef extern from "src/SmartPtr.h":
    cdef cppclass SmartPtr[T]:
        SmartPtr()
        SmartPtr(T *)
        T *getRealPointer() # Pas de surcharge de ->. L'accès à l'objet ne peut être qu'explicite

cdef extern from "src/MyElement.h":
    cdef cppclass MyElement:
        MyElement()
        MyElement(string)
        string Name()

cdef extern from "src/Test.h":
    SmartPtr[MyElement] BuildSPElement()
    void UseSPElement(SmartPtr[MyElement])

smartptr.pyx:

# distutils: language = c++
# distutils: libraries = element

cimport smartptr
cimport cython

cdef class PySPMyElement:
    cdef SmartPtr[MyElement] thisptr

    def __cinit__(self, name=""):
        """ PySPMyElement constructor """
        if name == "":
            self.thisptr = SmartPtr[MyElement](new MyElement())
        else:
            self.thisptr = SmartPtr[MyElement](new MyElement(name))

    def get_name(self):
        """ Returns the name of the element """
        return self.thisptr.getRealPointer().Name()

@cython.locals(elt=PySPMyElement)
def build_sp_elt():
    """ Calls the C++ API to build an element """
    elt = PySPMyElement.__new__(PySPMyElement)
    elt.thisptr = BuildSPElement()
    return elt

@cython.locals(elt=PySPMyElement)
def use_sp_elt(elt):
    """ Lends elt to the C++ API """
    UseSPElement(elt.thisptr)

XDress

XDress est un générateur automatique de code d'interfaçage C/C++ écrit en Python, basé sur Cython.

Utilisation
  • On liste dans un fichier xdressrc.py les classes et fonctions à envelopper (il n'est pas nécessaire de mettre la signature, le nom suffit. On peut choisir d'envelopper seulement certaines classes d'un .h).
  • On exécute xdress qui génère les .pyx et .pxd correspondants

XDress permet d'envelopper des conteneurs STL via son générateur stlwrap (les conteneurs à enrober doivent être listés dans le xdressrc.py). A titre d'exemple, les vecteurs sont convertis en numpy array du type contenu.

Ce projet est récent et pas très documenté, mais il semble prometteur.

PyBindGen

Utilisation
  • Écriture d'un script Python qui décrit les classes/fonctions C++ à enrober en s'appuyant sur le module PyBindGen (1) → permet de générer un fichier .cpp
  • Compilation du code C++ généré, avec la librairie du programme à envelopper et génération d'une librairie Python.

Ce processus peut être automatisé:

  • Écriture d'un script Python qui utilise les outils PyBindGen pour lister les modules (headers) à envelopper, les lire et lancer la génération automatique des liaisons c++

ou:

  • Écriture d'un script Python qui utilise les outils PyBindGen pour lister les modules (headers) à envelopper et générer le script Python décrit en (1) (ce qui permettrait une étape intermédiaire pour personnaliser les liaisons)

PyBindGen offre un support pour la STL, l'héritage (multiple), la gestion des exceptions C++ côté Python, la surcharge d'opérateurs, le comptage de référence, la gestion de la propriété des objets. Mais il supporte mal les templates.

Actuellement en version 0.17, la dernière release date du 15 février 2014 (entre autres ajout de la compatibilité Python 3.3).

Exemple

PyBindGen, en l'état, n'offre pas la possibilité d'envelopper simplement des templates, ni des smart pointers "maison" par extension.

Une classe de ce package permet d'envelopper des shared pointers de Boost (boost::shared_ptr). Il serait à priori possible de la modifier légèrement pour enrober les smart pointers de l'application Code_TYMPAN (non testé).

Voici néanmoins à titre d'exemple le code permettant d'envelopper la classe MyElement et des fonctions manipulant non plus des smart pointers mais des 'MyElement *'

Test.h :

MyElement *BuildElement();
void UseElement(MyElement *elt);

smartptr.py :

import pybindgen
import sys
from pybindgen import retval
from pybindgen import param

mod = pybindgen.Module('smartptr')

# File includes
mod.add_include('"src/MyElement.h"')
mod.add_include('"src/Test.h"')

# Class MyElement
MyElement = mod.add_class('MyElement')
MyElement.add_constructor([])
MyElement.add_method('Name', retval('std::string'), [])


# Test functions
# transfer_ownership=False : here Python program keeps the ownership of the element it passes to the C++ API
mod.add_function('UseElement', None, [param('MyElement *', 'elt', transfer_ownership=False)])
# caller_owns_return=True : here Python program will be responsible for destructing the element returned by BuildElement
mod.add_function('BuildElement', retval('MyElement *',  caller_owns_return=True), [])

if __name__ == '__main__':
    mod.generate(sys.stdout)

Boost.Python

Les liaisons Python s'écrivent directement en C++.

C'est un outil très fiable et pérenne, avec de par sa nature un très bon support C++ : gestion de la mémoire, templates, surcharges d'opérateurs, comptage de référence, smart pointers, héritage, etc.

Inconvénient : la syntaxe (en mode templates C++) n'est pas très intuitive.

Conclusion

Les solutions Cython et PyBindGen ont été explorées autour de la problématique d'enrobage de smart pointers. Il en est ressorti que:

  • Il est possible d'enrober facilement des smart pointers Code_TYMPAN en Cython. L'approche qui a été choisie est de manipuler depuis Python les objets C++ directement au travers de smart pointers (les objets Python contenus dans le .pyx encapsulent des objets SmartPtr[T *], agissant donc comme des proxys vers les objets). De cette façon, l'utilisation depuis Python d'un objet C++ incrémente le compteur de référence côté C++ et cela garantit qu'on ne perdra pas la référence à un objet au cours de son utilisation côté Python. Un appel à getRealPointer() pour enrober des fonctions manipulant directement des T * sera toujours possible dans le code Cython au besoin.
  • PyBindGen présente l'intérêt d'offrir des moyens de gérer l'attribution de la propriété des éléments entre C++ et Python (transfer_ownership, caller_owns_return). Malheureusement, il n'offre pas la possibilité d'enrober des smart pointers sans modification de classes PyBindGen, ni d'envelopper des templates.

Par ailleurs, après utilisation de PyBindGen, il nous a semblé que bien qu'il présente des idées intéressantes, sa documentation, ses tutoriels et son support sont trop succints. Le projet est développé par une seule personne et sa viabilité est difficile à déterminer. Cython en revanche offre un meilleur support et plus de fiabilité.

Le choix final s'est donc porté sur Cython. Il a été motivé par un souci d'utiliser un outil fiable limitant les coûts de développement (élimination de PyBindGen), aussi proche de Python que possible (élimination de Boost.Python). Cet outil semble fournir un support C++ suffisant par rapport à nos besoins tels que perçus à ce stade du projet.

Si on venait à nécessiter un moyen de générer automatiquement les liaisons python, XDress présente l'avantage de permettre l'utilisation de libclang comme alternative à gcc-xml (PyBindGen est basé sur gcc-xml uniquement). Une possibilité serait par ailleurs d'utiliser XDress pour générer uniquement le .pxd et d'écrire le .pyx manuellement.

Une question qui n'a pas été abordée au cours de cette étude car elle ne correspondait pas à un besoin interne, mais qui est néanmoins intéressante est la suivante: est-il possible de dériver depuis Python des classes de base définies en C++ et enveloppées en Cython, et d'utiliser les objets résultants dans l'application C++ ?

Thu 17 April 2014

[Adacore] New warning on equality of Unchecked_Union objects

The compiler emits a warning on an equality when the operands are of an Unchecked_Union type and their discriminants cannot be determined statically, resulting in a Program_Error exception being raised.

Wed 16 April 2014

[Logilab] Open Science à Toulouse : barcamp sur les Biens Communs

Le deuxième apéritif et barcamp de la communauté Open Science Toulousaine aura lieu le 24 avril à 19h00 au bar El Deseo, 11 rue des Lois, à deux pas du Capitole et de St Sernin sur le thème des biens communs.

Plus d'informations sur http://hackyourphd.org/2014/04/aperitif-open-science-toulouse-les-biens-communs/

[Nuxeo Blogs] Nuxeo Platform 5.9.3 is Available: Elasticsearch, Collections and More!

Nuxeo Platform 5.9.3We just released our latest Fast Track version – Nuxeo Platform 5.9.3. Note that Fast Track versions are only supported until the next FT (Check out this blog post about our release life cycle).

Take a look at the 5.9.3 release notes for the whole story.
nl-elasticsearch
The first major feature of this release is the integration of Elasticsearch. It brings greater scalability to the Nuxeo Platform. We use it to index all the documents in your instance. When you install this module, all the common page providers will query Elasticsearch instead of your RDBMS.

Another great addition that comes with 5.9.3 is the Collections type. A Collection is a folder-like document in which you classify existing content. Documents are not actually copied or moved into the collection, it only holds a link to the document in its original location.

If you follow the blog, you also know that we released an open-source implementation of the Box API that runs on top of a Nuxeo repository. The use cases we see for the Nuxeo Box API:

  • Allow developers to run “their own local Box server” using the Nuxeo Platform. This enables them to run a Box server locally, in a continuous integration chain, great for testing Box-based applications.
  • Serve customers with on premises requirements (or different cloud infrastructures).

There are a lot of other new features that you can read about in the release notes and even try by downloading Nuxeo Platform 5.9.3 from our website.

Now, we are on to Fast Track 5.9.4 which should be released in June. Check out our roadmap for more information.

The post Nuxeo Platform 5.9.3 is Available: Elasticsearch, Collections and More! appeared first on Nuxeo Blogs.

[Nuxeo Corp FR] Nuxeo intègre le moteur de recherche Elasticsearch pour une recherche plus rapide et une scalabilité sans limites

New York / Paris - 16 avril 2014Nuxeo, l’éditeur de la plateforme de gestion de contenu éponyme pour applications métier, annonce aujourd’hui la publication de Nuxeo Platform 5.9.3, la dernière version Fast Track, qui inclut un nouveau moteur de recherche basé sur le moteur d’indexation Elasticsearch, un nouveau type de document appelé « collection » pour constituer des dossiers virtuels et Nuxeo Drive pour iOS.

Les versions Fast Track de Nuxeo Platform sont publiées toutes les 6 à 8 semaines afin de rendre disponibles les nouveautés et les améliorations plus souvent. En plus de nouvelles fonctionnalités destinées aux utilisateurs finaux, la version 5.9.3 dispose d’une architecture plus flexible, puisqu’elle sépare la base de données du moteur de recherche.

« Avec Elasticsearch, nous avons dissocié le moteur de recherche et la base de données, ça se ressent de façon positive et immédiate sur les performances et la flexibilité de l’architecture », déclare Eric Barroca, président du directoire de Nuxeo. « Comme Elasticsearch a une forte scalabité horizontale, la plateforme Nuxeo peut monter en charge quasiment à l’infini. »

« Elasticsearch apporte à la plateforme de Nuxeo la scalabilité, la stabilité et des fonctionnalités robustes, et lui permet de passer au niveau supérieur en terme de montée en charge et de performances », déclare Shay Banon, créateur, co-fondateur et directeur technique d’Elasticsearch. « Nous sommes ravis qu’un autre éditeur open source et innovant ait choisi Elasticsearch. »

Ce qu’on peut retenir de la version Fast Track Nuxeo Platform 5.9.3 :

Un moteur de recherche basé sur Elasticsearch

Nuxeo Platform 5.9.3 inclut un nouveau moteur de recherche basé sur le moteur d’indexation Elasticsearch. Cette intégration apporte à la plateforme une scalabilité horizontale des capacités de recherche, et donc des performances et une évolutivité des volumes exceptionnelles.

Elasticsearch apporte également les avantages suivants :

  • une recherche plein texte plus rapide,
  • des capacités de recherche et de requêtage complètes, incluant les facets, l’emplacement, “plus de résultats du même type”, etc,
  • des temps de réponse plus rapides,
  • une agrégation des données et du reporting métier, grâce à la capacité d’Elasticsearch à réaliser des statistiques sur la base documentaire,
  • une scalabilité horizontale, grâce à l’ajout des noeuds Elasticsearch.

Comme pour toutes les fonctionnalités de Nuxeo Platform, la compatibilité avec les versions précédentes est garantie. Le language de requête de Nuxeo, NXQL, fonctionne avec Elasticsearch, de telle sorte que les requêtes construites sur les versions précédentes de la plateforme continuent de fonctionner sur cette nouvelle version. Il est également possible d’utiliser directement Elasticsearch pour les requêtes.

Collections

Les collections sont des dossiers virtuels, qui peuvent être utilisés comme galeries par les utilisateurs du module Digital Asset Management. Les collections permettent aux utilisateurs de grouper des documents de façon arbitraire dans une même collection, qu’ils peuvent ensuite partager. Ils peuvent ensuite réaliser des actions sur tous les éléments de la collection : les valider, les publier, les télécharger ou les exporter. Avec l’API REST, les développeurs peuvent utiliser n’importe quelle opération sur une collection.

Nuxeo Drive pour iOS

Une nouvelle application iOS permet aux utilisateurs d’accéder à Nuxeo Platform depuis un iPad. Ils peuvent naviguer dans la base documentaire et faire des recherches quand ils sont connectés, et sélectionner quel contenu doit être disponible hors-ligne. 

Les autres nouveautés de cette version Fast Track incluent une nouvelle vue calendrier, la création d’utilisateurs par invitation et divers outils pour les développeurs.

Nuxeo Platform 5.9.3 est disponible en ligne.

Ressources supplémentaires :

En savoir plus sur le site web - http://www.nuxeo.com/en/products/nuxeo-platform-5.9

Release Notes de Nuxeo Platform 5.9.3 - http://nuxeo.github.io/releasenotes/5.9.3/

Roadmap de Nuxeo Platform - http://www.nuxeo.com/roadmap/

Découvrez une façon d’intégrer Elasticsearch à Nuxeo Platform (en anglais) - Monitoring Nuxeo Docker Container Logs with Logstash, Elasticsearch and Kibana

A propos de Nuxeo

Nuxeo est l’éditeur de Nuxeo Enterprise Platform. Cette plateforme d’Enterprise Content Management (ECM), modulaire et extensible, permet aux architectes et développeurs de facilement concevoir et exploiter des applications métier. Conçue par des développeurs pour des développeurs, la plateforme Nuxeo offre des technologies modernes, une modularité sans égale, un modèle d’extension puissant et des capacités de packaging complètes. Elle constitue le socle d’applications prêtes à utiliser, ciblant des cas de gestion de contenu usuels comme Document Management pour la gestion de documents, Digital Asset Management pour la gestion des actifs numériques et Case Management pour la gestion de dossiers. Plus de mille entreprises et organisations utilisent Nuxeo pour leurs applications métier critiques, dont Electronic Arts, l'Agence France-Presse, Leroy Merlin, Orange, la DGA (Délégation Générale de l'Armement), Generali, Jeppesen (filiale de Boeing) et la Société des Transports de Montréal (STM). Nuxeo possède des bureaux à New York et Paris. Pour plus d’informations : www.nuxeo.com

Contact

Julie Allouch
pr@nuxeo.com

[Nuxeo Corp EN] Nuxeo Integrates Elasticsearch Query Engine For High Speed Search and Unlimited Scalability

New York, NY / Paris, France - April 16, 2014Nuxeo, the provider of a content management platform for business applications, announces the availability of Nuxeo Platform 5.9.3, the latest Fast Track release featuring a new query engine based on the distributed search engine Elasticsearch, a new collections type that enables virtual folders, and Nuxeo Drive for iOS. 

Fast Track versions of the Nuxeo Platform are released every 6 to 8 weeks, to provide innovations and enhancements early and often. The 5.9.3 version offers a major step forward in architectural flexibility, by decoupling the database and the query engine, as well as other valuable new user-friendly features.

“With Elasticsearch, we have separated the query engine from the database, which has major implications for architectural flexibility and performance,” said Eric Barroca, CEO at Nuxeo. “Because Elasticsearch scales horizontally, the Nuxeo Platform now has virtually infinite scalability.”

“Elasticsearch provides the scale, stability, and robust features to take the Nuxeo Platform to the next level in terms of scalability and performance,” Shay Banon, Elasticsearch creator, co-founder and CTO. “We are pleased that another innovative open source vendor chose Elasticsearch to provide fast, reliable search to its customers.”

Highlights of the Nuxeo Platform 5.9.3 Fast Track release include:

Elasticsearch-based Query Engine
Nuxeo Platform 5.9.3 features a new query engine based on the distributed search engine Elasticsearch. This enables horizontal scaling of query capacity, for exceptional performance and volume scalability.

Additional benefits of the Elasticsearch engine include:

  • Faster full text search,
  • Extensive query and search capabilities, such as facets, location, “more results like this,” and many more,
  • Faster query response time,
  • Data aggregation and business reporting, with the Elasticsearch ability to compute statistics on repository content,
  • Horizontal scaling, by adding new Elasticsearch nodes.

As with all Nuxeo Platform features, backwards compatibility is guaranteed. The Nuxeo Query Language, NXQL, works with Elasticsearch, so previously constructed queries are fully functional in the new version. It is also possible to use Elasticsearch directly for queries.

Collections
Collections are virtual folders, also referred to as a lightbox for digital asset management users. They provide a way for users to group arbitrary content items into a single collection, which is shareable. Bulk operations, such as validation, publishing, download and export, can be applied to a collection with a single click. With the REST API, it is possible to plug any operation into a collection.

Nuxeo Drive for iOS
A new iOS app allows users to have remote access to Nuxeo Platform content from an iPad. Users can browse and search the repository while connected, and select content for offline sync.

Additional features in the Fast Track release include a new calendar view, user creation by invitation, and various developer tools.

Nuxeo Platform 5.9.3 is available for immediate download.

Additional Resources:

More information on the website - http://www.nuxeo.com/en/products/nuxeo-platform-5.9

Read the Nuxeo Platform 5.9.3 Release Notes - http://nuxeo.github.io/releasenotes/5.9.3/

View the Nuxeo Platform Roadmap - http://www.nuxeo.com/roadmap/

Learn one way Elasticsearch is integrated into the Nuxeo Platform - 
Monitoring Nuxeo Docker Container Logs with Logstash, Elasticsearch and Kibana

About Nuxeo
Nuxeo provides an extensible and modular Open Source Content Management Platform enabling architects and developers to easily build and run business applications. Designed by developers for developers, the Nuxeo Platform offers modern technologies, a powerful plug-in model and extensive packaging capabilities. It comes with ready-to-use Document Management, Digital Asset Management and Case Management packages. 1000+ organizations rely on Nuxeo to run business-critical applications, including Electronic Arts, Netflix, Sharp, FICO, the U.S. Navy, and Jeppesen, a Boeing Company. Nuxeo is dual-headquartered in New York and Paris. More information is available at www.nuxeo.com.

For Media Contacts
Julie Allouch
pr@nuxeo.com

[Nuxeo Blogs] How Elasticsearch and Collections Improve the Nuxeo Platform

Today, we have officially released the latest Fast Track for the Nuxeo Platform – Nuxeo Platform 5.9.3. There are a few great new features in this release, and we want to draw attention to two that we know you’ll appreciate greatly: Elasticsearch integration and Collections.

To better understand the importance of these new features, we took a few minutes to talk with Nuxeo CEO, Eric Barroca.

Elasticsearch Provides Even More Flexibility

One of the core features of any content management platform is the ability to store content and query it. In Nuxeo’s case, structured content is stored within some fairly big data structures. Until the 5.9.3 release it was being queried using the indexing system from the database. Eric said that this was good, it was highly optimized and fast. However, he said that it was limited by SQL’s ability to scale horizontally and still have good transactional integrity. It also limited some advanced search functions that are important to users today.

What they wanted, Eric said, was an index engine that could provide all the functionality the platform has today, and offer additional features such as enhanced faceted search and full-text search (e.g. stemming, similar entries, etc..).

Eric said that Elasticsearch was the perfect solution to their needs. It is distributed, so you can scale index capacity horizontally by adding nodes. But it’s much more than a pure index system.

Now, when you write content, it goes to the database, and when you read, it goes to the Elasticsearch query engine. In addition to its natural ability to query, it has great features for building queries and filtering them, and how you can extract data from those queries. It has hierarchical faceted search that lets you know how many results you have for each facet.

With the integration of Elasticsearch, the Nuxeo Platform can now scale by partitioning data (storage) and scaling the index engine independently. This, Eric said, provides a very flexible architecture and widens the possibilities for applications depending on workloads and application types.

I asked Eric if they looked at other alternatives, but he said there was no real competition for Elasticsearch. It is essentially Lucene distributed and it’s the distribution that it does very well. It is also a great aggregator, allowing you to do BI on your data (eg. give me all the tasks sorted by their completion date).

Elasticsearch is a high level index and computation engine for content in the Nuxeo Platform that can be used for many different use cases. And, Eric said, it’s extremely fast. The query response time was very impressive – the baseline they tested was 10x and that’s a big improvement.

Here’s a short video explaining what Elasticsearch is:

ElasticSearch – Introduction from Elasticsearch on Vimeo.

Collections Help You Work More Efficiently

Collections are way to group content and perform actions on that group of content. You don’t actually physically move the content into a collection – it’s like a virtual folder. Eric told me that the idea isn’t to change the natural structure of how the content is stored, but to provide users with a way to organize content that may need to be brought together for a particular use case.

Collections are great for collaboration, or for simple things like sharing, printing, changing a property, or starting a workflow. You can apply any bulk action available in the Nuxeo Platform to the collection. It’s a lightweight folder that can be used in many ways.

Collection - Personal Workspace

Collections – Personal Workspace

I asked Eric why they decided to build this functionality into the platform. He said they had a number of use cases requesting it. One common use is for a digital asset management (DAM) project (a collection is called a lightbox in DAM).. Collections enable you to pull together a number of pieces of content and share them with others. He said tags are a way you could do that, but you can’t apply access rights or processes to tags.

Working on revisions of documents that are spread across several workgroups is another use case for Collections. Case Management fits well here. Favorites is another great example of how to use Collections. If you are working on a set of documents, you can pull them into a collection and not have to go and get each document individually. You can easily synchronize Collections to your iPad Drive app.

Collections, Eric said, is simply a new view on your content. And it can be programmatically managed. So say you have a group of overdue cases in your case management application. You can have a collection created and the documents automatically added, then perform some action, such as send notification to a caseworker.

I think any organization can think of a number of ways to leverage the Collections functionality to improve the collaboration process.

These are just two of the new features that come with Nuxeo Platform 5.9.3, You can download this latest version on GitHub now, and read about the all the new features in the release notes.

Also, if you are wondering what’s next, check out the Nuxeo roadmap – we have lots in the works for Nuxeo Platform 5.9.4.

The post How Elasticsearch and Collections Improve the Nuxeo Platform appeared first on Nuxeo Blogs.

[Adacore] Debugger support for variable length arrays in C

The debugger has been enhanced to print the value of C variable length arrays correctly. The sizeof operator now also prints the correct value.

[Adacore] Contracts of recursive functions in assertions

An axiom is now also generated for contracts of recursive normal functions. As a consequence, the contracts of every normal functions is now available for proof even if the function is called in a contract or an assertion.

Tue 15 April 2014

[XWiki] XWiki 6.0 Release Candidate 1 Released

The XWiki development team is proud to announce the availability of XWiki 6.0 Release Candidate 1. First and hopefully last release candidate before 6.0 final. This release contain mostly improvements on Distribution Wyzard and new experimental Flamingo skin.

[Adacore] Support contextual analysis of local subprograms

GNATprove can now analyze local subprograms without contracts in the context of their calls, as if their body was inlined. This makes it possible to get a very precise analysis, without requiring that the user writes a contract on these subprograms.

Mon 14 April 2014

[Nuxeo Blogs] Webinar: Building Virtual Navigation Structures for the Nuxeo Platform

Webinar: Virtual Navigation StructuresBrowsing the Nuxeo Platform content repository can be done a few ways - follow the navigation tree, use a tag cloud or dashboard, or perform a simple faceted or advanced search. These are all straightforward approaches, but there’s also another one – design and implement your own virtual navigation structure using Nuxeo Studio.

What is a virtual navigation structure? It is a way to bring together multiple documents in a single location for a user to act on, without physically moving the document from its original location in the repository. So you can have one content structure, but use virtual navigation structures to display the content in different ways.

Consider that different users have different needs and browsing habits, and many end up spending a lot of time searching the repository to find the content they need. Creating a virtual navigation structure allows a user to quickly pull together the content they need, giving them more time to get their work done.

Want to learn how to create your own virtual structures in the Nuxeo Platform? Spend an hour on April 17th with Nuxeo training instructor, Bertrand Chauvin, for an online demo and Q&A on how to build virtual navigation structures in your own application.

During the live webinar, you are going to learn how to:

  • Disable the default “by coverage” and “by subject” navigation options,
  • Add new virtual navigation structures,
  • Display customized document listings,
  • Create content view filters,
  • Use smart folders to allow users to create a dynamic structure, and
  • Use workflows to grant temporary access.

If you are looking for a specific way to browse your content repository, virtual navigation structures are a great approach. Register for this live webinar and mark your calendar for Wednesday, April 16th at 1pm EDT.

To get warmed up, you can download the Nuxeo Platform and register for a free 30-day trial of Nuxeo Studio.

See you there!

The post Webinar: Building Virtual Navigation Structures for the Nuxeo Platform appeared first on Nuxeo Blogs.