Gilles Guirand : My gandbox.fr's slides talk from the 2010 eZ Community Day in Geneva

On 2010 January 21, for the eZ Community Day in Geneva, i tried to tanslate in english language some of my "french" blog posts i write on http://www.gandbox.fr. There is my "english" slides from this talk :

List of the french blog post i used for my talk

Working with Google Maps :

Building an UWA Widget (Netvibes / iGoogle) :

Building a custom RSS :

Slideshare presentation

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Gilles Guirand le 24/01/2010 22:08

Damien Pobel : Nouveau serveur

Après les déboires récents de mon premier serveur Dedibox, j'ai reçu courant décembre un mail m'annonçant la fin du support de ma Dedibox V1 fin janvier 2010 et l'obligation de migrer vers une autre machine. J'envisageais depuis un bon moment de changer de serveur, cela n'a fait que précipiter les choses. Et j'ai finalement choisi un serveur Kimsufi 750G qui semble mieux fourni que les Dedibox XL pour le même prix (aux frais d'installation près si on paie pas à l'année).

La migration à l'identique est quasiment terminée mais je compte bien exploiter au mieux les 4Go de RAM (quel changement en comparaison du Go que j'avais avant). Je vais m'intéresser de plus près à la configuration de MySQL pour exploiter ces nouvelles ressources et je vais enfin pouvoir installer l'extension eZ Find sur mes différents sites eZ Publish.

En attendant un rapide benchmark sur pwet.fr avec siege sur les 200 pages les plus vues m'a montré que cette machine est capable de servir quelque chose comme 40 pages / seconde sans broncher là ou l'ancienne machine était capable de servir péniblement 7 pages / secondes. Il y a de la place pour quelques nouveaux projets!

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Damien Pobel le 17/01/2010 23:42

Gilles Guirand : eZ Find et la gestion des datatypes

J'ai publié une "mini" contribution sur la gestion des relations d'objet(s) dans eZ Find. Cette contribution est relativement confidentielle (exploitation marginale), mais constitue une bonne occasion pour présenter le fonctionnement d'eZ Find et sa relation avec les datatypes. eZ Find est une extension encore sous exploitée, alors qu'elle constitue une avancée majeure d'eZ Publish sur la cible "système d'information professionnel", au côté des extensions EZSI ou encore CMIS.

Voir la page du projet ezfsolrdocumentfieldobjectrelation

eZ Find en quelques mots "faciles à comprendre"

  • eZ Find est une "interface" entre eZ Publish (le CMS) et Solr (le moteur de recherche)
  • Solr est un moteur de recherche autonome, qui s'exécute comme un service JAVA, et qui fonctionne en mode REST, à savoir :
    • Lors d'une publication, eZ Find prépare le contenu dans une URL et le "pousse" vers Solr (HTTP)
    • Lors d'une recherche (full text, filtres, facettes), eZ Find prépare la question dans une URL et demande à eZ Find la réponse

Toutes ces opérations complexes sont "masquées" pour le développeur, qui doit uniquement se soucier de bien formuler ses requêtes dans son habituel langage de template : fecth( ezfind, search, params...). La puissance d'eZ Find réside dans cette simplicité d'exploitation, au profit de le puissance fonctionnelle de Solr et des "questions" que l'on peut formuler, notamment sur la pertinence (façon google) ou sur les classifications à facettes.

eZ Find est les datatypes

eZ Publish fonctionne sur le concept de "datatype", à savoir des types de données "riches" permettant de représenter des lignes de textes, des numériques, des dates, mais aussi des types de données plus complexes ou exotiques comme des images, des vidéos, des relations d'objet(s) ou de la géolocalisation. eZ Publish permet également de définir ses propres datatypes, on peut donc comprendre que les correspondances entre les types de données eZ Publish et les types de données Solr nécessite quelques paramétrages, selon 2 cas de figures :

  • Les correspondances de données parfaitement symétriques : ligne de texte = string
  • Les correspondances de données "sur mesure" : relations d'objets (et gestion des sous attributs)

Pour définir ces correspondances eZ Find propose un fichier de paramétrage extension/ezfind/settings/ezfind.ini

Fonctionnement de la classe ezfSolrDocumentFieldObjectRelation

L'aspect "sur mesure" de la correspondance entre les datatypes eZ Publish et les types de données eZ Find implique un "point de vue" de développement dans la façon de gérer les cas particuliers et complexes. L'indexation des relations d'objets multiples est une bonne illustration de l'éternel dilemme du développeur : "jusqu'où faut-il aller ?"

Comportement natif de ezfSolrDocumentFieldObjectRelation

Tous les objets en relation permettent de générer un unique champs "text" par concaténation de tous les attributs de tous les objets. On obtient ainsi un contenu indexé de type "objet1/attribut1 objet1/attribut2 objet2/attribut1 objet2/attribut2". Cette logique est tout à fait adaptée à la recherche "full text", mais inadaptée à l'exploitation de facette. Pour un objet en relation dont le "name" est "mon objet en relation", on obtient les facettes suivantes sur "myclass/myattribute" :

  • "mon" (10 résultats)
  • "objet" (3 résultats)
  • "en" (30 résultats)
  • "relation" (5 résultats)

Comportement de l'évolution ezfSolrDocumentFieldObjectRelation

La gestion des facettes devient possible, en spécifiant un attribut en particulier ou alors en invoquant le "name". La page du projet montre quelques exemples de codes basiques. En exploitant l'exemple précédent, on obtient alors l'unique facette suivante :

  • "mon objet en relation" (3 résultats)

Gestion des filtres de type string

Un fois les facettes générées, il est nécessaire de construire le lien permettant de filtrer les résultats par "mon objet en relation". eZ Find (ou plutôt Solr) exige logiquement que les chaînes de caractères (string) soient encapsulées par des "doubles côtes".

Cet extrait de code (un peu complexe) montre comment étendre le search.tpl pour générer des filtres pour les chaînes de caractères : filtres par "text line", "keywords" ou "relation d'objet(s)"

{foreach $search_extras.facet_fields[$index].nameList as $facetID => $name}
  {if $name|trim|count_chars|gt(0)}
    <li>
      {if $search_extras.facet_fields[$index].field|compare('facet_fields')}
       {def $url_link = concat($search_extras.facet_fields[$index].queryLimit[$facetID]|explode(':').0,':"',$name|urlencode,'"')}
      {else}
       {def $url_link = $search_extras.facet_fields[$index].queryLimit[$facetID]|wash}
      {/if}
      <a title="{$search_extras.facet_fields[$index].countList[$facetID]} Réponse(s) trouvée(s) dans les '{$name|wash}' // " href={concat( $baseURI, '&facet_field=', $facetField|wash, '&filter[]=', $url_link )|ezurl}>{$name|wash}</a> ({$search_extras.facet_fields[$index].countList[$facetID]})
      {undef $url_link}
    </li>
  {/if}
{/foreach}
 
 

A noter : L'opérateur urlencode n'est pas natif (fonction PHP) et doit être déclaré dans template.ini.append.php :

  • PHPOperatorList[urlencode]=urlencode
Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Gilles Guirand le 13/01/2010 21:33

Guillaume Kulakowski : Bonne année : 2010 année du changement

Bonne année à tous !

Certains l'auront peut-être remarqué, mais j'ai moins blogué cette année que les années précédentes. Les raisons en sont essentiellement les suivantes :

  • Moins d'activité personnelle au sein du groupe des ambassadeurs du Projet Fedora. Je lui préfère actuellement le groupe Package Maintainers. La raison est surement que je fais de plus en plus de commerce/marketing et de moins en moins de dev' pure à mon travail, je compense donc avec Fedora-Fr et le Fedora Project.
  • Moins de temps (nouvel appart', vie de couple, pas mal de taf', etc.).
  • La concurrence de Twitter : en effet, plus je Twitt' et malheureusement moins je blog (ça mériterait une étude sociologique au sein de la blogosphère ;-).)
  • Peut-être aussi moins de trucs intéressant à dire ?

Je vais donc essayer de faire mieux en 2010, surtout que des projets intéressants arrivent :

L'année 2010 sera aussi pour moi un grosse année de changement. En effet :

  • Je vais achever ma vie de célibataire et me marier (Juin 2010) avec Emma.
Voila, que l'année 2010 soit au moins aussi bonne que la 2009 !
Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Guillaume Kulakowski le 11/01/2010 11:50

Jérôme Vieilledent : Utilisation d'un SSO dans eZ Publish

Parfois, lors du développement d'une application web, il est nécessaire de s'interfacer avec le ou les logiciels et/ou sites web du client afin de garder une session commune et cohérente au sein de sa bulle applicative.

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Jérôme Vieilledent le 18/12/2009 17:02

Jean-Luc NGUYEN : eZ Publish : saisir du contenu directement en HTML

Un petit tip pour ceux qui souhaitent saisir du contenu directement en HTML sans filtrage d’eZ Publish dans l’extension ezoe :

Surcharger le fichier content.ini :

[literal]
AvailableClasses[]
# The class 'html' is disabled by default because it gives editors the
# possibility to insert html and javascript code in XML blocks.
# Don't enable the 'html' class unless you really trust all users who has
# privileges to edit objects containing XML blocks.
AvailableClasses[]=html

Voilà ! C’est surtout à activer lorsque ce n’est pas une assistante de communication qui est responsable du contenu, mais plutôt un webmaster qui désire maitriser le HTML avec des classes CSS de partout pour du HTML complexe. Fini les hacks ou les FCKEditor… Et le contenu reste en BDD en XML !

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Jean-Luc NGUYEN le 17/12/2009 16:11

Jérôme Vieilledent : Surveillez eZ Publish avec JVMonitoring

JVMonitoring est une extension pour eZ Publish permettant de surveiller la santé de votre site via HTTP.

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Jérôme Vieilledent le 17/12/2009 10:28

Charles-Christian Croix : Configurer le niveau de compression du Mode_deflate de Apache2 et utiliser les logs pour en connaitre l'efficacité

Pour compléter mon billet sur l'utilisation du mod_deflate pour un hébergement apache 2 de Dotclear2 et celui sur Optimisation d'un hébergement eZ Publish 4 pour l'utilisation des caches web ou je parle du mod_gzip de apache 1.3 je vous invite à consulter le billet use mod_deflate to compress web content delivered by apache sur g-loaded.eu. Cette... Lire Configurer le niveau de compression du Mode_deflate de Apache2 et utiliser les logs pour en connaitre l'efficacité

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Charles-Christian Croix le 10/12/2009 10:08

Thibault Jouannic : La dure vie des développeurs web

Travailler dans le web est parfois ingrat. Ingrat parce que c’est un métier peu connu, et par conséquent rarement apprécié à sa juste valeur.

Quel développeur web n’a jamais entendu des phrases comme « Tu fais des sites ? Alors tu peux venir me réparer mon ordi ? » ou encore « Vous pouvez me faire un youtube pour 400€ ? »

Pourquoi je vous raconte tout ça ? Juste pour servir d’intro à ce truc que j’ai bricolé aujourd’hui, et qui, je le confesse, m’a bien fait marrer (oui, je suis bon public et je rigole de mes propres conneries).

Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Thibault Jouannic le 09/12/2009 12:51

Guillaume Kulakowski : eZ Publish : rajouter des contrôles sur les données via les content edit handler

La possibilité de rajouter des contrôles sur les données saisies lors du processus de publication d'un objet eZ Publish est une nouveauté introduite dans eZ Publish 4.1. Jusqu'alors, si on voulait rajouter des règles métiers dans un formulaire eZ Publish, il fallait passer par la création d'un datatype héritant plus ou moins d'un datatype déjà existant et implémentant ces règles. Maintenant le content edit handler se dote d'un validateInput permettant enfin de contrôler les données saisies.

Concrètement à quoi ça sert ? Dans mon cas, lors de la création d'un compte par les administrateurs sur le planet de Fedora-Fr (géré bien évidement par eZ Publish), je veux être sûr que le login renseigné correspond à un GauffrUser (utilisateur de la Gestion de Authentification Unifiée de Fedora-FR, Gauffr fera l'objet d'un prochain billet). Pour cela, j'ai donc rajouté un petit contrôle :

function validateInput( $http, &$module, &$class, $object, &$version, $contentObjectAttributes, $editVersion, $editLanguage, $fromLanguage, $validationParameters )
    {
        $result = array( 'is_valid' => true, 'warnings' => array() );
        $isValid =& $result['is_valid'];
        $warnings =& $result['warnings'];

        $contentClassIdentifier = $class->Identifier;
        $gauffrIni = eZIni::instance('gauffr.ini');

        switch( $contentClassIdentifier )
        {
            case $gauffrIni->variable('eZUser', 'UserClassIdentifier'):

                /* get user login */
                $user_account = $object->dataMap();
                $user_account = $user_account['user_account'];
                $user_accountID = $user_account->ID;
                $http_login = 'ContentObjectAttribute_data_user_login_' . $user_accountID;
                if ( $http->postVariable( $http_login ) )
                {
                    $login = $http->postVariable( $http_login );
                    /* Fetch GauffrUser */
                    if ( !isset($GLOBALS['GAUFFR_INIT']) || !$GLOBALS['GAUFFR_INIT'] )
                        include 'Gauffr/gauffr.php';

                    if ( !empty($login) && $gauffrIni->variable('GauffrSettings', 'StricMode') == 'enabled' && !GauffrUser::unique(GauffrUser::fetchUserByLogin( $login ) ) )
                    {
                        $warnings[] = array( 'text' => ezi18n( 'gauffr/validate', 'No GauffrUser "%user" in GauffrMaster. Please add account on GauffrMaster first.', null, array('%user' => $login) ) );
                        $isValid = false;
                    }
                }
                break;
        }

        return $result;
    }
Bookmark logos Delicious Blogmark Google Bookmark Linkedin Yahoo! Bookmark Partager sur Facebook Twitter Publié par Guillaume Kulakowski le 06/12/2009 20:05