blog.roxing.net

Bonnes pratiques JQuery

Charger le contenu depuis un CDN Plutôt que de stocker JQuery sur votre serveur, vous pouvez choisir un CDN notoire. Cela devrait réduire le temps de chargement de la page. Voici une liste de CDN fournissant un accès à la bibliothèque JQuery : Google CDN Microsoft CDN jQuery CDN CDNJS CDN jsDelivr CDN Les bonnes pratiques ne concernent pas seuelement JQuery ; les éléments d’affichage - type CSS ou autre - peuvent aussi être chargés parallèlement. Prévoir une méthode de chargement (...)

Il y a 25 articles
  • [Debian] Java JRE 8 - Installation et Mises à jour
    Générer un paquet debian pour java d’oracle (non-free)

    Installation simplifiée et mise à jour de environnement d’exécution Java d’Oracle © sur Debian GNU/Linux et le plugin java embarqué dans les navigateurs.

    Installation de java-package

    java-package est un script permettant de générer un paquet # !Debian afin de faciliter l’installation et la mise à jour de l’Environnement d’exécution Java (JRE).

    Récupérer java-package et les outils nécessaires et les outils necessaire à la génération du paquet :

    1. apt-get install java-package build-essential java-common

    Récupérer l’archive sur le site d’Oracle ©

    Rendez vous sur le site d’Oracle© afin de télécharger les archives.

    Bien récupérer les archives en tar.gz sinon le script de génération du paquet ne fonctionnera pas !

    On peux également récupérer les archives via WGET ou CURL (Et passer outre l’acceptation de la licence...)

    Exemple de commande CURL pour récupérer java 8.77 32BIT via le terminal

    1. curl -v -j -k -L -H "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jre-8u77-linux-i586.tar.gz > jre-8u77-linux-i586.tar.gz

    Exemple de Commande WGET pour récupérer java 8.77 64BIT via le terminal

    1. wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u77-b03/jre-8u77-linux-x64.tar.gz

    Générer le paquet java JRE 8 pour votre distribution Debian

    une fois l’archive téléchargée il suffit d’exécuter le script make-jpkg sous l’identifiant utilisateur :

    1. fakeroot make-jpkg jre-8u77-linux-i586.tar.gz

    qui devrait démarrer ainsi :

    Detected Debian build architecture: i386
    Detected Debian GNU type: i586-linux-gnu

    Detected product:
       Java(TM) Runtime Environment (JRE)
       Standard Edition, Version 8 Update 77
       Oracle(TM)
    Is this correct [Y/n]: y <-

    Checking free diskspace: done.

    In the next step, the binary file will be extracted. Probably a
    license agreement will be displayed. Please read this agreement
    carefully. If you do not agree to the displayed license terms, the
    package will not be built.

    Press [Return] to continue:
    Testing extracted archive... okay.

    .

    Une fois le script terminé l’installation du nouveau paquet se fait via la commande dpkg :

    1. dpkg -i oracle-java8-jre_8u77_i386.deb

    Et voilà ! L’environnement d’exécution java et désormais opérationnel !

    source Téléchagement Java sur le site d’Oracle©.


  • [BASH] Utiliser l’API fontello.com
    générer et mettre à jour une police d’icônes webfont en quelques secondes

    Fontello propose de composer une # !webfont d’icônes sur mesure en piochant parmi plusieurs collections (Font Awesome, Web Symbols, ...) Le service est très bien fait, rapide et simple d’utilisation. Mais vous pouvez gagner encore plus de temps lors de l’ajout d’icônes supplémentaires an passant directement via l’API.

    Allons directement dans le vif du sujet en créant un fichier Makefile [1] quelque part en amont de votre projet :

    1. # Makefile
    2.  
    3. FONT_DIR ?= ./css/icons
    4. PROJECT_NAME ?= projet_foo
    5. FONTELLO_HOST ?= http://fontello.com
    6.  
    7. fontopen:
    8. @if test ! `which curl` ; then \
    9. echo 'Install curl first.' >&2 ; \
    10. exit 128 ; \
    11. fi
    12. curl --silent --show-error --fail --output .fontello \
    13. --form "config=@${FONT_DIR}/config.json" \
    14. ${FONTELLO_HOST}
    15. x-www-browser ${FONTELLO_HOST}/`cat .fontello`
    16.  
    17.  
    18. fontsave:
    19. @if test ! `which unzip` ; then \
    20. echo 'Install unzip first.' >&2 ; \
    21. exit 128 ; \
    22. fi
    23. @if test ! -e .fontello ; then \
    24. echo 'Run `make fontopen` first.' >&2 ; \
    25. exit 128 ; \
    26. fi
    27. rm -rf .fontello.src .fontello.zip
    28. curl --silent --show-error --fail --output .fontello.zip \
    29. ${FONTELLO_HOST}/`cat .fontello`/get
    30. unzip .fontello.zip -d .fontello.src
    31. rm -rf ${FONT_DIR}/*
    32. mv `find ./.fontello.src -maxdepth 3 \( -name "config.json" -o -name "*.woff" -o -name "*.ttf" -o -name "*.svg" -o -name "*.eot" \) ` ${FONT_DIR}
    33. mv `find ./.fontello.src -maxdepth 3 -name "${PROJECT_NAME}-codes.css"` ${FONT_DIR}/codes.scss
    34. rm -rf .fontello.src .fontello.zip

    Télécharger

    Passons rapidement le script en revue

    Tout d’abord, on doit éditer le script pour renseigner 2 informations :

    • FONT_DIR, qui est l’emplacement du dossier qui va recevoir les éléments issus de fontetto (.ttf, .woff. css, .css, ...), relativement au fichier Makefile. Personnellement j’ai choisi un dossier "icons" dédié à cela, et distinct des polices (webfonts) complètes qui elles sont dans un autre dossier "fonts".
    • PROJECT_NAME qui désigne le nom du projet.

    A présent, direction fontello.com où vous pouvez commencer à composer votre webfont personnalisée projet_foo. Enregistrez (bouton en haut à droite), téléchargez le .zip et récupérez le fichier config.json (qui est le seul qui nous intéresse) et copiez le dans le dossier FONT_DIR.

    À l’usage

    À partir de maintenant, l’ajout ou modification d’icônes va se faire en un clin d’oeil via 2 commandes successives, issues du fichier Makefile :

    1. make fontopen

    inspecte le fichier config.json et ouvre le navigateur avec les paramètres d’édition sauvegardés.

    1. make fontsave

    récupère la version mise à jour du projet_foo en écrasant les anciens fichiers.

    Pour ma part, c’est surtout le fichier projet_foo-codes.css avec les codes qui m’importe (voir et modifier au besoin la ligne 32) ; c’est pourquoi je renomme en codes.scss pour l’appeler ultérieurement dans la compilation SASS.


    placido

    P.-S.

    Ultime remarque, si vous constatez un problème d’affichage des icônes après une mise à jour, essayer de changer le paramètre en fin d’url dans la déclaration css font-face.

    1. @font-face {
    2. font-family: 'projet_foo';
    3. src: url('icons/projet_foo.eot?248676');
    4. /*
    5. ...
    6. */
    7. }

    Télécharger

    devenant par exemple :

    1. @font-face {
    2. font-family: 'projet_foo';
    3. src: url('icons/projet_foo.eot?1039286');
    4. /*
    5. ...
    6. */
    7. }

    Télécharger

    C’est un désagrément dû aux navigateurs, qui allouent un cache spécifique pour les webfonts.

    Notes

    [1chmod +x Makefile pour le rendre exécutable

  • Connexion SFTP avec Filezilla
    Transferts de fichiers sécurisés

    FileZilla est un client # !FTP, # !FTPS et # !SFTP distribué sous license GPL. Si votre hébergement le permet, la connexion via le protocole sftp est la méthode à privilégier. Nous allons voir comment paramétrer la connexion de manière sécurisée.

    FileZilla est un client #FTP, #FTPS et #SFTP distribué sous license GPL. Lorsque votre hébergement le permet, la connexion via le protocole sftp est la méthode à privilégiée. L’utilisation du client ftp reste identique tandis que les échanges entre votre ordinateur et le serveur sont sécurisés.

    Ajouter un nouveau compte

    Une fois le client ftp démarré, on accède aux paramètres des sites en cliquant sur fichier -> gestionnaire de sites Aller dans le gestionnaire de sites

    Une nouvelle fenêtre permettant de gérer les sites s’ouvre. Dans l’encart de gauche, un clic sur le bouton "nouveau" fait apparaître une nouvelle ligne qui permet de nommer la nouvelle connexion de façon arbitraire (NomSite dans l’exemple) Ajouter un nouveau site

    Configuration du nom d’hôte et du port

    Une fois le nouveau site ajouté, on configure l’hôte (nomdedomaine.com) puis le port : Inserer le nom d'hote et le port

    Configuration du protocole SFTP

    Sélectionner SFTP - SSH File Tranfer Protocol dans la liste des protocoles disponibles Selectionner le protocole SFTP

    Type d’authentification

    Afin d’enregistrer le nom d’utilisateur et le mot de passe de manière définitive on définit le type d’authentification à "normale" : Selectionner le type d'authentification normale

    Couple nom d’utilisateur et mot de passe

    Pour finir, on ajoute le nom d’utilisateur et son mot de passe dans les champs prévus à cet effet : Ajouter le nom d'utilisateur et le mot de passe puis cliquer sur connexion ou valider !

    Cliquer sur connexion afin de se connecter au serveur. Lors de la première connexion le message suivant apparaît : Valider l'échange de clef avec le serveur Lorsqu’on se connecte pour la première fois à un serveur ssh/sftp, il est nécessaire d’avoir un échange de clefs entre le client et le serveur. Ce message est normal lors de la première connexion. Ainsi, les fois suivantes, on est certain de se connecter toujours sur le même serveur.

    Voilà, si vous n’arrivez pas à vous connecter, Pensez à bien vérifier le port, le nom d’hôte et les identifiants.


  • LXC root password
    Chrooter un container pour réinitialiser le mot de passe root

    Pour changer le mot de passe sans avoir à se connecter au container LXC, Il faut “chrooter” son système de fichier (chroot est disponible dans les paquets coreutils de Debian) .

    “Chrooter” le système de fichier du container LXC “NomContainer” :

    1. root@pierrox-laptop:# chroot /var/lib/lxc/NomContainer/rootfs

    Générer un nouveau mot de passe root pour le container LXC :

    1. root@pierrox-laptop:# passwd
    2. Enter new UNIX password:
    3. Retype new UNIX password:
    4. passwd: password updated successfully

    Télécharger

    Quitter l’environement "chrooté" :

    1. root@pierrox-laptop:# exit

    Attention, si vous utilisez un shell différent de bash tel que zsh, il se peut que vous vous trouviez confronté à cette erreur : « chroot : impossible d’exécuter la commande « /bin/zsh » : Aucun fichier ou dossier de ce type ».

    dans ce cas :

    1. root@pierrox-laptop:# /usr/sbin/chroot /var/lib/NomContainer/rootfs /bin/bash

    devrait permettre de chrooter le container lxc.


  • LXC Debian Jessie
    Virtualisation facile !

    Installer et configurer LXC sur Debian Jessie en trois coups de cuiller à pot

    Installation de LXC

    1. apt-get install lxc lxctl

    Création d’un container

    1. lxc-create -n NomContainer -t debian

     -n nom du container
     -t template de l’OS à utiliser

    Bien noter le mot de passe root qui s’affichera à la fin de la création du container lxc.

    Configuration du réseau sur l’hôte

    Il y a plusieurs façons de configurer le réseau, pour ma part je préfère créer un (ou plusieurs) sous-réseaux pour mes containers qui seront "natter" par la machine hôte. Pour illustrer, on pourrait dire que les sous-réseaux sont cloisonnés à l’intérieur de l’hôte qui fera office de pare-feu vers l’extérieur.

    Autoriser "l’ip forwarding"

    1. nano /etc/sysctl.conf
    2. net.ipv4.ip_forward=1

    Télécharger

    Recharger la configuration du système pour prendre en compte la modification.

    1. sysctl -p

    Configurer l’interface qui servira de bridge

    La paquet bridge-utils est nécessaire, il est normalement installé en dépendance de lxc, au cas ou :

    1. apt-get install bridge-utils

    Paramétrage de /etc/network/interfaces

    Activer le partage de connexion internet pour les containers LXC :

    On va donner l’accès internet aux containers LXC à travers wlan0 (On verra comment automatiser ça sur un hôte au profil itinérant qui se connecte sur des interfaces diverses et variées : wlan0 eth0 usb0... )

    1. iptables -t nat -F POSTROUTING
    2. iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

    Télécharger

    Configuration du réseau sur les containers LXC

    Attention ! il ne s’agit pas de paramétrer le réseau à l’intérieur du container mais d’éditer un fichier de configuration qui se chargera de configurer le réseau au démarrage de celui-ci.

    Par défaut, Debian installe les nouveaux containers dans /var/lib/lxc ; ce dossier contient tous les containers créés, qui eux-même contiennent des fichiers de logs, de configs et le dossier rootfs qui comme son nom l’indique, correspond à la racine du système virtualisé ( / ).

    Afin de configurer le réseau sur notre container LXC, nous allons éditer son fichier de config /var/lib/lxc/NomContainer Extrait de la configuration réseau d’un container /var/lib/lxc/NomContainer/config

    1. lxc.network.type = veth
    2. lxc.network.name = veth0
    3. lxc.network.flags = up
    4. lxc.network.link = br0
    5. lxc.network.veth.pair = veth0
    6. lxc.network.ipv4 = 192.168.100.1/24
    7. lxc.network.ipv4.gateway = 192.168.100.254

    Télécharger

    Démarrage du container et test du réseau

    1. lxc-start -n NomContainer -d


     -n nom du container
     -d en mode daemon

    La commande pour contrôler si notre container LXC est bien démarré :

    1. lxc-ls -f

    Devrait retourner

    1. NAME STATE IPV4 IPV6 AUTOSTART
    2. ---------------------------------------------------------
    3. NomContainer RUNNING 192.168.100.1 - NO

    Télécharger

    Sur l’hôte un petit ping 192.168.100.1 devrait retourner :

    1. PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
    2. 64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.087 ms

    Télécharger

    On va se connecter directement au container LXC

    1. lxc-console -n NomContainer

    Se connecter au container, j’espère que vous avez bien noté le mot de passe root lors de sa création sinon vous pouvez toujours consulter l’article dédié au changement de mot de passe root d’un container LXC. Une fois connecté, on va tester l’accès internet en utilisant apt pour installer ping afin de "pinguer" la machine hôte :

    1. root@NomContainer:~#apt-get install inetutils-ping
    2. Les NOUVEAUX paquets suivants seront installés :
    3. inetutils-ping
    4. (...)
    5. Paramétrage de inetutils-ping (2:1.9.2.39.3a460-3) ..
    6. root@NomContainer:~#ping 192.168.100.254
    7. PING 192.168.100.254 (192.168.100.254): 56 data bytes
    8. 64 bytes from 192.168.100.254: icmp_seq=0 ttl=64 time=0,163 ms
    9. 64 bytes from 192.168.100.254: icmp_seq=1 ttl=64 time=0,163 ms

    Télécharger

    Et voilà, Juste ça marche !


    Pierrox

    P.-S.

    Pour quitter un container, utilisez la combinaison de touche ctrl+a puis q

  • [SPIP] Redirection http
    Exemple de redirection 301 par entête http via le pipeline affichage_entetes_final

    Utilisation du pipeline affichage_entetes_final sur SPIP pour faire des redirections HTTP 301,404. Dans l’exemple suivant, lorsqu’un utilisateur tente d’afficher la page d’inscription, on le redirige sur sa page personnelle.

    Au sein d’un plugin

    Dans le cadre de la création d’un plugin, après avoir déclaré le pipeline dans paquet.xml

    1. function prefixPlugin_affichage_entetes_final($entetes){
    2. # Rediriger un auteur authentifié vers sa page perso lorsque il demande à afficher la page inscription
    3. if ( isset($GLOBALS['auteur_session']['id_auteur'])
    4. AND (_request('page') === "inscription") ) {
    5. $entetes["status"]= "301 Moved Permanently";
    6. $entetes["Location"]= generer_url_entite($GLOBALS['auteur_session']['id_auteur'],"auteur");
    7. }
    8. return $entetes;
    9. }

    Télécharger

    Dans le dossier de personnalisation

    Dans le dossier squelette habituel, il faut ajouter au fichier mes_fonctions.php une fonction que l’on peut nommer par exemple "redirections_persos".

    1. # squelettes/mes_fonctions.php
    2. function redirections_persos($entetes){
    3. # Rediriger un auteur authentifié vers sa page perso lorsque il demande à afficher la page inscription
    4. if ( isset($GLOBALS['auteur_session']['id_auteur'])
    5. AND (_request('page') === "inscription") ) {
    6. $entetes["status"]= "301 Moved Permanently";
    7. $entetes["Location"]= generer_url_entite($GLOBALS['auteur_session']['id_auteur'],"auteur");
    8. }
    9. return $entetes;
    10. }

    Télécharger

    Puis dans config/mes_options.php on lie notre fonction au pipeline affichage_entetes_final

    1. # config/mes_options.php
    2. $GLOBALS['spip_pipeline']['affichage_entetes_final'] .= "|redirections_persos";

    Télécharger


  • [SPIP] Mettre en exergue une partie d’un titre
    Astuce pour scinder un titre et styliser son affichage

    On est parfois confronté au souhait d’afficher une version raccourcie d’un #TITRE d’article ; typiquement dans un menu de navigation latéral où l’espace est précieux, ou bien si l’on souhaite mettre en exergue une partie seulement du titre (les n premiers mots).

    Prenons l’exemple trivial d’un #TITRE un peu long :

    La buvette des joyeux pétanqueurs reprend du service à la fin du mois de juin.

    Comment faire pour gérer toute la longueur du titre dans une mise en page où la titraille est imposante ?

    Il existe le fameux filtre |couper qui s’avère souvent très efficace, quoiqu’il peut opérer une césure malvenue, et que l’on perd une partie de l’information. D’aucun serait tenté de jouer entre les valeurs des champs #TITRE, #SURTITRE (voire #SOUSTITRE) ; par exemple, ces derniers étant une version étendue du premier. Il s’agit, je pense, d’une mauvaise solution qui implique une certaine redondance d’information, sans compter un usage fastidieux.

    Et donc l’astuce je vous la donne. En insérant un espace insécable &#32; au bon endroit :

    La buvette&#32;des joyeux pétanqueurs reprend du service à la fin du mois de juin.

    Combiner à cela, un petit filtre maison à mettre dans son fichier mes_fonctions.php

    1. function scinder($texte){
    2. $txt = explode("&#32;", $texte);
    3. if (is_array($txt) AND isset($txt[1]))
    4. $texte = "<strong>".$txt[0]."</strong><span> ".$txt[1]."</span>";
    5. return $texte;
    6. }

    Télécharger

    On obtient un titre dont la première partie est contenue dans un <strong>, et la suite dans un <span>. Dès lors on peut faire ce que l’on veut avec du CSS, sans trop de vérification de conditions ni de variantes de squelette.

    1. h2{}
    2. h2 strong {color: #954141;font-size: 3em}
    3. h2 span {color:#437788;font-size: 1em}

    Télécharger

    Libre à vous d’inclure le code où vous le souhaitez dans votre squelette, au cas par cas :

    [<h2>(#TITRE|scinder)</h2>]

    Enfin, si vous souhaitez l’appliquer à toutes les balises #TITRE de manière automatique, vous pouvez définir une règle sur la table des traitements dans mes_options.php :

    $GLOBALS['table_des_traitements']['TITRE'][]= 'scinder(%s)';

  • [SPIP] Ajouter des statuts de publication sur un objet
    Description des tables d’un objet

    Comment ajouter un statut de publication personnalisé à un objet spip ?

    L’avantage de bien décrire une table d’objet spip et de bénéficier des mécanismes de publication sans avoir à retoucher les boucles et les fonctions "d’institution".

    Dans l’exemple ci-dessous on va créer un statut supplémentaire ’a_completer’ afin de pouvoir mettre en ligne un objet éditorial dont la rédaction serait incomplète.

    Ajouter un statut ’a_completer’ considéré comme publiable.

    1. //(...)
    2. 'statut_textes_instituer' => array(
    3. 'prepa' => 'texte_statut_en_cours_redaction',
    4. 'prop' => 'texte_statut_propose_evaluation',
    5. 'publie' => 'texte_statut_publie',
    6. 'refuse' => 'texte_statut_refuse',
    7. 'poubelle' => 'texte_statut_poubelle',
    8. 'a_completer' => 'texte_statut_publiable_mais_a_completer',
    9. ),
    10. 'statut'=> array(
    11. 'champ' => 'statut',
    12. 'publie' => 'publie,a_completer',
    13. 'previsu' => 'publie,prop,prepa,a_completer',
    14. 'post_date' => 'date',
    15. 'exception' => array('statut','tout')
    16. )
    17. ),
    18. //(...)
    19. )

    Télécharger

    Inutile de se soucier des critères de boucles et de passer par l’édition de squelettes !


  • [SPIP] Supprimer la prévisualisation d’un message forum
    Désactiver la prévisu message forum à l’aide du pipeline formulaire_verifier

    Il est souvent pénible de devoir surcharger tout le formulaire forum de spip pour désactiver seulement la prévisualisation. Je vais présenter une astuce simple et rapide à mettre en place sans avoir besoin de toucher au squelette ni surcharger quoi que ce soit.

    Supprimer la prévisualisation sur SPIP 3.0

    Dans le cadre d’un plugin, on déclare les pipelines dans un fichier paquet.xml.

    Pour un squelette spip classique, il faut déclarer les pipelines dans mes_options.php et "appeler" la fonction dans mes_fonctions.php

    1. //mes_options.php
    2. $GLOBALS['spip_pipeline']['formulaire_verifier'] .= "|supprimer_previsu";

    Télécharger

    1. //mes_fonctions.php
    2. function supprimer_previsu($flux){
    3. if($flux['args']['form'] === 'forum')
    4. unset($flux['data']['previsu']);
    5. return $flux;
    6. }

    Télécharger

    A noter qu’il existe également un plugin tout prêt disponible sur les dépots de spip contrib.

    Supprimer la prévisualisation sur SPIP 3.1 et supérieur

    On se contentera de $GLOBALS["meta"]["forums_forcer_previsu"]=="non"; dans mes_options.php pour un résultat similaire.

    Voilà

    *** Pensez à vider les caches ***

    Et voilà, les messages postés dans les formulaires forum ne passeront plus par l’étape de prévisualisation !