Des liens symboliques en 2 clics sur Windows 7

Bien connu des utilisateurs de systèmes *nix, les liens symboliques peuvent vous faciliter la vie et allonger la durée de vie de votre SSD.

Le principe est simple, on prend un dossier ou fichier de destination et on fait pointer un lien symbolique vers ce dossier ou fichier. Le système pensera que ce lien symbolique EST le fichier ou dossier de destination.

Exemple : J’ai un SSD C: et un disque dur D: .

  • on créé un dossier d:/tmp
  • on va dans c:/Utilisateurs/<mon utilisateur>/AppData/Local
  • on supprime le dossier Temp
  • et on fait un lien vers d:/tmp que l’on appel Temp

Le système pense alors que son dossier temporaire n’a pas bougé mais tout est en fait écrit sur le disque dur plutôt que le SSD.

Maintenant, comment faire cela simple ? Grâce au mini logiciel Link Shell Extension. Une fois installé, un nouveau menu apparaît lorsque vous cliquez sur un fichier ou dossier « Prendre comme cible du lien », c’est donc votre destination.
Allez dans le dossier de votre choix et  le clique droit fait apparaître un menu « Coller …> Un lien symbolique ». Il y a tout un tas d’autre choix mais c’est celui là qui nous intéresse.

Une fois collé, l’icone apparaît comme si c’était un raccourci, mais c’est plus que ça. Toutes modification du fichier du lien ou opérations faites dans le dossier se fera en réalité sur la source, à l’exception de la suppression du lien qui ne détruit pas la source.

Ce logiciel permet donc de faire des choses intéressante, surtout couplé aux services « cloud » que l’on trouve un peu partout.

http://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html

Le nouvel Agenda Trad en ligne.

Après 2 ans d’activité dans sa version 1, il était temps de refaire Agenda Trad, en prenant en compte les retours de ces deux années.

Le projet est, sur le fond, le même qu’à son lancement, mais sur la forme, beaucoup de choses ont changés.

D’abord le design. Réalisé par Rouge-Pixel, il apporte une vrai identité au site et une ergonomie simplifiée.

Ensuite, beaucoup de choses ont été revus pour simplifier l’expérience utilisateur et pour encore augmenter la qualité du contenu en évitant les doublons ou en déplaçant les ateliers réguliers dans une section à part.
Les mini-sites organisateur et groupe ont maintenant leur propre fiche de contact et là encore la présentation a été revue pour tenter d’être plus claire.

Pour cette nouvelle version il fallait mettre un gros coup de frais sur le partage. Plus il y a de visiteurs, plus les organisateurs ont intérêt à publier leurs évènements, plus les visiteurs ont intérêts à venir sur le site. Cercle vertueux.
Les partages pour Twitter, Google Plus et Facebook sont intégrés sur chaque page évènement, organisateur et groupe.
Les organisateurs et groupes ont accès en plus à deux fonctions leur permettant d’intégrer leurs évènements sur leur site ou de faire un partage personnalisé vers leur page Agenda Trad.
Un Flyer a même été édité en PDF pour ceux qui veulent diffuser localement 🙂

Infotrad, le mailing d’Agenda Trad, a aussi prit un coup de jeune grâce au nouveau design et une simplification du contenu.

Agenda-trad

Agenda Trad nouvelle version

D’un point de vue technique, fini le code « à la main ». Après un premier essai sur Symfony 1.4, assez intéressant au début, ce fût abandonné pour se tourner vers CakePHP 2.0.x

Après un premier test de ce framework en 2010, je n’étais pas forcément convaincu, mais la lourdeur de Symfony 1.4 m’a convaincu qu’il fallait tester autre chose. La version 2.x de CakePHP n’a rien à voir et le framework semble maintenant vraiment abouti. Tant du côté du code que de la normalisation et de la vélocité. Bref, ce framework vaut le coup et j’encourage les développeurs à y jeter un oeil.

Ce projet personnel m’a pris pas mal de temps libre et temps de travail mais le résultat est vraiment intéressant. En espérant qu’il y ai une bonne accroche côté visiteurs et organisateurs.

 

 

Détecter un robot avec CakePHP 2.x

Il peut être parfois intéressant de changer le comportement d’une page si c’est un robot qui est en train de la visiter. On peut ainsi éviter la génération de panier dans une boutique ou des Tokens sur un formulaire de contact. Surtout si votre site contient plein de formulaires de contacts 🙂

CakePhp dans sa version 2 intègre un nouvel RequestHandler.  De base, cet Objet Request intègre différentes détections classiques comme l’utilisation d’un mobile, d’une connexion SSL, requêtes POST ou GET, … Mais on peut aussi lui ajouter nos propres règles.

Tout d’abord on va utiliser un modèle Bot dont la table contiendra les robots et user_agent.

Le fichier SQL pour la table bots : Table des user_agent des principaux robots

Dans votre AppController::beforeFilter(), insérez le code suivant, où vous voulez

  /*
   * table bot
   */
   $this-&gt;loadModel('Bot');
   $bots = $this-&gt;Bot-&gt;find('all', array('fields' =&gt; 'agent', 'conditions' =&gt; 'is_active = 1'));
   $bots = Set::extract($bots, '{n}.Bot');
   $patternBot = array();
   foreach ($bots as $data) {
     $patternBot[] = str_replace('\*', '.*?', preg_quote($data['agent'], '#'));
   }
   $this-&gt;request-&gt;addDetector('bot', array('env' =&gt; 'HTTP_USER_AGENT', 'pattern' =&gt; '`' . implode('|', $patternBot) . '`'));

Point par point :

  • On charge le model ‘Bot’ pour pouvoir accéder à celui-ci
  • On récupère tous les user_agents des robots actifs
  • Un passage dans Set::extract pour nettoyer le résultat
  • On quote les agent pour que ça puisse passer dans le preg_match()
  • et on fabrique une énorme expression régulière que l’on transmet au RequestHandler

Nous avons donc maintenant un nouveau detecteur dans le RequestHandler et on peut utiliser dans n’importe quel controller :

$this-&gt;request-&gt;is('bot');

Et voilà 🙂

Pour plus de rapidité, il est conseillé d’utiliser le Cache pour les résultats.

    /*
     * table bot
     */
    $patternBot = Cache::read('pattern_bot');
    if (!$patternBot) {
      $this-&gt;loadModel('Bot');
      $bots = $this-&gt;Bot-&gt;find('all', array('fields' =&gt; 'agent', 'conditions' =&gt; 'is_active = 1'));
      $bots = Set::extract($bots, '{n}.Bot');
      $patternBot = array();
      foreach ($bots as $data) {
        $patternBot[] = str_replace('\*', '.*?', preg_quote($data['agent'], '#'));
      }
      Cache::write('pattern_bot', $patternBot);
    }
    $this-&gt;request-&gt;addDetector('bot', array('env' =&gt; 'HTTP_USER_AGENT', 'pattern' =&gt; '`' . implode('|', $patternBot) . '`'));

Prochaine étape, détecter si le user agent contient « Bot, Spider, Crawler, Slurp, … » et qu’il n’est pas détecté comme un robot pour l’ajouter à la table automatiquement avec un statut 0. Restera à passer changer les statuts si c’est vraiment des robots et votre table s’auto-alimente, mais ce sera pour plus tard.