Catégorie « Quelques trucs sur… »

Quelques trucs sur UNIX/Linux #4

Crontab et 49-3

Crontab : changer l’adresse e-mail de destination

Il est possible de spécifier l’utilisateur destinataire des mails de la crontab en définissant la variable MAILTO en début de fichier.

Remplacement de l’adresse par défaut :

MAILTO=webmaster@mon-site.fake

Désactivation de l’envoir de mail :

MAILTO=""

(source)

Crontab : redirection de la sortie dans un fichier

Par défaut cron envoie par mail l’ensemble des sorties (standard et erreur) des tâches exécutées. Il peut être intéressant d’écrire tout ça dans des fichiers de logs à la place.

Pour ce faire il suffit d’utiliser les mécanismes de redirections de sorties habituellement disponibles dans les terminaux en terminant la ligne par > /path/to/log/file 2>&1. La première partie (> /path/to/log/file) déclenche la redirection de la sortie standard, la seconde partie (2>&1) effectue la redirection de la sortie d’erreur dans la sortie standard.

Exemples :

# Redirection de la sortie standard dans le fichier /path/cron.log et envoi par e-mail de la sortie d'erreur
* * * * * /path/to/script > /path/cron.log

# Redirection des sorties standard et erreur dans le fichier /path/cron.log
* * * * * /path/to/script > /path/cron.log 2>&1

(source)

Rejouer la dernière commande en ajoutant sudo

Il m’arrive de temps en temps de lancer une commande nécessitant les droits root en oubliant de la précéder par sudo. Il est possible de rappeler la dernière commande l’historique mais la syntaxe est un poil longue et compliquée.

La solution que j’ai retenue est donc d’ajouter un alias dans mon fichier .bash_aliases :

# 49.3
alias 49.3='sudo "$BASH" -c "$(history -p !!)"'

Le nom 49.3 est court et facile à retenir puisqu’il fait directement référence à l’article 49 alinéa 3 de la constitution française dont le principe est somme toute assez proche ^^


Quelques trucs sur Jekyll #1

Histoire de pas spammer avec trop d’articles je vais reprendre mon habitude de faire des tirs groupés pour les petites astuces, remarques et autres ^^

Publication avec les bonnes URL dans les métas SEO

Une petite subtilité que je n’avais pas remarquée tout de suite : les URL générées dans les métas SEO sont des URL absolues et dans les pages générées par le mode serveur dédié au dev (via bundle exec jekyll serve) commencent par l’IP locale et non le domaine spécifié dans le _config.yml (c’est pas illogique mais comme ça ne touche que des métas SEO, ça ne saute pas aux yeux).

J’ai rapidement trouvé dans la doc qu’il faut utiliser jekyll build pour générer en mode production. Plus précisément jekyll build --destination _deploy qui génère les pages dans un autre dossier histoire que les deux ne se marchent pas sur les pieds.

En y repensant c’est effectivement plus propre de travailler comme ça avec une commande dédiée à la génération pour la prod et un dossier séparé, ça évite de déployer par erreur des brouillons par exemple.

Brouillons et gestion des dates

Jekyll gère les brouillons en les plaçant dans un dossier à part et en ajoutant une option à la génération si on veut les inclure (cf la documentation).

Tout ça fonctionne très bien à une exception près : la doc dit que la date de l’article sera la date de dernière modification du fichier. Jusque là pourquoi pas, ça se tient assez bien. Mais elle ne précise pas plusieurs subtilités :

  • d’une part ça ne fonctionne que pour le fichier Markdown et pas pour les HTML (là, l’article n’est apparemment pas visible sans date)
  • d’autre part il ne s’agit que d’une valeur par défaut dans le cas où la date n’est pas présente dans l’en-tête de l’article
  • enfin, si la date spécifiée est dans le futur, l’article ne sera pas visible, même pour un brouillon (donc on ne peut pas planifier une date à l’avance)

Dans l’ensemble c’est assez bancal comme fonctionnement je trouve, mais une fois qu’on sais comme ça marche, on s’en sort.


Quelques trucs sur PHPMyAdmin #1

Durée de la session

C'est toujours lourd d'avoir une session qui expire et de devoir se reconnecter. Pour augmenter la durée de la session, rendez-vous dans le fichier config.inc.php situé à la racine du site et modifiez la valeur de la clé 'LoginCookieValidity' du tableau $cfg :

$cfg['LoginCookieValidity'] = 3600 * 48; // 48 hours

Évidemment, c'est à éviter sur les serveurs en production, pour des raisons de sécurité mais sur un poste de développement c'est tout à fait approprié.

Si ça ne passe pas c'est que la valeur de session.gc_maxlifetime est trop restrictive dans le php.ini. Ceci peut être changé là bas ou bien directement via ini_set() dans le fichier de configuration de PHPMyAdmin si votre configuration serveur l'autorise.

Pagination des tables

Un projet Change comporte en facilement plus de 200 à 300 tables (selon le nombre de modules utilisés) du coup, ça active la pagination de la liste. Pour augmenter le nombre d'éléments par page et éviter ce problème, rendez-vous dans le fichier config.inc.php situé à la racine du site ajoutez l'entrée suivante :

$cfg['MaxTableList'] = 500;

Défilement des colonnes

Toujours dans Change, les tables comportent un assez grand nombre de champs puisqu'on a toujours au moins la 15aine de champs standards des documents qui se retrouvent devant... Du coup quand on défile pour voir les champs utiles, on perd les menus, notamment le bouton "actualiser", ce qui oblige à défiler en sens inverse (puisque PHPMyAdmin a la mauvaise idée d'être basé sur des frames, faire juste un F5 n'est pas forcément toujours une bonne idée).

Du coup je me suis ajouté les styles suivants via Stylish sur Firefox qui place le défilement horizontal sur le tableau plutôt que sur la page complète (en remplaçant évidemment l'URL du site) :

@namespace url(http://www.w3.org/1999/xhtml);
@-moz-document url-prefix("<URL_DU_SITE>") {
  .data {
    overflow-x: auto !important;
    overflow-y: hidden !important;
    max-width: 100% !important;
  }
}

Quelques trucs sur Firefox #1

Activer la correction orthographique sur les champs textes mono-ligne

Par défaut Firefox n'active la correction orthographique sur les champs texte multi-lignes. Il est possible également de l'activer sur les champs mono-ligne simplement par configuration (pas besoin d'extension pour ça).

La manip' est la suivante :

  1. dans la barre d'URL, taper about:config pour accéder aux variables de configuration de Firefox
  2. lire l'avertissement si vous ne l'avez pas déjà fait et cliquer sur "Je ferai attention, promis !"
  3. dans le champ de recherche, taper layout.spellcheckDefault
  4. double-cliquer sur la ligne dont le nom est layout.spellcheckDefault

Les autres valeurs possibles sont :

  • 0 : aucune correction
  • 1 : champs multi-lignes seulement
  • 2 : champs multi et mono lignes

(source)

Firefox 13 : changer la page de l'ouverture d'un nouvel onglet

Firefox 13 arrive avec par défaut dans les nouveaux onglet un diaporama des sites que vous consultez le plus souvent. Si je peux concevoir que ça puisse servir à certaines personnes, en ce qui me concerne ce n'est pas le cas.

En effet, les sites que je consulte souvent, soit j'ai un signet pour y accéder tout aussi vite, soit ils arrivent en première suggestion en tapant une à trois des premières lettres dans la barre d'URL... Pas besoin d'un gros visuel pour ça.

Autre point : moi qui utilise beaucoup l'historique de navigation sur les onglets, pour revenir à l'accueil des sites que je consulte souvent (que j'ouvre en général dans des onglets dédiés), ça ne m'arrange pas du tout que la première entrée de cet historique soit squattée par une liste de miniatures inutiles plutôt que la page par laquelle je suis arrivé sur le site.

L'avantage de Firefox par rapport à d'autres logiciels c'est qu'assez souvent quand ils ajoutent une fonctionnalité à la con copiant Chrome, c'est qu'on peut la désactiver pour peu de savoir quelle clé de configuration changer. Celle-ci n'échappe heureusement pas à la règle :)

La manip à faire est donc similaire à celle du point précédent :

  1. dans la barre d'URL, taper about:config pour accéder aux variables de configuration de Firefox
  2. lire l'avertissement si vous ne l'avez pas déjà fait et cliquer sur "Je ferai attention, promis !"
  3. dans le champ de recherche, taper newtab
  4. double-cliquer sur la ligne dont le nom est browser.newtab.url et renseignez l'URL que vous voulez accéder via vos nouveaux onglets, ou about:blank si comme moi vous préférez une page vide qui ne polluera pas l'historique

Notons que si d'aventure vous souhaitez accéder à cette page il suffira de taper about:newtab dans la barre d'URL (que vous pouvez également mettre dans un signet si le cœur vous en dit).

(source)

Firefox 13 : désactiver les mises à jour silencieuses

Firefox 13 fait décidément beaucoup de choses qui ne me plaisent pas directement importées de Chrome. En l'occurrence je parle ici de la nouvelle option de mises à jour "silencieuses" automatiques du navigateur.

En soi je peux concevoir qu'on ait envie de l'activer pour ne plus avoir à s'en préoccuper mais personnellement je préfère choisir de valider volontairement une opération qui peut rendre mes extensions inutilisables ou casser le rendu de certains sites. Et surtout je préfère choisir moi-même le moment : en général pas lorsque je suis en train de faire un truc urgent ou quand je suis énervé pour une quelconque raison.

D'autant plus qu'à l'époque où Firefox suivait un cycle de release plus standard, on ne se posait vraiment de questions que pour les mises à jour majeures, les autres n'étant que des correctifs, le risque était faible. Maintenant toute mise à jour peut contenir des modifications majeures (ou pas la plupart du temps mais rien ne les différencie a priori), donc il est exclus pour moi d'activer des mises à jour automatiques sans validation de ma part sur une application aussi cruciale que mon navigateur.

Le hic c'est que cette nouveauté est semble activée par défaut lors du passage à Firefox 13 (en tous cas je ne me souviens pas avoir eu de dialogue qui me pose la question et hier quand j'ai appris son existence, j'ai constaté qu'elle était activée).

Heureusement elle reste désactivable facilement (même pas besoin de passer par about:config cette fois... quoique vu comme elle est loin dans les menus ça aurait peut-être été plus rapide :euh: ) :

  1. aller dans le menu Outils > Options...
  2. sélectionner l'onglet "Avancé" (le dernier en principe) puis le sous-onglet "Mise à jour
  3. choisissez la seconde option "Vérifier l'existence de mises à jour mais me laisser décider de leur installation

(source)


Quelques trucs sur UNIX/Linux #3

Supprimer un grand nombre de fichiers

Quand on a un très grand nombre de fichiers dans un dossier, un simple rm xxx* ne fonctionne pas forcément. J'ai eu le cas notamment avec des sessions PHP qui ne s'effaçaient pas correctement et qui du coup s'accumulaient en masse.

Une solution qui fonctionne est de passer par find :

find . -name 'sess_*' | xargs rm

(source)

Supprimer les .svn d'un répertoire

SVN place un dossier .svn dans chaque dossier d'un projet (contrairement à GIT qui se contente d'un unique dossier .git à la racine).

Pour supprimer l'ensemble des fichiers .svn d'une arborescence, on peut passer par cette commande qui utilise encore une fois find :

find -type d -a \( -iregex ".*/.svn" \) -exec rm -rf {} \;

Exclure des dossiers d'un grep

Pour exclure des dossiers d'un grep, on utilise l'option --exclude-dir. Par exemple pour exclure le dossier .git lors d'une recherche dans des fichiers :

rgrep 'toto' modules/ framework/ --exclude-dir=.git

Du coup pour mes recherches dans le code de Change, je me suis fait cet alias dans mon .bashrc :

alias crep='rgrep --exclude-dir=.git'

On peut également passer par l'option --exclude.

(source)

Exclure des dossiers d'un tar

Les archives de mon serveur devenant un peu trop grosses, j'ai dû mettre en place quelques exclusions de dossiers (par exemple ne plus sauvegarder les logs, caches et médias formatés de mes sites sous Change).

Pour cela je suis passé par l'option -X (ou --exclude-from=) de tar qui permet d'indiquer un fichier contenant les motifs à exclure.

Exemple :

tar cvf archive.tar /home/change -X exclude.txt

Avec un fichier exclude.txt contenant :

/home/change/repository
/home/change/instances/*/log
/home/change/instances/*/cache
/home/change/instances/*/build
/home/change/instances/*/media/formatted
/home/change/instances/*/www
/home/change/instances/*/repository

Attention les motifs sont comparés aux chemins tels que vous les avez décrits. Dans mon exemple, j'ai un chemin absolu pour le dossier à archiver, il faut dont des motifs qui matchent ce chemin. Si j'avais donné un chemin relatif, j'aurais dû revoir mes motifs d'exclusion en conséquence.

On peut également utiliser --exclude en indiquant directement un motif à exclure. Mais c'est moins pratique quand on a toute une liste d'exclusions.