Archives pour l'étiquette Bash

Sauvegarder ces bases de données Mysql sur un espace Amazon S3

Un exemple simplisme de script automatisant la sauvegarde des bases de donnée mysql de votre serveur sur un stockage amazon S3.

Ce script nécessite d’avoir un compte sur Amazon Simple Storage Service. Allez sur la page Amazon S3 homepage, cliqué sur le bouton « Sign up for web service » et inscrivez vous. Vous devrez fournir votre carte de crédit et en autorisé le débit en fonction de l’utilisation que vous ferez du service. Suite à cette inscription vous posséderez une clé d’ access et une clé Secrete vous permettant d’accéder au service.

Vous devez également avoir installé le paquet debian s3cmd

apt-get <span style="color: #c20cb9; font-weight: bold;">install</span> s3cmd

Votre clé d’ access et votre clé Secrete à disposition lancer la commande suivante pour configurer vos outils s3cmd et leur donner accès à Amazon

s3cmd --configure

Enfin le script, des plus simple, non ?

<span style="color: #808080; font-style: italic;">#!/bin/bash</span> <span style="color: #808080; font-style: italic;">#</span> &nbsp; <span style="color: #808080; font-style: italic;"># Mot de passe Mysql</span> <span style="color: #007800;">$MDP</span>=<span style="color: #ff0000;">&quot;Mots de passe Mysql&quot;</span> &nbsp; <span style="color: #808080; font-style: italic;"># ex : 1.2010-03-01_14h48</span> <span style="color: #007800;">DayNameDump=</span>`<span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span><span style="color: #c20cb9; font-weight: bold;">w</span>.<span style="color: #000000; font-weight: bold;">%</span>Y-<span style="color: #000000; font-weight: bold;">%</span>m-<span style="color: #000000; font-weight: bold;">%</span>d_<span style="color: #000000; font-weight: bold;">%</span>Hh<span style="color: #000000; font-weight: bold;">%</span>M`; &nbsp; <span style="color: #808080; font-style: italic;"># Monday = 1 etc..</span> <span style="color: #007800;">DayInWeek=</span>`<span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span><span style="color: #c20cb9; font-weight: bold;">w</span>`; &nbsp; <span style="color: #808080; font-style: italic;"># Pour Chaque DB de mysql sauf Database|information_schema|mysql</span> <span style="color: #000000; font-weight: bold;">for</span> I <span style="color: #000000; font-weight: bold;">in</span> `mysql -p<span style="color: #007800;">$MDP</span> -B -e <span style="color: #ff0000;">&quot;show databases;&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">egrep</span> -v <span style="color: #ff0000;">'(Database|information_schema|mysql)'</span>`;  <span style="color: #000000; font-weight: bold;">do</span>    <span style="color: #808080; font-style: italic;"># Création du répertoire de backup local pour chaque base</span>    <span style="color: #007800;">MSG=</span>`<span style="color: #c20cb9; font-weight: bold;">mkdir</span> -p <span style="color: #000000; font-weight: bold;">/</span>vars<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$I</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span>`;    logger -t <span style="color: #7a0874; font-weight: bold;">&#91;</span>SQLBACKUP<span style="color: #7a0874; font-weight: bold;">&#93;</span> Create Backup Directory: <span style="color: #007800;">$MSG</span>; &nbsp;    <span style="color: #808080; font-style: italic;"># Efface le backup de même jour de semaine éxistant déjà</span>    <span style="color: #808080; font-style: italic;"># On ne concerve donc que 7 jours glissant de backup en local</span>    <span style="color: #007800;">MSG=</span>`<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$I</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOSTNAME</span>.<span style="color: #007800;">$DayInWeek</span>.<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span>`;    logger -t <span style="color: #7a0874; font-weight: bold;">&#91;</span>SQLBACKUP<span style="color: #7a0874; font-weight: bold;">&#93;</span> Clean Old Backup: <span style="color: #007800;">$MSG</span>; &nbsp;    <span style="color: #808080; font-style: italic;"># Dump des bases présent sauf les exeptions, ceci en mode transactionnel, </span>    <span style="color: #808080; font-style: italic;"># gzip du fichier sql au taux de compression le plus fort</span>    <span style="color: #007800;">MSG=</span>`mysqldump --single-transaction -p<span style="color: #007800;">$MDP</span> -u root <span style="color: #007800;">$I</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">gzip</span> -cq9 <span style="color: #000000; font-weight: bold;">&gt;</span> \  <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$I</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOSTNAME</span>.<span style="color: #007800;">$DayNameDump</span>.sql.gz <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span>`;    logger -t <span style="color: #7a0874; font-weight: bold;">&#91;</span>SQLBACKUP<span style="color: #7a0874; font-weight: bold;">&#93;</span> Mysqldump: <span style="color: #007800;">$MSG</span>; &nbsp;    <span style="color: #808080; font-style: italic;"># Copie dans le bucket courant</span>    <span style="color: #007800;">MSG=</span>`s3cmd put <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$I</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOSTNAME</span>.<span style="color: #007800;">$DayNameDump</span>.sql.gz \  s3:<span style="color: #000000; font-weight: bold;">//</span>backup.perso.bucket.<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$I</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOSTNAME</span>.<span style="color: #007800;">$DayNameDump</span>.sql.gz <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span>`;    logger -t <span style="color: #7a0874; font-weight: bold;">&#91;</span>SQLBACKUP<span style="color: #7a0874; font-weight: bold;">&#93;</span> Put to S3 backup.perso.bucket: <span style="color: #007800;">$MSG</span>; &nbsp;   <span style="color: #000000; font-weight: bold;">done</span>;

Comment convertir une chaine en majuscule ou minuscule avec bash?

Assurez vous que tr est disponible sur votre système

Conversion de majuscule à minuscule

<span style="color: #7a0874; font-weight: bold;">echo</span> $<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #ff0000;">&quot;[:upper:]&quot;</span> <span style="color: #ff0000;">&quot;[:lower:]&quot;</span>

Conversion de minuscule à majuscule

<span style="color: #7a0874; font-weight: bold;">echo</span> $<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #ff0000;">&quot;[:lower:]&quot;</span> <span style="color: #ff0000;">&quot;[:upper:]&quot;</span>

Optimisation des images pour l’accélération d’un site web

En prenant comme exemple le travail réalisé pour voici.fr j’ai expliqué comment optimiser un site eZ Publish 4 pour l’utilisation des caches web, comment optimiser les performances de reverses proxy SQUID en amont de vos frontaux php, puis comment purger un élément de vos reverse proxy cache SQUID et au final démontré l’intérêt de ces optimisations avec le cas d’un pic d’audience du à l’action conjugué de Google Actu et Yahoo Actualité toujours sur Voici.fr

Maintenant je penche sur l’optimisation des images pour en accélérer le chargement afin de rendre plus véloce et rapide l’affichage des pages d’un site web.

 

Résolution et format mais la compression ?

Les images généré par les APN[1] sont d’une taille énorme et dépasse maintenant le millier de pixel de coté. Le contributeur à un site web à conscience de cela et s’efforce d’en réduire la résolution en général aidé en cela par une charte fournit par l’équipe technique en charge de la gestion du site web. Parfois un outils avec la procédure associée est fournit. Le plus les développeurs ont prévu des routines de vérification de la taille de l’image envoyé, parfois qui impose un format et ajoute une vérification du type mime.

Je me suis attaché à trouver une solution d’optimisation quelque soit la résolution en me concentrant sur le format jpg et png[2]. L’idée étant que le téléchargement d’une image de résolution raisonnable et d’un format précis ayant été acquit par le travail de vérification des routines mise en place par l’équipe de développement il me semblais nécessaire de revoir la compression et le nettoyage après la mise en ligne, ceci de façon automatique, massive et automatisable, bref à grand coup de script et cron.

 

Compression et nettoyage !

Les deux s’imposent de plus en plus avec l’utilisation massive d’APN et de logiciel de retouche d’image. Le premier comprime de moins en moins les images pour favorisé leur retouche ultérieurs. Un APN de type réflex propose d’ailleurs le format RAW ou TIFF qui ne comporte pas de compression. Mais en plus tout les types d’appareil, qui soit amateur ou professionnel ajoute tout un tas d’information dans le fichier en plus de l’image elle même:

  • Un court fichier d’en-tête pour organisation des bits, l’identification du fichier et l’emplacement des données.
  • Les métadonnées du capteur photographique ( la taille du capteur, filtre couleur et le profil couleur )
  • Les réglages d’exposition, le modèle d’appareil, la date voir la position GPS
  • section normalisée de métadonnées au format EXIF.
  • Parfois une vignette de l’image au format JPEG une prévisualisation rapide
  • etc.

Des informations très pertinente pour la retouche d’image ultérieur, le classement et l’archivage voir la gestion de droit mais totalement inutile pour l’utilisation sur le web. En plus de façon quasi systématique tout logiciel utilisé ultérieurement pour manipuler l’image ajoutera des informations semblable. Donc une nettoyage s’impose pour accélérer leur affichage.

 

Nettoyage et optimisation des JPG

Utilisation de jpegtran

Pour nettoyer les jpg j’ai utilisé jpegtran présent dans le paquet libjpeg-progs sous debian lenny. Mais d’autre solution existe vous pouvez en trouver une liste sur performance.survol.fr.

apt-get install libjpeg-progs

J’utilise les options suivante :

  • -copy none qui supprime tout le blabla enregistré par l’APN ou le logiciel de retouche
  • -optimize pour optimiser l’encodage en organisant les informations (sic)
  • -perfect impose que les deux précédentes option soient parfaitement réalisé ou pas du tout pour évité les situations partielles et instables.

Voici une ligne de commande pour traiter tout les jpg d’une arborescence. Noter que dans le bout de script suivant j’exclus les fichiers jpg ayant un espace dans leur nom ou dans le nom du répertoire de stockage.

for I in `find ./ -type f -name "*.jpg" | grep -v [[:space:]]`;  do jpegtran -copy none -optimize -perfect $I > /tmp/optimized.jpg; mv /tmp/optimized.jpg $I; done

Efficacité de jpegtran

Résultat un répertoire de 532 Fichiers qui pesait 53Mo est descendu à 50 Mo après optimisation avec jpegtran

 

Nettoyage et optimisation des PNG

Utilisation de pngcrush

Pour optimiser les png j’ai fais le choix de pngcrush présent sous debian lenny. La également d’autre solution existe entre autre optipng que linuxandfriends.com à testé.

J’utilise un option unique :

  • -brute teste 114 filtres de compression et ne retient que celui qui donne le meilleur résultat pour l’images traité.

Attention cela prend un temps énorme de réalisé 114 fois la compression d’une image pour au final n’en retenir qu’un résultat sur ce nombre. Mais, en contre partie, le filtre est toujours le plus pertinent pour l’image traité et résultat vraiment performant.

Voici une ligne de commande pour traiter tout les png d’une arborescence. Noter que dans le bout de script suivant j’exclus les fichiers png ayant un espace dans leur nom ou dans le nom du répertoire de stockage.

for I in `find ./ -type f -name "*.png" | grep -v [[:space:]]`;    do pngcrush -brute $I  /tmp/optimized.png; mv /tmp/optimized.png $I; done

Si vous souhaiter traiter uniquement les fichiers png du répertoire courant en changeant leur extension en .crush.png c’est plus simple :

pngcrush -brute -e ".crush.png" *.png

Les pgn de capture d’écran sous Mac OS X

Les capture d’écran sous Mas OS X avec la séquence de touche Pomme+shift+4 génère un fichier png par défaut. Personnellement j’utilise beaucoup cette fonction pour créé les images illustrant mes articles. La méthode / filtre la plus efficace de pngcrush pour ces png est la 113. Voici la syntaxe de son utilisation :

pngcrush -m 113 -e ".crush.png" *.png

Efficacité de pngcrush

Sur un répertoire contenant à l’origine les trois images png suivante.

-rwxr-xr-x 1 www-data www-data 365K Oct 13 16:00 Header.home.Voici.fr.png -rwxr-xr-x 1 www-data www-data 268K Oct 13 16:00 Hearder.Logo.Voici.fr.png -rwxr-xr-x 1 www-data www-data 284K Oct 13 16:03 Taille.Element.Voici.fr.png

Nous arrivons au résultat suivant

-rw-r--r-- 1 root     root     238K Oct 13 16:00 Header.home.Voici.fr.crush.png -rw-r--r-- 1 root     root     173K Oct 13 16:00 Hearder.Logo.Voici.fr.crush.png -rw-r--r-- 1 root     root     189K Oct 13 16:03 Taille.Element.Voici.fr.crush.png

Avant nous avions 900K d’image png, maintenant nous avons 600K. Sur cet exemple, limité, le poids des images à été réduit d’un tiers.

Notes

[1] appareil photo numérique

[2] Gif is dead

Wget et Mtr pour Mac OS X

Wget le gestionnaire de téléchargement en ligne de commande (Gnu) et Mtr qui combine les fonctions de la commande traceroute et de la commande ping sont disponible pour OS X isolément sans passer par les Darwing port ou le projet Fink.

Quentin Stafford-Fraser, un adepte du mac, les a compilé et les tiens à votre disposition sous forme de fichier zip.