Le carré de Sam - Plum

Le blog d'un jeune entrepreneur du cloud - Les dernières news.

Quel future pour le SaaS ? Application Web ou Native !

De plus en plus d’outils voient le jour sur le net, des applications en ligne qui viennent remplacer les applications de bureau classique. Plum fait partie de ces applications, un outil SaaS et PaaS. Mais ces outils accessibles depuis un navigateur Internet sont-ils l’avenir des applications informatiques ? Quels sont leurs inconvénients et comment y répondre ?

Les avantages du SaaS et des applications web

La raison d’être de ces applications est simple. Aujourd’hui, la majorité de nos ordinateurs sont connectés à Internet en permanence, le débit de cette connexion augmente régulièrement. Alors l’idée du SaaS est d’exploiter Internet et le Cloud pour mettre à disposition des internautes, un certains nombre d’outils et d’applications en ligne.

Les avantages de ce modèle sont nombreux. Ce n’est plus l’utilisateur qui contrôle l’outil, c’est l’éditeur qui le développe et l’héberge. Et pour l’utilisateur, c’est plus simple, pas de problématique d’installation, de mise à jour, de sauvegarde ou tout autre notion liée à l’informatique et aux systèmes d’information. C’est l’utilisation qui prime et l’accès à l’outil.

En terme de mobilité, l’utilisateur est également gagnant car ses données étant externalisées, il peut y accéder depuis n’importe quel ordinateur, smartphone ou tablette qui aurait un accès à Internet. Il est très facile de partager de l’information entre utilisateur car c’est comme si plusieurs personnes utilisaient le même ordinateur.

Le SaaS a apporté avec lui un nouveau modèle économique qui n’existait pas dans le domaine des applications informatique, celui de la location. En effet, sur ce genre d’outils, l’utilisateur ne paie plus pour acheter le logiciel mais il loue un accès à ce dernier. Résultat, la note est souvent moins élevée et surtout plus juste, je paie quand j’ai besoin.

Mais si sur le papier, le SaaS a tout pour être l’avenir de l’informatique, la réalité est plus compliquée que cela. Ce modèle soulève un certain nombre d’interrogations et de problématiques auxquels il n’est pas toujours évident de répondre. Où sont stockées mes données ? Qui y a accès ? Comment accéder à mes données quand je n’ai pas de connexion ou que le débit est faible ? …

Si les applications web permettent une meilleure portabilité sur les différents supports, un meilleur partage des informations, un outil moins onéreux et régulièrement mit à jour, elles apportent également un certain nombre d’inconvénient qu’il n’y avait pas dans l’application native. Alors les applications web sont-elles vraiment la meilleure réponse à apporter au besoin du SaaS ? Pas complètement. L’application native a également ses avantages qui ne faut pas ignorer. La meilleure solution serait peut-être d’utiliser les deux …

Les avantages des applications Natives

Pourquoi Facebook développe des applications pour iPhone, iPad, Android ? Pourquoi Twitter, Spotify et bien d’autres en font de même ? Pourquoi trouve-t-on dans les marketplaces des applications comme Le Monde ou MobileRSS ?

Toutes ses applications ne sont rien sans une connexion Internet par Wifi ou 3G et elles ne font que retranscrire une information qui est également disponible sur leur site web avec souvent plus de fonctionnalités, une information plus riche ou plus esthétique. Mais il se trouve que ces applications offrent des avantages qui viennent compléter le service offert par le site. Une fois le contenu téléchargé dans l’application, la connexion n’est plus nécessaire pour le consulter. Et surtout, le flux de données échangé entre l’application et le serveur distant est réduit uniquement à l’information, c’est l’application qui s’occupera ensuite de vous transmettre cette information sous un format graphique et ergonomique, ce qui n’est pas le cas pour un site ou la structure de la page est envoyée en plus de vos données.

Un autre avantage de l’application native, c’est qu’elle est capable d’exploiter les outils offerts par le support qui l’exécute. Facebook vous permet de partager une photo que vous prenez avec l’objectif de votre smartphone, Dropbox vous permet de synchroniser les dossiers de votre ordinateur sans votre intervention sur le logiciel. De plus, les ressources matérielles du support sont mises à contribution, c’est lui qui retranscrit graphiquement les informations à l’utilisateur et qui se charge de la navigation et de l’interface. Les serveurs d’hébergement sont soulagés de cette tâche, ce qui n’est pas le cas avec les applications web.

Le Cloud au service des applications Web et des applications Natives

Alors pourquoi les applications web existent si les applications natives sont meilleures ? Comme je le disais, les applications web ne sont pas une réponse parfaite du SaaS mais elles y participent. Vous avez vos fichiers sur votre ordinateur professionnel synchronisés avec Dropbox, vous avez l’application sur votre mobile pour les lire dans le train mais vous êtes chez un client et il vous manque un document. Vous pouvez y accéder depuis son ordinateur, sur le site de Dropbox et le télécharger. L’application web a rempli son rôle.

Le Cloud, c’est permettre de stocker des informations simplement, c’est également sécuriser ces informations, empêcher leur perte et surtout les rendre accessible partout. Le SaaS, c’est permettre de traiter ces informations, les partager et les consulter simplement, peu importe le support, le lieu, la présence ou la qualité d’une connexion Internet. L’avenir du SaaS n’est donc pas uniquement dans les applications web. Le service doit être disponible à travers une application web ET des applications natives sur Windows, Mac OS X, Linux, iOS, Android.

Comment réussir cela tout en gardant le modèle économique ? Le développement Cross-Platform mais cela, ça sera dans le prochain article …



Symfony, le i18n et le l10n

Internationaliser un site sous symfony … Simple ou complexe ? Inutile ou indispensable ? Comment faire (au plus simple et au plus rapide) ?

Entre développeurs et chefs de projets, l’internationalisation d’une application web est souvent une source de conflits. Pourquoi ? Comme souvent dans le développement informatique, l’anticipation est la clé du succès, de la fiabilité et du respect des délais.

Le problème quand on commence le développement d’une application web, c’est que l’on ne pense pas à l’internationaliser. On se dit toujours « Pour aller plus vite, restons dans notre langue », « Occupons-nous de nous développer localement, on s’occupera de l’international plus tard ». Erreur ! On est pas obligé de tout faire dès le début, mais il faut y penser.

Si dès le début vous préparez votre internationalisation, la rendre effective ne sera qu’un jeu d’enfants. Même si vous ne disposez que d’une seule langue, il est indispensable de faire comme s’il y en avait plusieurs car même si ça ne se fait que dans plusieurs mois, il arrivera bien un jour où vous activerez une version en anglais et peut-être d’autres langues. Voulez-vous vraiment le faire quand vous aurez développé plusieurs dizaines de milliers de lignes de code ?

Mais dans ce cas, qu’est-ce qu’il faut faire ? Qu’est-ce qui peut attendre ? C’est ce que nous allons voir dans cet article, et ceci dans l’intérêt du bien être des équipes de réalisation bien sûr ;)

 

Demander à l’utilisateur

Ça semble logique mais on sait que modifier la structure d’une base de données est toujours une opération sensible quand l’application est en ligne. Alors pour éviter les problèmes, pensez à stocker les informations de nos utilisateurs dès leur inscription.

Ce qui est important de connaitre est sa langue et son fuseau horaire. Ce qui est souvent demandé mais pourtant inutile est son pays. Évidemment, c’est lié, mais ce n’est pas parce que l’on connait son pays que l’on peut en déduire ces deux informations clés. Je peux être aux États-Unis mais être français et les États-Unis ont quatre fuseaux horaires différents.

Lorsque votre utilisateur se connectera à votre service, il ne vous restera plus qu’à configurer les paramètres qu’il a choisi. N’oubliez pas de lui permettre de les modifier à tout moment ;) On ne sait jamais, s’il se déplace souvent …

 

Préparez votre contenu

L’un des éléments les plus simples à internationaliser avec symfony, ce sont vos textes. Il suffit de les encapsuler dans des balises __(« … »). Je schématise bien sûr mais ce n’est pas loin d’être ça. Alors prenez le réflexe, même si vous n’avez qu’une seule langue car le jour ou vous en aurez d’autres, vous n’aurez plus qu’à les faire traduire, aucune modification dans votre code (des milliers de ligne je vous le rappelle).

 

Préparez les URLs

La aussi, une étape importante qui doit être prévue dès le départ. Parce que votre service sera référencé dès son arrivée en ligne, parce que vous allez certainement envoyer des liens dans vos emails et parce que les gens gardent longtemps, longtemps leurs emails, il est important que vos urls soient bien pensées. Alors n’oubliez pas d’y mentionner la langue (pour l’affichage du site) et de les traduire (http://www.monsite.com/fr/account/user/??? … pas logique).

 

Attention à la mondialisation

Selon l’outil que vous développez, lorsque vous l’ouvrirez à l’internationale, n’oubliez pas que vos utilisateurs seront amenés à travailler éventuellement dans des pays différents. Cela implique de le prendre en compte dans la transmission d’informations. Pensez à prendre en compte les paramètres de chaque utilisateur lorsque votre outil enverra des emails de notification ou lorsque vous le connecterai à des systèmes extérieurs (Google Agenda par exemple).

 

Le développement

Quand on réalise une application internationale, il faut développer en anglais et configurer le serveur en UTC !

A bon ? Et depuis quand ? Quel rapport ? (Plum est développée en français et toutes les dates sont stockées en GMT+1 mais chut …). Tout ça pour dire qu’il faut arrêter avec ce genre de clichés. On parlait de gagner du temps alors réalisez votre outil dans la langue qui vous semble la plus naturelle et faites-en la référence des autres langues, c’est vous le patron ;)

 

Vous n’êtes pas seul

Vous utilisez symfony pour réaliser votre application web, il est là pour vous aider, parcourez bien la documentation sur le sujet. Et n’oubliez pas les plugins de la communauté :

- tmcI18nPlugin : stockez vos traduction en base

- gbI18nRoutePlugin : traduisez vos urls

- sfDoctrineTimezoneablePlugin : pour gérer les fuseaux horaires en toute transparence

Vous aurez certainement besoin de quelques développements spécifiques supplémentaires mais peut-être que je vous en communiquerai quelques uns dans un prochain article.

 

En résumé, n’attendez pas car le développement d’un outil internationalisé n’est pas beaucoup plus long. Une fois qu’il aura une maturité suffisante, une fois que vous serez prêt à le porter dans d’autres langues, vous n’aurez qu’à faire traduire les textes que vous aurez déjà accumulé dans votre langue principale, à traduire vos urls, à ouvrir les paramètres de changement de langue et tout ça, sans effort et sans risquer de générer une instabilité dans votre solution. Tout ceci grâce à votre anticipation.

 

Bon courage à vous !



Dérapage positif ou négatif dans un projet ?

L’une des notions les plus difficiles à maitriser en gestion de projet est la gestion de la charge. Dans la plupart des cycles de vie d’un projet, l’estimation de son coût se fait au début après avoir établi la Charte de Projet qui en définit le périmètre fonctionnel. Ce coût, converti en prix, est communiqué à votre client et contractualisé avec ce dernier, si celui-ci l’accepte, comme le prix de votre travail pour mener ce projet à terme.

L’explication qui va suivre sur la notion de dérapage dans un projet concerne principalement le domaine de l’informatique. Il s’agit d’une réflexion menée selon notre expérience dans la gestion de projet, ce n’est pas une réponse parfaite ni universelle mais bien au contraire sujet à débat. Je vous invite à l’alimenter dans les commentaires de cet article.

Dans les projets Informatiques et encore plus dans les projets web, ce coût est directement lié à l’estimation de la charge de travail qu’il nécessite multiplié par le coût unitaire des ressources impliquées. Dans ce secteur un peu spécial, il y a rarement besoin de prendre en compte le prix de matière première ou le prix d’utilisation de produits industriels. Ici, c’est le travail des développeurs, chefs de projet, architectes et autres ressources humaines qui est quantifié et le coût d’un projet correspond à l’argent nécessaire pour leur verser un salaire et leur donner les moyens de travailler.

Et même si on y ajoute une marge de sécurité (plus ou moins importante selon le risque du projet) liée au risque d’erreur de cette estimation, on comprend bien vite l’impact sur votre marge d’une augmentation trop importante de la charge réelle du projet par rapport à cette charge estimée à un moment où le projet était encore flou.

 

Dérapage, qu’est-ce que c’est ?

Lorsqu’une tâche d’un projet est réalisée en plus ou moins de temps qu’elle n’avait été initialement estimée, l’écart entre ces deux charges et appelé « dérapage ». Un dérapage est négatif lorsque l’on a gagné du temps et il est positif lorsque l’on en a perdu.

 

Alors, vaut-il mieux un dérapage positif ou négatif ?

Vous aurez bien compris que si vous avez vendu votre projet au prix de votre temps passé à le réaliser, un dérapage négatif, qui signifie un temps gagné, signifie également un gain financier plus important. « Le temps, c’est de l’argent » prends ici tout son sens ;) A l’inverse, un dérapage positif signifie un temps passé qui n’a pas été payé par votre client et qui est donc à vos frais :s

Si vous devez donc avoir un dérapage sur votre projet, il vaut mieux qu’il soit négatif !

 

Un dérapage négatif, mais un dérapage quand même

Vous avez un dérapage négatif sur votre projet ? Félicitation, vous gagnez plus d’argent que vous ne l’aviez prévu ! Mais ne vous réjouissez pas trop non plus, un dérapage qu’il soit négatif ou positif signifie une erreur d’estimation de votre travail. L’une des principales qualités que doit posséder un Chef de Projet est sa capacité à faire le bilan de son travail et à apprendre de ses erreurs afin de ne pas les reproduire.

 

Quelle est le risque d’un dérapage négatif sur votre projet ?

Il y a deux principaux risques à une telle situation :

Le premier risque se situe en amont de votre projet, au moment de son estimation. Vous devez prévenir un dérapage négatif car cela signifie que vous avez estimé votre projet plus cher qu’il ne l’est réellement et si vous ne vous en êtes pas encore rendu compte, votre futur client lui risque de le faire. Vous risquez tout simplement de perdre le projet avant même qu’il n’est commencé, lors de la négociation.

Le deuxième risque se situe après être entré dans cette phase de dérapage négatif. Vous avez réussi à vendre votre projet sur-estimé mais ne levez pas le pied pour autant, vous n’êtes pas à l’abri d’une tendance inverse, le projet n’est pas encore fini. Ce n’est pas parce que vous êtes le premier dans une course que vous devez ralentir. Si vous arrivez à conserver cet écart jusqu’au bout de votre projet, vous serez confronté à un choix délicat. Vaut-il mieux garder cet argent pour vous et en profiter pleinement ou vaut-il mieux le rendre à votre client en lui expliquant les raisons de ce dérapage ? Les risques que vous aviez imaginé au début de votre projet ne sont pas survenus ou les conditions de réalisation se sont faites dans un contexte idéal. Il s’agit là de choisir entre faire votre devoir professionnel vis-à-vis de votre client et profiter de ce contexte favorable pour vous ouvrir de nouvelles opportunités pour de futurs contrats ou de lui cacher vos bénéfices supplémentaires pour réaliser des projets rangés au placard en attendant des jours meilleurs !

 

Pourquoi les dérapages négatifs sont rares ?

Dans le secteur de l’informatique et dans beaucoup d’autres secteurs d’ailleurs, de plus en plus même, les dérapages négatifs sont peu fréquents, les dérapages positifs le sont bien plus et l’équilibre charge estimée / charge réelle est rarement atteint. Comment cela se fait ? La raison en est simple, ces secteurs ne bénéficient pas de la même expérience que les secteurs de la construction ou de l’automobile qui sont maitrisés depuis longtemps. Dans ces secteurs, les méthodes et les outils évoluent beaucoup moins vite, le retour d’expérience se base sur un bien plus grand nombre de projets réalisés, avec succès ou non.

La gestion de projet en informatique est plus récente et elle évolue sans cesse. Combien de projets sont réalisés par des équipes qui ne maitrisent pas les outils qu’ils vont devoir utiliser, qui ne maitrisent pas les méthodologies qu’ils vont mettre en place dans leur organisation ? Les risques liés à ce manque d’expérience sont souvent mal estimés ou volontairement réduits pour ne pas afficher des prix trop élevés par rapport au marché. Résultat, les projets dérapent, les marges se réduisent et c’est souvent ces dernières qui deviennent négatives (et le dérapage positif bien sûr, c’est clair non :) ?) …

 

Managers, Chefs de Projet, bon courage à vous,



Sauvegarder vos sessions en base avec symfony

Premier grand virage dans les articles de ce blog. Aujourd’hui, je commence une autre branche du carré, le développement web.

Pour cet article, il est question principalement de PHP et plus particulièrement le framework symfony dans sa version 1.4 (1.4.9 pour être précis).

Nous allons voir ensemble comment enregistrer les sessions PHP dans une base de données, comment la personnaliser, la gérer et l’analyser. Il existe plusieurs avantages dans ce procédé, vous pouvez savoir en permanence qui est sur votre site, où ils se trouvent, vous pouvez déconnecter vos utilisateurs avant de fermer le site pour une mise à jour importante, après les avoir avertis bien sur ;) .

Autre avantage de cette architecture, vous pouvez également ajouter à côté de vos utilisateurs, un pictogramme supplémentaire pour indiquer s’ils sont en ligne ou non.

Bref, la gestion des sessions en base de données, c’est la garantie d’un meilleur contrôle de la part de l’administrateur et le bénéfice de fonctionnalités supplémentaires pour ce dernier et pour ses utilisateurs.

 

Première étape : Le schéma yml

Pour que vos sessions soient correctement enregistrées en base, il leur faut une table adéquate :

 

Session:
  columns:
    sess_id:
      type: string
      length: 64
      primary: true
      notnull: true
    sess_data:
      type: clob
      length: 65532
      notnull: true
    sess_time:
      type: integer(4)
      notnull: true
    is_authenticated:
      type: boolean
      default: false
    last_request_time:
      type: integer(4)
    user_id:
      type: integer(4)
    app:
      type: string
      length: 255
    module:
      type: string
      length: 255
    action:
      type: string
      length: 255
    is_ajax:
      type: boolean
      default: false
    ip:
      type: string
      length: 255
    culture:
      type: string
      length: 255
    user_agent:
      type: string
      length: 255

 

Dans cette table, les trois premiers champs sont le minimum nécessaire au bon fonctionnement de vos sessions. Les éléments supplémentaires sont ma personnalisation pour enrichir ces sessions et en savoir le plus possible sur mes utilisateurs. Pour faciliter la lecture et le filtrage, j’ai créé des champs comme is_authenticated, last_request_time, user_id, qui sont des données que l’on retrouve dans la session de symfony et qui sont enregistrées dans le champs sess_data. Les autres champs me permettent de connaitre le dernier emplacement de mes utilisateurs, leur IP, leur langue et leur user_agent qui me renseignent sur leur navigateur et leur poste de travail. Ces éléments sont surtout destinés à faciliter la compréhension ou la reproduction d’un bug survenu sur notre service.

 

Deuxième étape : Lire et écrire dans la table des sessions

Symfony mets à votre disposition, une classe sfPDOSessionStorage qui est destinée à réaliser les opérations d’écriture et de lecture des sessions dans la base de données. Le problème est que notre table a été enrichie, il nous faut donc une classe personnalisée qui va nous permettre de renseigner ces nouveaux champs. Cette classe, la voici :

 

class plSessionStorage extends sfPDOSessionStorage
{
 /**
  * Writes session data.
  *
  * @param  string $id    A session ID
  * @param  string $data  A serialized chunk of session data
  *
  * @return bool true, if the session was written, otherwise an exception is thrown
  *
  * @throws DatabaseException If the session data cannot be written
  */
  public function sessionWrite($id, $data)
  {
    // get table/column
    $db_table    = $this->options['db_table'];
    $db_data_col = $this->options['db_data_col'];
    $db_id_col   = $this->options['db_id_col'];
    $db_time_col = $this->options['db_time_col'];

    $db_auth_col       = 'is_authenticated';
    $db_request_col    = 'last_request_time';
    $db_user_col       = 'user_id';
    $db_app_col        = 'app';
    $db_module_col     = 'module';
    $db_action_col     = 'action';
    $db_ajax_col       = 'is_ajax';
    $db_ip_col         = 'ip';
    $db_culture_col    = 'culture';
    $db_user_agent_col = 'user_agent';

    $is_authenticated  = (bool)   $this->read(sfBasicSecurityUser::AUTH_NAMESPACE);
    $last_request_time = (int)    $this->read(sfBasicSecurityUser::LAST_REQUEST_NAMESPACE);
    $user_id           = (int)    $this->getUtilisateurIdFromSessData();
    $app               = (string) $this->getCurrentApp();
    $module            = (string) $this->getCurrentModuleName();
    $action            = (string) $this->getCurrentActionName();
    $is_ajax           = (bool)   $this->isAjax();
    $ip                = (string) $_SERVER['REMOTE_ADDR'];
    $culture           = (string) $this->read(sfBasicSecurityUser::CULTURE_NAMESPACE);
    $user_agent        = (string) $_SERVER['HTTP_USER_AGENT'];

    $sql = 'UPDATE ' . $db_table
         . ' SET '   . $db_data_col       . ' = ?, '
         . $db_time_col       . ' = ' . time() . ', '
         . $db_auth_col       . ' = ?, '
         . $db_request_col    . ' = ?, '
         . $db_user_col       . ' = ?, '
         . $db_app_col        . ' = ?, '
         . $db_module_col     . ' = ?, '
         . $db_action_col     . ' = ?, '
         . $db_ajax_col       . ' = ?, '
         . $db_ip_col         . ' = ?, '
         . $db_culture_col    . ' = ?, '
         . $db_user_agent_col . ' = ? '
         . 'WHERE '  . $db_id_col         . ' = ?';

    try
    {
      $stmt = $this->db->prepare($sql);
      $stmt->bindParam(1,  $data,              PDO::PARAM_STR);
      $stmt->bindParam(2,  $is_authenticated,  PDO::PARAM_BOOL);
      $stmt->bindParam(3,  $last_request_time, PDO::PARAM_INT);
      $stmt->bindParam(4,  $user_id,           PDO::PARAM_INT);
      $stmt->bindParam(5,  $app,               PDO::PARAM_STR);
      $stmt->bindParam(6,  $module,            PDO::PARAM_STR);
      $stmt->bindParam(7,  $action,            PDO::PARAM_STR);
      $stmt->bindParam(8,  $is_ajax,           PDO::PARAM_BOOL);
      $stmt->bindParam(9,  $ip,                PDO::PARAM_STR);
      $stmt->bindParam(10, $culture,           PDO::PARAM_STR);
      $stmt->bindParam(11, $user_agent,        PDO::PARAM_STR);
      $stmt->bindParam(12, $id,                PDO::PARAM_STR);
      $stmt->execute();
    }
    catch (PDOException $e)
    {
      throw new sfDatabaseException(sprintf('PDOException was thrown when trying to manipulate session data. Message: %s', $e->getMessage()));
    }

    return true;
  }

  public function getUtilisateurIdFromSessData()
  {
    $attributes = $this->read(sfBasicSecurityUser::ATTRIBUTE_NAMESPACE);
    if (is_array($attributes) && isset($attributes['Utilisateur']) && isset($attributes['Utilisateur']['utilisateur_id']))
    {
      return $attributes['Utilisateur']['utilisateur_id'];
    }

    return 0;
  }

  public function getCurrentApp()
  {
    if (sfContext::hasInstance())
    {
      return sfContext::getInstance()->getConfiguration()->getApplication();
    }

    return '';
  }

  public function getCurrentModuleName()
  {
    if (sfContext::hasInstance())
    {
      return sfContext::getInstance()->getModuleName();
    }

    return '';
  }

  public function getCurrentActionName()
  {
    if (sfContext::hasInstance())
    {
      return sfContext::getInstance()->getActionName();
    }

    return '';
  }

  public function isAjax()
  {
    if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && 'XMLHttpRequest' ==  $_SERVER['HTTP_X_REQUESTED_WITH'])
    {
      return true;
    }

    return false;
  }

  public function regenerate($destroy = false)
  {
    if (self::$sessionIdRegenerated)
    {
      return;
    }

    $currentId = session_id();
    self::$sessionIdRegenerated = true;

    return $this->sessionWrite($currentId, $this->sessionRead($currentId));
  }
}

 

Cette classe qui étend la classe sfPDOSessionStorage a pour principal objectif de modifier l’écriture des sessions dans la base pour y ajouter nos paramètres supplémentaires.

Autre fonction intéressante de cette classe, elle redéfinie la méthode regenerate() qui génère une nouvelle session pour un utilisateur. En effet, dans plusieurs cas, symfony fait appel à cette méthode pour dupliquer une session, comme quand la personne s’authentifie ou que ses droits sont modifiés. Dans notre cas, cette méthode risquerait de compliquer notre analyse en générant plusieurs session pour le même utilisateur. La méthode de ma classe empêche cette duplication de session, un visiteur conserve sa session du début à la fin de sa visite tant qu’elle est encore active. Si certains d’entres vous sont capable de m’expliquer la raison de cette méthode dans le framework symfony, merci de m’éclairer dans les commentaires.

 

Troisième étape : Mise en place du système de gestion dans vos applications

Maintenant que votre base est prête à accueillir vos sessions et que votre classe de gestion est dans votre projet, il ne reste plus qu’à configurer vos applications. Ca se passe dans les factories :

 

  storage:
    class: plSessionStorage
    param:
      session_name: my_session_name
      session_cookie_domain: my-domain.com
      database: doctrine
      db_table: session

 

Vous pouvez reproduire cette configuration pour chacune de vos applications en veillant à changer le session_name sauf contre indication. Vous pouvez choisir de gérer vos sessions en base pour tous les environnements ou simplement en prod. C’est vous qui voyez. Toutes les applications ou environnements qui ne seront pas impliqués par ces paramètres continuerons à sauvegarder vos sessions dans des fichiers.

 

Quatrième étape : Gestion des sessions depuis l’admin

Pour consulter et gérer vos sessions depuis votre console d’admnitration, c’est très simple. Vous utilisez symfony, vous les stocker dans votre base de données, quoi de plus simple et de plus évident qu’un module admin-generator ? Si vous ne savez pas de quoi je parle, je vous conseille de faire un tour sur le site de symfony qui vous l’expliquera mieux que moi et de manière plus complète, c’est par ici que vous trouverez votre bonheur !

 

Cinquième étape : Petit bonus entre amis

Puisque je suis sympas, je vous donne quelques exemples de codes qui vous permettrons de bénéficier des avantages de vos sessions en base sur votre site, merci qui ? Merci Doctrine ;)

 

Connaitre le nombre de visiteurs (personnes non authentifiées) sur votre site :

  public static function getNbVisiteursConnectes()
  {
    $query = SessionTable::getInstance()->createQuery('s')
             ->where('s.is_authenticated = ?', false)
             ->andWhere('s.last_request_time > ?',strtotime("-20 minutes"));

    return $query->count();
  }

Pour les utilisateurs connectés sur votre site, c’est pareil, il suffit juste de changer la valeur de is_authenticated, faites attention aux éventuelles doublons (user_id) …

Petite astuce : on ne compte que les sessions qui ont un last_request_time (date de dernière activité) de moins de 20 minutes pour s’assurer que le visiteur a été actif récemment.

 

Savoir si un de vos utilisateurs est actuellement connecté :

  public function getEtatDeConnexion()
  {
    if (null == $this->_session)
    {
      $this->_session = SessionTable::getDerniereSessionPourUnUtilisateurId($this->getId());
    }

    if ($this->_session instanceof Session)
    {
      if ($this->_session->getLastRequestTime() < (time() - (1200)))
      {
        return self::UTILISATEUR_INACTIF;
      }

      return self::UTILISATEUR_CONNECTE;
    }

    return self::UTILISATEUR_DECONNECTE;
  }

 

  public static function getDerniereSessionPourUnUtilisateurId($utilisateur_id)
  {
    return SessionTable::getInstance()->createQuery('s')
           ->where('s.user_id = ?', $utilisateur_id)
           ->orderBy('s.last_request_time DESC')
           ->fetchOne();
  }

 

 

Voilà, avec ça, vous aurez de quoi vous occuper un peu ;)

Les possibilités sont nombreuses avec ce genre de systèmes mais je ne vais pas toutes vous les dévoiler et vous enlever le plaisir de les découvrir vous-même. N’hésitez pas à les partager dans les commentaires en tout cas.

 

Développeurs, développeuses, bon code à vous,



Connectez votre blog à votre réseau

Un blog permet à son ou ses auteurs de partager leur univers avec leurs lecteurs. Les blogueurs communiquent sur leurs passions, leurs expériences et leurs avis. Ils parlent de l’actualité, de sport, d’informatique, de politique, de cinéma et de bien d’autres sujets. Il y en a pour tous les goûts. Mais un blog, c’est aussi un moyen de travailler son image, c’est l’opportunité de se faire connaitre à travers Internet. A travers un blog, il y a un réseau qui se créé, on vous lit, on commente, on tweet et retweet, on partage, et parfois, ça dépasse la toile et on se retrouve cité dans une émission de télévision … Bref, un blog, c’est l’opportunité pour son auteur de devenir connu et influent. Et en devenant « célèbre », vous pouvez donner plus de poids à votre projet, que se soit pour atteindre un poste difficile à acquérir, communiquer sur votre projet ou sur votre société. Vous avez un blog ? Alors vous savez de quoi je parle !

Cherchant à travailler votre e-réputation, vous avez certainement un compte sur Twitter, Viadéo, Linkedin ou Facebook (qui est de plus en plus considéré comme un outil pour les professionnels d’ailleurs). Vos réseaux sociaux peuvent servir les intérêts de votre blog (autrement dit vos intérêts) et votre blog peut servir les intérêts de vos réseaux sociaux (vos intérêts toujours). Pour cela, il suffit de connecter le tout, de manière automatique bien sûr, votre temps est précieux :)

 

Première étape : Afficher ses coordonnées sur son blog

Ne l’oubliez pas, votre blog et le meilleur moyen pour vous faire connaitre et de faire connaitre vos projets. Il est donc important que l’on ne puisse facilement faire le lien entre vous et votre blog. Pour cela, le meilleur moyen est de prévoir un encadré sur le côté de chaque page. Que faut-il y mettre à l’intérieur ? Votre nom, une photo de vous et surtout, vos coordonnées sociales (vos profils Twitter, Facebook, Viadéo, Linkedin). Chaque réseau est unique, montrez que vous êtes sensible à leurs particularités et que vous êtes capable d’élargir au maximum votre visibilité.

Les deux mots d’ordre pour cet encadré sont clarté et discrétion. Utiliser les logos et couleurs de chaque réseau pour qu’ils soient rapidement identifiés et surtout, créez un bloc qui ne saute pas trop aux yeux, il risquerait de pénaliser le contenu de votre blog ce qui n’est pas l’effet voulu.

De la même manière, n’oubliez pas d’indiquer sur chaque réseau l’adresse de votre blog voir même les profils de vos autres réseaux. Rappelez-vous que l’objectif est de connecter l’ensemble.

 

Deuxième étape :  Connecter vos réseaux sociaux

Maintenant que votre blog et vos réseaux sociaux sont bien connectés entre eux à travers vos différents profils, nous allons pouvoir passer à la deuxième étape, automatiser les annonces de vos articles. L’objectif ici est d’attirer vos réseaux à venir sur votre blog pour y lire votre contenu (de qualité bien sûr). Pour cela, il y a les plugins de WordPress et également les applications développées par les différents réseaux.

 

Pour publier sur Facebook, j’utilise le plugin Status Updater. Pour ajouter une touche de social supplémentaire, j’utilise le plugin Like qui permet d’ajouter le célèbre bouton sur chacun de vos article.

Pour publier sur Twitter, vous pouvez utiliser le même plugin ci-dessus mais pour ma part, je préfère utiliser le plugin Twitter Tools que je trouve plus complet sur ce réseau.

Pour publier sur Linkedin, ça se passe sur le site directement à l’aide d’une application à retrouver ici.

Autre élément à ne pas oublier, le flux RSS. Pour ça, j’utilise Feedburner. Parce que beaucoup de vos visiteurs préfèreront vous suivre à travers ce flux plutôt que de systématiquement venir sur votre blog, n’oubliez pas d’ajouter vos coordonnées sociales au pied de vos articles.

 

Troisième étape : Ajouter du partage

Maintenant que votre réseau vous rends visite sur votre blog, il faut l’inciter à partager. C’est comme cela que votre réseau s’agrandi car ce visiteur est lui aussi sur un ou plusieurs de ces réseaux et certainement en relation avec des personnes qui vous ne connaissez pas encore. Grace au partage, il va pouvoir communiquer avec ses relations qui viendront elles aussi sur votre blog et vu que vous avez bien pris soin de mettre en avant vos coordonnées, si elles aiment vos articles, elles souhaiteront rentrer en contact avec vous. Elles pourront également partager à leur tour, vous avez compris le principe ! Votre réseau grandi et votre influence également.

Comment faire pour faciliter le partage ? C’est très simple, encore une fois, les plugins de WordPress sont là pour vous faciliter la vie. A la différence de votre encart coordonnées vu dans la première étape, ici ce n’est pas dans la page que ça se passe mais sur chacun de vos articles. L’endroit idéal, c’est au pied de ces derniers, lorsque vos lecteurs ont fini de vous lire, il faut qu’ils puissent avoir à leur disposition une série de liens pour partager sur leurs réseaux. Partager sur Twitter, Facebook, Viadéo, Linkedin ou même envoyer par email ou poster sur son blog sont autant de liens utile pour eux et donc pour vous.

 

Pour permettre le partage de vos articles sur tous les réseaux sociaux et bien plus, j’utilise le plugin SexyBookmarks pour son choix et son design.

 

Quatrième étape : Afficher vos réseaux sociaux

Désormais, votre connexion est prête. Tous ceux qui sont en relation avec vous savent que vous avez un blog, tous ceux qui viennent sur votre blog, savent qui vous êtes et comment se connecter avec vous, votre réseau augmente de lui même grâce à vos articles pertinent et enrichissant et vous pouvez désormais communiquer sur des intérêts plus personnels comme vos projets professionnels. Vous êtes entrepreneur ou désireux de le devenir, votre activité va fleurir bien plus rapidement grâce à votre blog et à son incroyable visibilité.

Que reste-t-il encore à faire dans ce cas ? Toujours dans le but d’améliorer la connection entre votre blog et votre réseau, sachez que, en plus d’afficher l’actualité de votre blog sur vos réseaux, vous pouvez également afficher l’actualité de vos réseaux sur votre blog. Afficher ses derniers tweets, ses derniers messages linkedin, le nombres de followers, le nombre d’abonnés à votre flux rss, tout cela est possible. L’intérêt pour vous, selon moi est bien moins important que le partage et la publication mais certains y verront peut-être le côté interactif intéressant.

 

Le plugin Twitter Tools offre plus de possibilités que la publication de vos posts. Il peut par exemple vous permettre d’afficher le flux de votre actualité.

Le plugin LinkedIn SC offre également la possibilité d’afficher votre actualité publique ou privée sur votre blog.

 

En conclusion

En terme d’image, d’e-réputation et de communication, être sur tous les réseaux sociaux, avoir un blog et les faire vivre est un acte important. Cela peut s’avérer lourd en terme de charge mais le résultat sur votre activité professionnel est non négligeable. Il suffit que vous renseigniez votre nom sur les différents moteurs de recherche pour le constater par vous-même, les profils des réseaux sociaux sont très bien référencés, plus que les articles de votre blog ou les mentions dans différents sites web. Alors quand en plus, vous avez la possibilité de relier l’ensemble de votre réseau et en augmenter les avantages et les bénéfices, il ne faut pas hésiter !

Blogueurs, blogueuses, entrepreneurs, managers et autres acteurs de la communication sur Internet, bonne continuation à vous  et n’oubliez pas de partager et de me suivre ;)

 



Créer son entreprise en France en 2011

Pour mon premier article, les choix de sujets sont nombreux, l’actualité web en ce moment est très riche. Mais j’ai préféré réaliser un retour d’expérience sur une aventure récente qui peut aider beaucoup de personnes je pense, créer son entreprise en France à l’ère du numérique.

D’après un article récent, 80% des actions administratives pourront se faire sur Internet d’ici la fin de l’année, Impôts, Etat civil, Santé, Voiture et Création d’entreprise. Chaque actions aura son formulaire, ses procédures, le tout entièrement dématérialisé … le constat actuel que je puisse faire après avoir terminé les démarche de création de la société Plum SaaS, c’est qu’on est encore loin du compte.

Pour avoir été pendant un temps auto-entrepreneur, j’ai en effet pu constater que la démarche en ligne est bien rodée. Il suffit de remplir un formulaire, joindre un document ou deux, signer (numériquement), envoyer le tout et le tour est joué. Pour se dé-inscrire, c’est la même chose, un formulaire sur le même site, une signature (numérique) et c’est fait, durée de l’opération, 10 minutes (en comptant la relecture). Pour ceux qui veulent savoir où aller, tout est ici http://www.lautoentrepreneur.fr/

Face à cette démarche simple et à la volonté de notre administration française de dématérialiser ses procédures, c’est tout naturellement que mon associé @nilparra, et moi-même nous sommes tournés sur Internet pour créer la SARL Plum SaaS. Le premier constat que nous pouvons faire quand nous commençons à faire des recherches sur les étapes de création d’une SARL en France, c’est que les informations sont présentes sur la toile. Pour preuve, je vous conseille le site http://www.apce.com/. Un autre conseil, évitez les sites commerciaux dans le domaine de la création, la plupart essayerons de vous vendre des prestations pour vous aider à réaliser votre démarche à l’image d’une organisatrice de mariage moyennant finance bien sûr. Vous n’avez pas besoin de réaliser ses frais car toutes les informations dont vous aurez besoin sont accessibles librement après un peu de temps de recherche. Mais si les renseignements sont complets sur le sujet, la démarche de création d’entreprise en ligne a encore un long chemin à faire.

Un conseil, déplacez-vous, appelez les administrations, prenez des rendez-vous avec vos interlocuteurs, tenez-vous informé régulièrement du suivi de vos démarches par téléphone, évitez le tout numérique. L’utilisation de site comme http://www.guichet-entreprises.fr/ semble au début être une bonne idée mais très vite, on se rend compte que le suivi des dossiers n’est pas au point voir inexistant. On se retrouve vite obligé d’appeler de tous les côtés et on se rend compte que les dossiers ne sont pas transmis pour différentes raisons, que nous sommes contactés par courrier et non par emails et que nous sommes obligés de revenir au papier pour compléter un dossier ou corriger un document. Bref, l’utilisation d’Internet s’est avérée être une importante perte de temps et que les choses avançaient beaucoup plus dès que nous nous déplacions ou appelions les différentes administrations. Le constat est le même pour les banques. Nous avons rencontré plusieurs conseillers de différentes institutions et notre choix final s’est porté sur la CIC, pas pour ses prix (pas seulement) mais pour la réactivité de notre conseiller aux emails que nous lui avons adressé. Bon nombre de banques ne nous ont jamais envoyé les compléments d’informations par emails après notre premier rendez-vous ou n’ont jamais répondu à nos emails. En 2011, ce n’est quand même pas un luxe d’utiliser ce genre d’outils de communication …

Malgré le retard technologique des administrations et banques françaises, l’utilisation d’Internet est quand même fortement conseillée pour gagner du temps et simplifier les autres démarches. Business Plan, Statuts, pièces d’identités, autorisation de domiciliation, etc. La liste des pièces justificatives à fournir dans votre dossier de création est nombreuse. Si certaines sont faciles à obtenir (pièces d’identités) ou faciles à réaliser (déclaration de non condamnation) d’autres seront à créer de toute pièce par vous-même (business plan). Pour ces documents, les outils en ligne vous seront d’un grand secours et n’hésitez pas à utiliser des outils payants s’ils vous semblent performants.

Un dernier conseil, dématérialisez vos documents, Google Documents ou un autre, mettez vos documents en ligne, rédigez-les directement sur la plateforme choisie. Les intérêts sont nombreux, faciliter le partage entre les différents associés, réduire le risque de perte de vos documents et surtout, si vous disposez d’un smart phone ou autre, vous serez en mesure de transmettre ces documents à votre interlocuteur durant votre entretien, en terme d’image, c’est quand même la classe ;)

Futur entrepreneur, bon courage à vous !



Bonjour tout le monde !

Bienvenue dans le carré de Sam !

Après le succès certes éphémère de mon premier blog du même nom (ou presque) et après une activité professionnelle chargée ne me permettant pas de le maintenir aussi souvent que je le désirais, voici la nouvelle mouture …

Pour cette nouvelle édition 2011, le blog est hébergé par Plum SaaS, la société que j’ai nouvellement créée en association avec Nil qui participera occasionnellement à la rédaction de certains articles. D’autres auteurs, je l’espère, viendrons également enrichir ce blog et apporter leur culture et leurs expériences.

Concernant ces articles justement, l’objectif reste de parler de ce qui nous intéresse, Internet, le développement web, la Gestion de Projet et l’évolution de nos projets professionnels, plus particulièrement Plum, notre outils de gestion de projets collaboratif en ligne.

Bonne lecture à tous !



Plum est une marque déposée par PLUM SaaS S.A.R.L.
Les photographies, visuels et textes sont soumis à copyright.
©2010-11 Tous droits réservés Plum.
SS 11, Chemin de la Batterie, 13008 Marseille
RCS Aix - SIRET 530 252 790 00023 - Capital 10K€

Plum - La Gestion de projet Collaborative