billets

Quelques articles qui décortiquent certains points techniques en administration de système GNU/Linux, de configuration d’hébergements et autres astuces de webdesign.

Il y a 31 articles
  • Stretch de base !

    Comment installer un serveur http sur Debian 9 avec une base de données MySQL et son interface phpmyadmin en 30 secondes :<

    1. apt install apache2 php7.0  logrotate mariadb-server phpmyadmin

    A l’installation de phpmyadmin laisser le champ vide pour configurer automatiquement les identifiants de connexion à la base de données.

    [x] Cocher redémarrer apache2 pour prendre en compte la configuration ;

    Puis ajouter "root" en superadmin de phpmyadmin

    1. mysql -uroot mysql -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MonPassRootIci');  update user set plugin='' where user='root'; flush privileges;"

    Se connecter sur http://localhost/phpmyadmin


  • Ne divulguer les adresses mails dans l’espace privé qu’aux seuls webmestres

    Pour certains, l’email est une donnée privée qui peut déjà révéler certaines informations sur son propriétaire.

    Ainsi, nombreux sont les administrateurs de sites SPIP soucieux de pouvoir préserver la confidentialité des auteurs dans l’espace privé, en ne divulgant leur adresse email qu’aux seuls webmestres.

    Pour passer outre une fastidiese surcharge des squelettes du privé, j’avais proposé une solution sur le forum, et je la retranscris ici, pour qu’elle gagne en visibilité :

    Déclarer un traitement automatique sur le champ #EMAIL :

    1. # ./config/mes_options.php
    2.  
    3. $GLOBALS['table_des_traitements']['EMAIL']['auteurs'] = 'camoufler_email(%s, $Pile[1]["id_auteur"])';

    Télécharger

    Déclarer les autorisations :

    1. #./squelettes/mes_fonctions.php
    2.  
    3. // voir une fiche auteur : être admin ou bien il s'agit de sa propre fiche
    4. function autoriser_auteur_voir($faire, $type, $id, $qui, $opt) {       
    5.         if (
    6.                 ($qui['statut'] == '0minirezo')
    7.                 or ($qui['id_auteur'] == $id)
    8.         ) {
    9.                 return true;
    10.         }
    11.         else return false;
    12. }
    13.  
    14. // masquer un email si on est pas autorisé
    15. function camoufler_email($email,$id) {
    16.         include_spip('inc/autoriser');
    17.         // on camoufle sauf autorisation
    18.         if (!autoriser('voir','auteur', $id)) {
    19.                 $email = spip_substr($email,0,3) . "*****";
    20.         }
    21.     return $email;
    22. }

    Télécharger

    Pour passer outre ce traitement automatique, on pourra toujours utiliser la syntaxe #EMAIL* dans son squelette si besoin.

    source http://forum.spip.net/fr_174451.htm...


  • Utiliser @extend SCSS en référence à un fichier distant

    Récemment, j’ai eu besoin d’incorporer le contenu d’un fichier distant à l’intérieur d’un squelette de feuille de style. En l’occurence, il s’agissait de récupérer un fichier CSS dans sa dernière version (fréquemment mise à jour) et d’étendre certaines règles CSS via des directives @extend de SCSS à d’autres élémenst de mon choix.

    Pour complexifier encore la chose, le document source question débute par un BOM [1] qui faisait planter le compilateur SCSSphp.

    Mais à SPIP vaillant, rien d’impossible, sans quitter le squelette, en 2 lignes de code s’il vous plait :

    1. [(#HTTP_HEADER{Content-type:text/css[; charset=(#CHARSET)]})]
    2.  
    3. [(#VAL{url_abs_to_css}|recuperer_url{#ARRAY{transcoder,true}}|table_valeur{page}|texte_script)]
    4.  
    5. .formulaire_spip {
    6.  @extend .form--fancy;
    7. }
    8. /* etc  ... */
    9. #FILTRE{scss_compile}

    Télécharger


  • Connexion en carton mousse

    Envoyer des fichier volumineux au travers d’une petite connexion internet peu s’avérer compliqué. Cet article liste les quelques outils nécessaires et les commandes utiles à l’accomplissement de cette tâche.

    Xz - Compresser un fichier

    Xz est un outil de compression très performant. Pour compresser un gros fichier avec le taux de compression maximal on utilise simplement :

    xz -9 gros_fichier

    Le fichier de sortie sera nommé gros_fichier.xz

    Split - Découper un fichier en plusieurs fichiers de taille définie

    Découper le fichier en plusieurs fragments de 1GB (-b bytes) et ajouter un suffixe numérique aux fichiers de sortie (-d )

    split -b 1024M  -d gros_fichier.xz  gros_fichier.xz_part
    donnera :

    gros_fichier.xz_part01
    gros_fichier.xz_part02
    gros_fichier.xz_part03
    ...

    Combiner tar + xz-utils + split

    A titre d’exemple, le même résultat que précédement, en utilisant conjointement tar et split :

    tar -Jcvf - un_repertoire_ou_fichier | split -d -b 1024MB - gros_fichier.tar.xz.

    Tmux - Envoyer les fichiers en tâche de fond

    Pour envoyer les fichiers vers un serveur, j’utilise scp avec une clef ssh et comme je ne veux pas saturer la connexion j’utilise l’option -l (limit). Dans l’exemple ci-dessous, -l 512 correspond à environ 50ko/s.

    scp -i ~/.ssh/ma_clef  -l 512 gros_fichier.xz_part* user@host:/home/bob/incoming

    C’est bien joli, mais si je fais des transferts à distance, j’aimerais bien lancer la commande en tâche de fond, surtout si l’upload est très long.
    Pour ce faire, j’utilise tmux qui permet d’utiliser plusieurs terminaux virtuel que l’on peu détacher ou rattacher au terminal facilement.

    tmux new-session -d -s upload  'scp -i ~/.ssh/ma_clef  -l 512 gros_fichier.xz_part* user@host:/home/bob/incoming 2> errors.log'

    Rattacher le terminal pour voir l’upload en cours : tmux attach
    Détacher le terminal avec la combinaison de touches ctrl + b puis d
    Grâce à tmux, je peux me déconnecter du shell distant et revenir plus tard...
    Un simple tmux a me permettra de consulter l’état d’avancement de l’upload.

    Cat - Réassembler les fichiers découpés

    Une fois les fichiers transférés, je les réassemble avec un simple cat

    cat gros_fichier.xz_part*   >  gros_fichier.xz

    Décompression d’un xz ou d’un tar.xz

    Avec tar (-x xtract) :
    tar -Jxvf gros_fichier.tar.xz

    Avec xz-utils (-d)
    xz -d gros_fichier.xz

    Voilà.


  • 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 à 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©.


  • 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

  • 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.


  • 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.


  • 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

    Redémarrer le service réseau afin de prendre en compte la nouvelle interface br0

    1. service networking restart

    Vérifier que l’interface réseau est bien présente :
    ifconfig devrait renvoyer quelque chose comme ça

    1. br0       Link encap:Ethernet  HWaddr 22:ce:06:00:1d:7f  
    2.           inet adr:192.168.100.254  Bcast:192.168.100.255  Masque:255.255.255.0
    3.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    4.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    5.           TX packets:24 errors:0 dropped:0 overruns:0 carrier:0
    6.           collisions:0 lg file transmission:0
    7.           RX bytes:0 (0.0 B)  TX bytes:3915 (3.8 KiB)

    Télécharger

    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

  • 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


  • 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)';

  • 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.                 array(
    12.                     'champ'     => 'statut',
    13.                     'publie'    => 'publie,a_completer',
    14.                     'previsu'   => 'publie,prop,prepa,a_completer',
    15.                     'post_date' => 'date',
    16.                     'exception' => array('statut','tout')
    17.                 )
    18.             ),
    19. //(...)
    20. )

    Télécharger

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


  • 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 !


  • Lire directement les vidéos youtube (& cie) dans VLC

    S’affranchir efficacement de flash pour lire les vidéos directement dans VLC

    Vous le savez comme moi, flash c’est le mal. Et voici LA solution qui vous fera franchir le pas d’un bannissement (espérons permanent) du vil greffon sans pour autant faire une croix sur les vidéos des plateformes d’hébergement (youtube, dailymotion, vimeo, etc).

    Cela consiste en l’emploi coordonné de deux scripts qui vont vous permettre de lire directement une vidéo distante dans votre lecteur habituel (VLC, mplayer ou autre).

    1) Installation de youtube-dl

    Sous GNU-Linux, la méthode que je trouve la plus simple est de passer par le gestionnaire d’environnement python pip.

    1. sudo apt-get install python-pip
    2. sudo pip install youtube-dl

    Veillez à mettre à jour l’application de temps en temps, car les plugins de gestion par plateforme sont nombreux et les modifications fréquentes.

    1. sudo pip install -U youtube-dl

    2) Lancement illico grâce à vlcopen.sh

    youtude-dl est un super logiciel, efficace dans bien des situations, mais son utilisation en ligne de commande s’avère à la longue un peu rédhibitoire pour une utilisation en tant que simple utilisateur.

    D’où le recours à un second script, mis à disposition par swarminglogic,qui va apporter un peu de souplesse d’utilisation et ouvrir la vidéo encore plus vite que si vous y aviez accédée directement depuis la page youtube, grâce à un raccourci clavier.

    1. #!/bin/bash
    2.  
    3. if [ $# -eq 1 ] ; then
    4.     path=$1
    5. else
    6.     clipboard=$(xclip -selection clipboard -o)
    7.     if [ $(<<<$clipboard grep -P "^http") ] ; then
    8.         path=$clipboard
    9.     else
    10.         if [ -t 1 ] ; then
    11.             echo "Bad clipboard path: $clipboard" >&2
    12.         else
    13.             notify-send "Bad clipboard path: $clipboard"
    14.         fi
    15.         exit 1
    16.     fi
    17. fi
    18.  
    19. #$1 processid, $2 tempdir $3 logfile
    20. function cleanup {
    21.     echo "-------------------------------------------"
    22.     echo "Cleaning up"
    23.     kill -9 $1 &> /dev/null
    24.     if [ -n "$2" ] ; then rm $2/* ; fi
    25.     if [ -n "$2" ] ; then rmdir $2 ; fi
    26.     if [ -n "$3" ] ; then rm $3 ; fi
    27. }
    28.  
    29.  
    30. echo "Opening $path"
    31. tmpvlcopen=/tmp/vlcopen/
    32. [ ! -d $tmpvlcopen ] && mkdir $tmpvlcopen
    33. tmpdir=$(mktemp -d --tmpdir=$tmpvlcopen)
    34.  
    35. # If the tmpdir path doesn't include "/tmp/vlcopen" something went bad!
    36. if [ "${tmpdir/$tmpvlcopen}" = "$tmpdir" ] ; then
    37.     echo "Aborting: failed to create proper temporary directories" >&2
    38.     exit 1
    39. fi
    40.  
    41. cd $tmpdir
    42. echo "Temporary directory: $tmpdir"
    43. echo "Getting video: $path"
    44. downloadlog=$(tempfile)
    45. (youtube-dl --restrict-filenames --no-part "$path" &> $downloadlog)&
    46. processId=$!
    47. echo "ProcessID: $processId"
    48. echo "Waiting for file creation"
    49.  
    50. count=0
    51. while [ $(ls -1 | wc -l) -eq 0 ] ; do
    52.     # check if process is done.
    53.     if ! kill -0 $processId &>/dev/null ; then
    54.         if [ -t 1 ] ; then
    55.             echo "-------------------------------------------">&2
    56.             echo "Error: youtube-dl finished without output." >&2
    57.             echo "Error: Bad URL?" >&2
    58.             echo "---------------- Download Log -------------">&2
    59.             cat $downloadlog >&2
    60.         else
    61.             notify-send "Bad URL: $path $(cat $downloadlog)"
    62.         fi
    63.         cleanup $processId "$tmpdir" "$downloadlog"
    64.         exit 0
    65.     fi
    66.     sleep 0.5
    67.     ((count++))
    68.     if [ $count -eq 20 ] ; then
    69.         if [ -t 1 ] ; then
    70.             echo "Timed out" >&2
    71.         else
    72.             notify-send "Timed out"
    73.         fi
    74.         exit 0
    75.     fi
    76. done
    77.  
    78. sleep 0.1
    79. echo "Opening file: $(ls -1 | head -n 1)"
    80. vlc "$(ls -1 | head -n 1)" &>/dev/null
    81. cleanup $processId "$tmpdir" "$downloadlog"

    Télécharger

    Ce script se comporte comme une capsule pour youtube-dl. Il va analyser le contenu du presse-papier, et s’il détecte une url prise en charge, va créer un répertoire temporaire, y télécharger la vidéo, l’ouvrir avec VLC après quelques instants et supprimer automatiquement tous les fichiers temporaires à la fermeture.

    Il suffit d’enregistrer le script (sous le nom vlcopen.sh par exemple) dans un répertoire inclus dans votre $PATH, le rendre exécutable (chmod +x vlcopen.sh) et d’associer un raccourci clavier à son exécution.

    Typiquement sous openbox, j’ai rajouté une section comme suit à mon rc.xml.

    1. <keybind key="W-y">
    2.   <action name="Execute">
    3.     <startupnotify>
    4.       <enabled>true</enabled>
    5.       <name>vlcopen</name>
    6.     </startupnotify>
    7.     <command>vlcopen.sh</command>
    8.   </action>
    9. </keybind>

    Dès lors, dans les faits, lorsque je veux regarder une vidéo, je fais un clic-droit > copier l’url de la page soit sur la page courante, soit sur le lien à analyser, puis super + y (oui j’ai choisi y pour "youtube" mais à vous d’adapter au besoin), et voilà !

    Seul bémol, si la vidéo est longue et que vous êtes impatient, vous ne pourrez pas avancer directement la lecture à un point qui n’a pas encore été téléchargé.

    source github.com/swarminglogic