JS : plug-in de jQuery, compléments


22 mai 2011

Le module jQuery étant créé on peut vouloir lui ajouter des fonctionnalités ou un paramétrage. Pour reprendre l'exemple des visualiseurs d'images décrit ailleurs, j'ai 3 modes de transition représentant chacun un bout de code. On peut imaginer que le mode choisi pour le visualiseur soit un paramètre et que les trois programmes cohabitent au sein d'un module slider. Pour cela, on va déplacer les deux autres codes dans le module simpleSlider et lui faire accepter un objet littéral en entrée pour le paramétrer.

Concernant les fonctionnalités supplémentaires elles feront l'objet de fonctions filles de la fonction principale qui se retrouve être un hub et concernant les paramètres d'entrée on définira dans le corps de la fonction un objet littéral, miroir de ce que l'utilisateur envoie au plugin, avec tous les paramètres par défaut. Il suffira de la ligne suivante pour faire obtenir la réunion des deux avec les paramètres utilisateur overridant ceux par défaut :

$.fn.MonModule = function(options)      {
    var Settings = { /* Les paramètres acceptés avec leurs valeurs par défaut /* }
    $.extend(Settings, options)
    /* Settings contient à présent les paramètres de l'utilisateur réunis avec ceux par défaut */
}

Si le module ne renvoie pas de valeur particulière, on n'oubliera pas de lui faire retourner this pour que le chaînage des appels JS/jQuery puisse perdurer sur le même objet jQuery.

JS : plug-in de jQuery, première approche


21 mai 2011

Le visualiseur de diapositives décrit dans un autre post aurait sa place dans un plug-in de jQuery et n'a aucune raison d'être instancié dans une fonction personnelle et encore moins en dur dans le code d'une page. Aussi on va décrire les étapes de l'intégration de ce bout de code dans l'espace de nom de jQuery. Tout repose sur le bout de code qui suit :

$.fn.NomDuPlugin = function()       {
    //Mon plug-in
}

Si on est certain que l'on n'utilise que jQuery ceci fonctionnera, mais si on a YUI ou Prototype qui traîne on utilisera une fonction auto-exécutable et une closure qui permettra d'utiliser le caractère $ sans que cela pose de problème :

(function($)        {
    $.fn.NomDuPlugin = function()   {
        //Mon plug-in
    }
})(jQuery)

Si à présent on déplace ce code dans un fichier JS externe et qu'on l'inclue avant son utilisation et après l'inclusion de jQuery on a effectivement transformé notre programme en module, externe et réutilisable. Dans le cas présent j'ai même pu éliminer la sélection du containeur du visualiseur et on instancie ce dernier comme suit, après inclusion du fichier js/simpleSlider.js :

$("#container").simpleSlider()

Plus simple ? Je suis pas sûr que ça soit possible :)
Source : la page de jQuery.com qui parle des plug-ins

Admin : l'appel rsync le plus fréquent


21 mai 2011

La plupart des rsync que je fais sont semblables à celui qui suit, récursif, il compresse, quand il peut, les données, il ne modifie pas les droits de ce qu'il transfère et il exécute réellement le transfert seulement quand c'est nécessaire (avec une vérification par checksum), le tout avec une transmission des données par SSH. En plus elle se retient facilement :

rsync -carzv --progress --skip-compress='bz2/gz/mp3/jpg/7z/png/rar/zip' --rsh="ssh" SourceDir/ user@hostname:DestDir/

Bash : des choses que je ne savais pas...


19 mai 2011

On en découvre tous les jours sur Bash, surtout si on l'a appris en fonction de ses besoins et pas globalement.

Ainsi, on va rediriger la sortie d'un find vers une boucle while et utiliser des pseudos-classes :

#!/bin/bash
# This bash script will locate and replace spaces in the filenames
DIR="."
# Controlling a loop with bash read command by redirecting STDOUT as a STDIN to while loop
# find will not truncate filenames containing spaces
find $DIR -type f | while read file; do
    # using POSIX class [:space:] to find space in the filename
    if [[ "$file" = *[[:space:]]* ]]; then
        # substitute space with "_" character and consequently rename the file
        mv "$file" `echo $file | tr ' ' '_'`
    fi;
done

Le mot-clé select existe en Bash :

select word in "linux" "bash" "scripting" "tutorial" 
do
  echo "The word you have selected is: $word"
  break     # Break, otherwise endless loop
done

Les expensions ANSI-C :

# as a example we have used \n as a new line, \x40 is hex value for @
# and \56 is octal value for .
echo $'web: www.linuxconfig.org\nemail: web\x40linuxconfig\56org'

Les redirections...

X>&Y : redirige le flux de X vers le flux Y
X> : redirige le flux X (par défaut stdout ou 1) vers un fichier
On peut combiner les redirections précédentes, par exemple : > file 2>&1
Les deux indicateurs de redirections sont équivalents : >& et &>, tous les deux redirigent stdout et stderr vers un fichier
< : remplace stdin avec le contenu d'un fichier
<X : remplace le flux X avec le contenu d'un fichier

Si on utilise ces opérations de redirections avec la commande "exec" on exécute la redirection pour toute la durée du processus courant ou jusqu'à une modification de cette redirection et plus seulement dans le contexte d'une commande donnée. Donner des exemples.

# Link filedescriptor 10 with stdin
# stdin replaced with a file
Exemple : exec 10<&0; exec < Fichier
Son opposé (pour restaurer) : exec 0<&10 10<&-

On va utiliser 'exec < Fichier' pour pouvoir, par exemple, faire un 'while read Line' et énumérer toutes les lignes du fichier Fichier.

Question : est-ce que 'cat Fichier | command' est équivalent à 'command < Fichier' ?

Les expressions et leurs calculs
let Var=Expression : permet le calcul de Expression et le placement de son résultat dans Var
On peut "expandre" (calculer le résultat d'une expression) avec $((Expression)) ou $[ Expression ]
On peut écrire Base#Valeur pour déclarer la base dans laquelle s'exprime la valeur

Admin : redirections 301 massives


16 mai 2011

Pour planter le décor : un site a été modifié en quelques années et GWT indique à l'administrateur que des liens venant de l'extérieur aboutissent à des erreurs 404. Rien de grave ? Si, car il s'agit d'un site marchand et son référencement va s'en ressentir mais en plus il y en a plusieurs milliers !

Bien sûr, l'administrateur habitué va tout de suite penser à une solution basée sur ModRewrite d'Apache pour générer des redirections HTTP 301 (permanentes) et il aura raison :) Voici la chose :

	RewriteEngine   On
	RewriteLogLevel 0
	RewriteMap      VieillesPages404        txt:../../../../home/www/LeSite/www/oldies.404.txt
	RewriteMap      lowercase       int:tolower
	RewriteCond     ${lowercase:%{REQUEST_URI}|NONE}        ^(.+)$
	RewriteCond     ${VieillesPages404:$1}  >""
	RewriteRule     ^(.*)$          ${VieillesPages404:$1|$1}       [R=301,L]

J'ai ajouté ce code dans l'hôte virtuel parce qu'un .htaccess n'autorise pas la directive RewriteMap.

Au final, j'ai plusieurs milliers de redirections gérées sans aucune pénalité pour le serveur, un référencement de nouveau satisfaisant et une liste d'adresse qui peut évoluer au fil du temps puisqu'il ne s'agit que d'un fichier texte !

Attention : le fichier texte, oldies.404.txt, est composée de lignes contenant deux champs avec le premier précédé d'un '/' alors que le second n'en possède pas.

Source : http://www.jeremytunnell.com/posts/mod_rewrite-attempting-to-bend-rewritemap-rewritecond-and-rewriterule-to-my-will

Reste à faire : tester httxt2dbm pour qu'Apache utilise une base de données optimisée à base de hash pour repérer plus rapidement les URL à rediriger. N'en ayant pas eu besoin je ne l'ai pas fait.

1 2 3.... 8 9 10 11 12..... 18 19 20