Fatigué

5 March 2017

Fatigé de faire et refaire les mêmes site internet, les mêmes modules, les mêmes spécification.

Je suis fatigué de jongler entre les différents CMS qui sont tous aussi bête les un que les autres. Ils fonctionnent selon leur logique interne, qu’il faut comprendre chaque fois, ça fatigue.

Je suis fatigué de répondre au téléphone pour expliquer que, oui, j’ai bien reçu le mail qu’ils ont envoyé il y a moins de 2 heures, mais que non, je n’ai pas encore pris le temps de répondre.

Je suis fatigué des clients qui veulent absolument utiliser des liens ouvrants, malgré le fait que ce soit une mauvaise pratique trop répandue. Expliquer prend du temps, surtout quand personne n’écoute vraiment.

Je suis fatigué de répondre aux mêmes questions.

Je suis fatigué des gens qui ont été {"{assignés" à la gestion du site web}} et qui ne font aucun effort pour comprendre par eux même le fonctionnement de leur outil.

Je suis fatigué des gens qui préfèrent m’envoyer un mail pour me demander comment recadrer une image dans Wordpress, plutôt que de chercher quelques minutes supplémentaires, ou de regarder un des 2000 tutoriels qui doivent exister sur le sujet.

Je suis fatigué des gens qui attendent tout de l’informaticien et ne font aucun effort pour comprendre l’outil.

Je suis fatigué des gens pressés.

Je suis fatigué des gens qui envoie un email le matin et appel l’après-midi pour avoir une réponse plus vite.

Je suis fatigué des gens qui écrivent en couleur dans les mails des autres au lieu de faire des citations de ce à quoi ils répondent.

Je suis fatigué de créer des comptes Google pour d’autres afin d’obtenir un code Google Analytics et qu’ils puissent mettre en évidence l’inutilité de leur site.

Je suis fatigué des gens qui n’utilisent pas “répondre à tous”. Me forçant à transférer des mails aux gens que cela concerne vraiment.

Je suis fatigué de “répondre directement aux clients” parce que le chef de projet n’a pas le temps. Ce qui, par la force des choses, fait de moi le nouveau chef de projet.

Je suis fatigué de recevoir des mails en Comic Sans MS.

Je suis fatigué du manque de vocabulaire technique des gens. De leur manque de culture Web.

Devant cet état de fatigue, deux choix s’offrent à moi :

  • Changer de métier.
  • Changer d’employeur.

Comme il est plus facile de changer d’employeur que de métier, c’est par cela que je vais commencer !


Clé aléatoire

24 February 2017

  $boundary = "-----=".md5(uniqid(rand())); // clé aléatoire de limite

Quand tu veux absolument faire un truc unique, mais que tu te rate de peux.

Explication :

La fonction md5 une fonction de hachage, qui pourrait alors créer des collisions !
De faite, une chaine MD5 ne peut être considérée comme unique…


Anti-hack des arguments

23 February 2017

//-- anti hack des arguments --------------------------------------
function check_arg($key,$type='s',$pardefaut='',$len=80) {

 // change l'odre de $_REQUEST[$key]

 if($key=="email") {
   if(isset($_GET[$key] )) { $arg = $_GET[$key]; }
   else {
     if(isset($_POST[$key] )) $arg = $_POST[$key];
     else
       if(isset($_COOKIE[$key] )) $arg = $_COOKIE[$key];
       else if(isset($_SESSION[$key] )) $arg = $_SESSION[$key];
     else $arg=$pardefaut;
   }
 }
 else {
  if(isset($_REQUEST[$key])) $arg = $_REQUEST[$key];
  else $arg=$pardefaut;
 }

  switch ($type) {
    case 's': // string
        $arg = substr($arg,0,$len);
      break;
    case 'sd': // string database
      $trans = array("%" => "", "," => "", ";" => "");      // anti hack db
      $arg =  trim(strtr(substr($arg,0,$len),$trans));
      break;
    case 'n':  // nombre
      $arg = $arg + 0;
    default:
      $arg = trim($arg);
  }

  return($arg);
}

Si quelqu’un comprend ce qui ce passe, qu’il n’hésite pas à m’éclairer… Mention spécial pour ce passage :\

 $trans = array("%" => "", "," => "", ";" => "");       // anti hack db
 $arg =  trim(strtr(substr($arg,0,$len),$trans));

Construire une site #Wordpress avec Timber et #Twig

30 January 2017

Twig est un système de templating PHP. Il permet de créer des squelettes de page qui seront ensuite transformés en page HTML.

Timber permet d’utiliser Twig avec Wordpress.

Je n’ai jamais apprécié, la façon dont sont créés le thème Wordpress, utiliser PHP comme système de templating est une idée très moyenne par rapport à la lisibilité qu’apport un système de template. Ne seraissent que parce que PHP encourage les développeurs de thème à faire “à leur sauce”. Un système de template a tendance forcer une méthodologie et donc faciliter le travail entre plusieurs développeurs. Il ne faudra pas rentrer dans la tête du développeur initial pour modifier le thème. Ou apprendre un des nombreux frameworks de templating Wordpress.

Il y a d’autre défaut au système de base de Wordpress, mais ce n’est pas l’objet de cet article.

Installer Timber et mettre en place les bases :

Copier le dossier wp-content/plugins/timber-library/timber-starter-theme dans le dossier thème de Wordpress.

Renommer le dossier pour qu’il colle avec votre thème et éditer style.css pour adapter les valeurs, cela correspond à notre nouveau thème.

Tout le sale boulot de ce système est fait, la majorité des fichiers templates Wordpress sont déjà remplit avec les codes twig qui vont bien :

On trouve par exemple ce code dans single.php :

$context = Timber::get_context();
$post = Timber::query_post();
$context['post'] = $post;
$context['comment_form'] = TimberHelper::get_comment_form();

if ( post_password_required( $post->ID ) ) {
    Timber::render( 'single-password.twig', $context );
} else {
    Timber::render( array( 'single-' . $post->ID . '.twig', 'single-' . $post->post_type . '.twig', 'single.twig' ), $context );
}

Il appelle par défaut le fichier single.twig, sauf s’il trouve un fichier spécifique single-ID_or_type.twig.

A partir de là, on travaillera principalement avec le sous-dossier templates qui contient les fichiers .twig.

Template :

Le template principal se nomme base.twig et contient le squelette principal du site. Ce squelette sera alors étendu par les autres squelettes. Par exemple dans page.twig :

{% extends "base.twig" %}

{% block content %}
    <div class="content-wrapper">
        <article class="post-type-{{post.post_type}}" id="post-{{post.ID}}">
            <section class="article-content">
                <h1 class="article-h1">{{post.title}}</h1>
                <div class="article-body">
                    {{post.content}}
                </div>
            </section>
        </article>
    </div><!-- /content-wrapper -->
{% endblock %}

On étend base.twig en surchargeant le block content.

La documentation de timber et au besoin, documentation de Twig, contiennent tout ce qu’il faut savoir. Plus vraiment d’excuse donc pour développer sans moteur de template !


Ajouter un nouveau type d'auteur à #SPIP

27 January 2017

Dans le fichier config/mes_options.php :

<?php
$GLOBALS['liste_des_statuts']['inscrit'] = 'inscrit';

// Placer la corbeille à la fin du tableau
$backup_corbeille = $GLOBALS['liste_des_statuts']['texte_statut_poubelle'];
unset($GLOBALS['liste_des_statuts']['texte_statut_poubelle']);
$GLOBALS['liste_des_statuts']['texte_statut_poubelle'] = $backup_corbeille;

La clé du tableau $GLOBALS['liste_des_statuts'] sert également de chaîne de langue pour traduire le statut.
La valeur sera quand à elle enregistrée dans la base de donnée comme statut d’auteur.

Il y a aussi la constante AUTEURS_MIN_REDAC qui détermine si le statut fait partie des des visiteurs ou non.

<?php
define('AUTEURS_MIN_REDAC', "0minirezo,1comite,5poubelle");

Un header image en fullscreen

26 January 2017

Je déteste cette mode : une grande image qui prend tout l’écran. Si vous avez de la chance, vous avez un titre et un menu. Basta.

Mais ce n’est pas le propos. Il se trouve qu’il y a des gens qui souhaite avoir cela, et comme ils payent pour…

Voici une technique assez simple. Il faut garder une chose à l’esprit quand on fait cela : tous les containers parent doivent avoir height: 100%;.
Rien de folichons ici, mais comme j’oublie régulièrement comment faire…

html, body, #page {
  height: 100%;
}

.full-image {
  position: relative;
  width: 100%;
  height: 100%;
  background-image: url([...]);
  background-size: cover;
  background-position: center;
}

Et le tour est joué !


Supprimer complètement un fichier d'un dépôt git

21 January 2017

Cela arrive de temps en temps, sur une application qu’on connait mal ou qu’on a pas conçue : on fait un dépôt git, le .gitignore, et on oublie un fichier de configuration avec des password dedans.

Et bien sur, manque de pot, vous avez déjà tout envoyer dans un dépôt public Github. Vraiment, c’est pas votre journée…

Bref, il existe une petite astuce pour supprimer un fichier de tout les commits du dépôt. C’est un peu lent, car il va réécrire chaque commit que vous avez fait sur le projet.

git filter-branch --tree-filter 'rm filename' HEAD

Après il faut utiliser git push -f pour réécrire le dépôt en ligne. Généralement, on évite cette opération, mais dans le cas d’un fichier avec des codes d’accès, c’est un moindre mal. Et bien entendu, cela ne vous dispense pas de changer le password en question !


Exectuer du code quand un auteur est ajouté à #SPIP

17 January 2017

Lorsqu’on ajoute un auteur, on a parfois envie d’automatiser certaine action : ajout automatique dans une zone d’accès restreint, ajout de mots-clés, ou tout simplement envoyer un mail.

Du coup, voici un pipeline qui fera le travail ! Il pourrait y avoir un effet indésirable cependant : lorsqu’un auteur est ressuscité de la corbeille, le pipeline se déclenche à nouveau.
Si c’est un problème, le pipeline post_insertion peut aussi être utilisé. Il contient cependant beaucoup moins d’information que post_edition.

<?php
function prefix_post_edition($flux) {
    if ($flux['args']['table'] == table_objet_sql('auteur')
        and $flux['args']['action'] == 'instituer'
        and $flux['args']['statut_ancien'] == '5poubelle'
    ) {
        $id_auteur = $flux['args']['id_objet'];
        $statut = $flux['data']['statut'];
        // Coder ici !
    }

    return $flux;
}

Une fonction bash pour chercher dans les fichiers de langue #SPIP

14 January 2017

Une petite fonction bash qui va chercher dans les fichiers de langue de SPIP après un mot en particulier.
Toujours pratique pour ne pas déclarer 10 fois la même chaîne de langue.

Il suffit d’ajouter ceci dans votre fichier .bashrc.

# Recherche dans les fichiers de langue SPIP
search_spip_lang () {
    LANG=${2:-"fr"} # On cherche par défaut dans le français. Mais le deuxième paramètre est la langue
    ag -G "lang/(.*)_$LANG.php" -- "$1" .
}

Un second paramètre peut être utiliser pour chercher dans une langue précise (sinon, il cherche en français).

Exemple :

Recherche en français du mot “spip”.

search_spip_lang spip

Recherche en anglais du mot “spip”.

search_spip_lang spip en

Ici j’utilise la commande ag pour chercher dans les fichiers. Il suffit de l’installer :

sudo apt install silversearcher-ag

Ack pourrait sans doute aussi faire le travail, mais ag est plus rapide :)