Mots-clé : script

Supprimer les plus vieux fichiers d’un dossier tant qu’on dépasse une certaine taille


Exemples de lancement du script

Notez qu’il faut lancer en utilisant « source« 

  • Supprimer les plus vieux fichiers du dossier courant (./) tant qu’il prend plus de 96Mo :
    source ./clean_custom.sh --path ./ -l 9600000
  • Supprimer les plus vieux fichiers du dossier temporaire (/tmp/) tant qu’il prend plus de 2Go :
    source ./clean_custom.sh --path /tmp/ -l 2000000000

Code du script

#!/usr/bin/env bash                                                              
PATH_TO_CLEAN=                                                                   
NUMBER_FILES_TO_DELETE_EACH_LOOP=1                                               
SIZE_LIMIT=2000000000                                                            
                                                                                 
# ----------------------------------------------------------------------------   
# usage:                                                                         
usage()                                                                          
{                                                                                
    echo "Clean directory: while size of a dir > limit, oldest files first."
    echo "Usage: ${filename} [-p|--path path] [-s|--max-size size] | [-h]"
    echo "    -p|--path: path to clean"            
    echo "    -l|--limit: max size for the folder (must be > 0)"
    echo "    -h|--help this help"                 
}                                                                                
                                                                                 
# ----------------------------------------------------------------------------   
# handling arguments:                                                            
args=("$@")                                                            
filename=$(basename -- "$0" | sed 's/\(.*\)\..*/\1/')        
while [ "$1" != "" ]; do                                     
    case $1 in                                               
        -p | --path ) shift              
                      # stop if path doesn't exist:
                      if [ ! -d "$1" ]; then
                          echo "Path not found: '$1'"
                          usage
                          return 1
                      fi
                      PATH_TO_CLEAN=$1
                      ;;
        -l | --limit ) shift             
                       SIZE_LIMIT=$(echo $1 | bc)
                       if [ $SIZE_LIMIT -le 0 ]
                       then
                           usage
                           return 1
                       fi
                       ;;
        -h | --help ) usage              
                      return
                      ;;
        * ) usage                        
            return 1 
    esac                                                     
    shift                                                    
done                                                                             
[ -z "$PATH_TO_CLEAN" ] && echo "Path empty" && usage && return 1
echo "Cleanin dir: '$PATH_TO_CLEAN', size limit=$SIZE_LIMIT" 
# ----------------------------------------------------------------------------   
# handling arguments:                                                            
while [ 1 ]                                                                      
do                                                                               
    s=$(du -sb $PATH_TO_CLEAN | cut -f1 | bc)                
    if [ $s -gt $SIZE_LIMIT ]                                
    then                                                     
        find $PATH_TO_CLEAN -type f -printf '%T+ %p\n' | \
            sort -nr | \
            tail -$NUMBER_FILES_TO_DELETE_EACH_LOOP | \
            cut -d' ' -f 2- | \
            xargs -I {} rm -f {}
    else                                                     
        break                            
    fi                                                                                                                                                                                                                                                      
done                                                                             
return 0

Activemq : principe de messagerie interne producteur / consommateur

J’ai eu un besoin que je pensais assez particulier, mais qui, en fait, dans certains cas, semble tellement récurrent que beaucoup de choses ont déjà été faites dans ce sens.
Mon besoin est simple :

J’ai un site distant qui est d’accord pour qu’on l’interroge en lui demandant des informations sur des Ids, mais pas très souvent : une demande toute les 5 secondes. Par contre, lors de la demande, on peut lui faire passer plein d’Ids (jusqu’à 100 !).

Donc j’ai fait un script Php, lancé à la main, qui tourne en boucle, et qui va interroger ce fameux site, toutes les 5 secondes.
Une fois ce script fait, j’ai besoin que l’on puisse préciser « à la main » les Ids. Je fais donc un site Internet, et je mets à disposition de tout le monde la possibilité d’entrer des Ids « à la main ».

Problème

La demande Internet peut se faire n’importe quand, et il faut que la réponse soit rapide, donc que la demande soit immédiatement inclue dans le « paquet » lors de la prochaine interrogation. De plus, il peut y avoir plein de demandes à la fois. Et elles doivent toutes s’ajouter facilement.

Solutions

Plusieurs solutions sont possibles :

  1. Utiliser une sorte de dossiers « partagés » où d’un côté le Web/Php dépose un fichier avec un Id, et attend dans un autre dossier la réponse comportant le même nom de fichier ; gros problème : ce n’est pas une méthode 100% fiable ;
  2. Faire un serveur interne qui attend des informations, et lorsque son timer tombe, hop, fait la demande. Gros problème : écrire un vrai serveur Web en Php n’est pas une chose facile, et je n’ai pas le temps de faire tout ça ;
  3. Faire une écriture en base de données pour chaque demande Web, et du côté script, faire un simple « SELECT * FROM… WHERE DATE_DEMANDE IS NULL » (ou quelque chose comme ça). Problème bloquant : comment faire pour signaler à chaque demande Web que leur réponse est disponible ?
  4. Dernière solution : utiliser quelque chose qui existe déjà et tourne très bien : un serveur producteur/consommateur (je l’appelle comme ça mais ce n’est pas le vrai nom). Il implémente en gros tout ce que je demande : d’un côté le client qui envoie des messages, et peut – ou pas – attendre un retour de manière bloquante, et de l’autre côté, le serveur qui lit les messages qui arrivent quand il en a envie, et peut leur répondre facilement – quand je dis « facilement », je parle du point de vue du code à faire en Php.

Solution finale

La dernière solution existe, tourne depuis bien longtemps, fait partie de l’association Apache, et a une implémentation en Php, soit tout ce que je veux : cliquez ici pour plus d’informations : http://activemq.apache.org/

Résumé mémo pour mon installation sous Linux (car si je change de serveur j’aurais besoin de me souvenir de ce qui suit !) :

  • apt-get install activemq
  • Ce qui m’a fait perdre beaucoup de temps : la configuration est la même que le principe available/enabled de la configuration du serveur Web Apache, à la différence près qu’une configuration n’est pas un fichier simple, mais un dossier. Il faut donc faire un lien symbolique dans le dossier enabled sur le dossier d’exemple : sudo ln -s ../instances-available/main/
  • Pour le lancer, faire le grand classique et ne pas suivre d’autres suggestions moisies qu’on trouve un peu partout sur le Web. Simplement service activemq start
  • Enfin, installer en Php. Sur Debian, si on enlève le temps de recherche, ça prend deux minutes maximum : pecl install stomp. L’installation de stomp pour activemq va compiler une extension pour Php. Il suffit de l’inclure dans /etc/php.ini (je l’ai ajouté en fin de fichier, ça a parfaitement fonctionné) : extension=stomp.so. Au cas où, n’oubliez pas de redémarrer le serveur Web ! service apache2 restart

Et voilà tout fonctionne ! Le meilleur exemple – et plus parlant – à mon sens se trouve ici. Code très simple et efficace.

Adobe Photoshop Scripting : astuces – hints

Après avoir lu la documentation et essayé toutes les choses de bases, voici ce qu’il me manquait pour faire les choses rapidement : notez bien que je ne programme Photoshop qu’en JavaScript.

Extension des fichiers Photoshop JavaScript

Tous vos fichiers doivent se terminer par « .jsx »

Charger les scripts uniquement via Photoshop

  • Si Photoshop est déjà ouvert, choisissez Fichier » Scripts » Parcourir. Allez dans le répertoire Presets » Scripts et sélectionnez votre script.
  • Si Photoshop n’est pas ouver : démarrez Photoshop et choisissez Fichier » Scripts, et sélectionnez votre script à partir du menu Scripts.

En scripting, impossible de sélectionner un cercle. La sélection ne fonctionne que sur des points : on peut préciser un ensemble de points, et ensuite demander à ce que la sélection « suive » cet ensemble de points. L’astuce que j’ai trouvé : faire un tracé qui soit un cercle, et demander au tracer de s’appliquer à la sélection.

Enfin, ce qu’il vous manquera le plus et qui est dur à trouver :

Le logger JavaScript

Ils ont fait un truc génial et super pratique : c’est un plugin JavaScript qui loggue toutes vos actions. Comme il loggue toutes vos actions il faut surtout ne pas oublier de le désactiver, mais en pratique, à la moindre de vos actions Photoshop, il remplit un fichier qu’il a crée sur le bureau : ScriptingListenerJS.log (mais aussi pour ceux que ça intéresseil crée le même fichier avec les actions en Visual Basic : ScriptingListenerVB.log).

Donc si vous avez du mal à trouver le code en JavaScript, hop le logger et là vous regardez ce qu’il écrit quand vous faites une action.

Google gmail, google apps scripting

Saviez vous qu’il était possible d’automatiser la plupart des applications google ?

Allez simplement sur cette adresse : https://script.google.com.
Vous verrez : c’est extrêmement pratique.

Ce site donne même cinq exemples de scripts pour automatiser certaines tâches rébarbatives :

  1. Supprimer automatiquement des mails après un certain nombre de jours
  2. Demander à certains mails de « réapparaître » dans votre boîte de réception au bout d’un certain nombre de jours
  3. Envoyer des SMS pour des emails importants
  4. Programmer des mails pour qu’ils soient envoyés à une certaine date
  5. Sauvegarder des messages Gmail en tant que PDF dans google drive

IUT informatique : script Shell pour injecter la base de données WordPress

Dumper la base de données

mysqldump -u root -pmysql wordpresslocal > 2013.12.19.wordpresslocal.sql

Réinjecter la base de données

mysql -u root -pmysql -e "DROP DATABASE IF EXISTS wordpresslocal;"
mysql -u root -pmysql -e "CREATE DATABASE wordpresslocal DEFAULT CHARACTER SET utf8;"
mysql -u root -pmysql -e "USE wordpresslocal ; GRANT ALL PRIVILEGES ON wordpresslocal   TO 'v69a6YK614454xA'@'localhost' IDENTIFIED BY 'nQ1e7NfDRXG2q6H';"
mysql -u root -pmysql -e "USE wordpresslocal ; GRANT ALL PRIVILEGES ON wordpresslocal.* TO 'v69a6YK614454xA'@'localhost' IDENTIFIED BY 'nQ1e7NfDRXG2q6H';"
mysql -u root -pmysql wordpresslocal < 2013.12.19.wordpresslocal.sql

ShootMania : l’après TrackMania

Vous pouvez voir la vidéo de Shootmania ici :

Présentation de shootmania

C’est vraiment impressionnant.

Mon petit nez me disait que du côté du scripting ils avaient fait quelque chose de fort.
Je me suis trompé : ça n’est pas fort, c’est exceptionnellement fort.

En fait leur moteur de scripting, tenez vous bien, intègre un compilateur qui génère du code machine : oui, vous avez bien lu, le code est compilé à la volée !

C’est ce qui se produit déjà dans Trackmania 2 et mon petit nez me disait qu’ils avaient fait un boulot énorme, au vu de la rapidité avec laquelle mon script de labyrinthes était compilé puis exécuté.

Vivement que je puisse mettre la main dessus pour faire les maps MOBA de labyrinthes 🙂

Gimp et Python-fu script : vecteurs et strokes : exemple

J’ai eu énormément de mal à trouver un exemple de script python-fu qui fonctionne.

Après avoir réussi à automatiser certaines tâches grâce à Gimp, je voulais créer des vecteurs, et y appliquer la brosse en cours.

Voici l’exemple de code qui fonctionne :


  new_image = pdb.gimp_image_new( new_image_width, new_image_height, RGB )
  new_layer = pdb.gimp_layer_new(
    new_image, new_image.width, new_image.height,
    RGBA_IMAGE, _("Background"), 100, NORMAL_MODE)
  pdb.gimp_image_add_layer(new_image, new_layer, -1)
  pdb.gimp_drawable_fill(new_layer, fill_type )
  new_layer = gimp.Layer(
    new_image, _("New Layer"),
    new_image.width, new_image.height,
    RGBA_IMAGE, 100, NORMAL_MODE)
  pdb.gimp_image_add_layer(new_image, new_layer, -1)
  pdb.gimp_drawable_fill(new_layer, fill_type )

  new_vectors=pdb.gimp_vectors_new(new_image, 'Vectors!')
  t = int(round(step / 1.5))
  pdb.gimp_vectors_stroke_new_from_points(
    new_vectors,
    0, # 0 = Beziers Curve
    30,
    # {controle1} {centre} {controle2}
  [ x-(step-t), y, x-step, y, x-(step-t), y,
      x, y+(step-t), x, y+step, x, y+(step-t),
      x+(step-t), y, x+step, y, x+(step-t), y,
      x, y-(step-t), x, y-step, x, y-(step-t),
      x-(step-t), y, x-step, y, x-(step-t), y],
      False) # Closed = True

  pdb.gimp_image_add_vectors(new_image, new_vectors, 0)

  pdb.gimp_context_set_foreground( (255,255,255) )
  pdb.gimp_context_set_brush( "Circle (07)" )
  pdb.gimp_edit_stroke_vectors(new_layer, new_vectors)

  gimp.Display( new_image )

Maintenant avec cet exemple, si vous voulez faire des vecteurs et les dessiner avec la brosse en cours, ainsi qu’avec mon article sur l’automatisation de Gimp, vous devriez arriver à faire beaucoup de choses !

Python : mes premiers essais

Bon, sur cet article ici, j’ai traduit tout le vécu d’un auteur, et j’ai voulu tester par moi même.

En pratique, j’ai installé un dictionnaire de Français entièrement gratuit, et je voulais récupérer les mots Français, sans la définition (je ne dirai pas pourquoi par contre hahahah).

Donc je regarde les fichiers, c’est du XML.
Ok donc il me faut juste un parseur.
En Delphi, ça m’aurait pris disons… une trentaine de minutes.
Eh bien pour mon premier script en Python, ça m’a pris… 10 minutes.
Oui oui je n’exagère pas : 10 minutes, j’ai lancé le chrono pour voir si j’allais être rapide ou pas.
Voilà mon script :

1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 # r = open('/datas/dictionnaire/test
5
6 import types, fileinput
7
8 def process(line):
9 if line[0:7] == ' 0):
12 sub = sub[:sub.find(' ')]
13 if (sub.find(',') > 0):
14 sub = sub[:sub.find(',')]
15 print(sub)
16
17 for line in fileinput.input():
18 process(line)

Incroyable. Effectivement, en pratique c’est vraiment ce que j’ai mis sur mon article précédent : tout est clair, lisible, la documentation aide bien, et c’est extrêmement rapide, en tous les cas sa rapidité suffit amplement pour faire toutes les tâches de scripts de base que l’on veut.

Je suis extrêmement content, à part depuis la découverte de la librairie ExtJs, qui est très impressionnante, ça allait faire longtemps que je n’avais pas été autant enthousiasmé (du point de vue informatique, j’entends).

Autohotkey : un programme à tout faire, vraiment tout !

J’ai eu une discussion récemment avec un type qui a pris mal le fait que je me sois servi d’autohotkey pour aller plus vite que les autres dans le jeu Dofus.

En fait c’est amusant, parce que la discussion que j’avais avec ce type n’avait aucun rapport avec Dofus : en fait je voulais me servir de autohotkey pour générer un labyrinthe dans l’éditeur de circuit TrackMania.

Vous remarquerez que j’ai mis cet article dans la catégorie « games » mais aussi « notes côté professionnel ». Pourquoi ? Je vais vous donner un exemple de ce que j’ai fait avec le géniallissime programme qu’est autohotkey.

« Oui », je me suis servi de autohotkey pour accélérer ma progression dans le jeu massivement multijoueurs qu’est Dofus. Alors que des joueurs passent des jours entiers, dans le jeu, à couper du bois, à aller pêcher, à aller à la mine, pour récolter des choses et les revendre, moi, je lançais mon programme le soir et le lendemain j’avais mon stock plein de matières premières qu’il ne me restait qu’à vendre. C’est sûr que dans ce cadre, plein de joueurs râlent ! Mais que voulez vous c’est la vie. Cela dit je viens de surprendre plusieurs joueurs mécontents qui disent que autohotkey est un programme de triche. Non, c’est faux. Autohotkey sert à envoyer des touches et des mouvements de la souris à l’ordinateur, exactement comme si c’était un être humain qui l’avait fait. C’est d’ailleurs pour cela que personne ne m’a jamais surpris en mode « automatique » à Dofus. Mais le côté professionnel est celui-ci : un jour, La Mondiale, grosse société d’assurance avec laquelle nous avons travaillé pendant trois années, nous envoie ses tarifs pour que nous les intégrions dans notre base de données. Seul problème : tous leurs tarifs étaient dans un gros fichier Excel. Et sur plusieurs onglets qui plus est ! Alors que notre programme d’administration, lui, demandait à ce qu’on entre valeur par valeur… bref nous étions tous sacrément embêtés. La première solution qui nous est venue à l’esprit a été la suivante : nous avons demandé aux gestionnaires, dès qu’elles avaient un peu de temps libre, d’entrer les informations petit à petit. Et donc, quelques jours plus tard, une gestionnaire arrive et me dit qu’après avoir passé une matinée dessus, elle n’avait pu entrer que la moitié des tarif d’un onglet (il y en avait une dizaine).

J’ai donc cherché une autre solution et là, hop, la solution géniale : autohotkey. J’ai passé une matinée à faire un script autohotkey, et le résultat a été ultra simple : la souris se déplaçait toute seule, sélectionnait Excel, faisait un copier de la valeur courante, revenait sur le programme de gestion, insérait le tarif, et puis revenait sur Excel, se déplaçait et faisait un copier de la valeur courante, revenait sur le programme de gestion, etc. Bref nous avons fait ça sur un ordinateur seul qui a tourné toute la nuit et le lendemain, tout était fini !

Autrement dit ce programme nous a fait économiser plusieurs dizaines d’heures de main d’œuvre. Pratiquement un millier d’euros (oui je n’exagère pas : une personne qui passe 8 jours complets à entrer des tarifs aurait coûté à peu près cette somme).

Autohotkey est donc un programme vraiment génial. Ah oui vous savez quel en a été ma première utilisation ?

Il m’a aidé à rencontrer un monde fou ! En effet, lorsque j’étais célibataire, je me suis inscrit sur un club de rencontres, et je n’écrivais qu’un seul message, puis je lançais mon script autohotkey qui faisait un copier-coller, et qui l’envoyait à la personne suivante. En quelques heures, et sans rien faire, j’avais écrit à plusieurs centaines de personnes !
C’est ainsi que j’ai pu organiser un repas avec dix-neuf personnes, et je n’en connaissais qu’une (une amie) !

Autohotkey me sert tous les jours. Par exemple, je lance un script qui lance putty, attend le login, entre le login, le mot de passe, et lance screen. Bref, il fait ça en trois secondes alors que j’en mets une dizaine à la main. Six secondes de gagnées. « Ce n’est rien », me direz vous. Mais six secondes fois vingt fois dans la journée égal deux minutes par jour. Deux minutes sur l’année ça fait quatre heures. Ce logiciel fait économiser une demi journée complète par an à ma société. Et il ne me sert pas qu’à ça comme je l’ai dit. Il doit globalement faire économiser à moi et aux autres plusieurs jours par an à la société. C’est très loin d’être négligeable.

Aussi incroyable que cela puisse paraitre, autohotkey est un outil vraiment très très puissant : c’est un vrai couteau Suisse et dès qu’on a une grosse tâche répétitive à faire sur ordinateur ma première pensée c’est : est-ce que je pourrais faire un script autohotkey ou pas ?