Evaluation et calcul d'expression


1 août 2011

Il m'est arrivé d'avoir besoin d'évaluer des expressions arithmétiques dans du code Javascript, aussi bien pour une calculatrice toute simple que pour un tableur spécifique pour un client ou encore un moteur de génération de L-Systems paramétriques. J'ai donc décidé d'isoler ce code assez simple et de l'isoler dans un module réutilisable. Pour tester cette fonctionnalité, amusez-vous avec la zone de saisie ci-dessous :

Ce module gère bien sûr les 4 opérations de base, l'opérateur module (%), l'élévation à la puissance (grâce à **) et les parenthèses. De plus, il permet au développeur de se brancher sur l'objet d'évaluation pour être notifié en cas d'utilisation de symboles dans l'expression. Ces symboles peuvent être des variables ou des fonctions avec leurs arguments. Voici un exemple d'utilisation illustrant toutes les fonctionnalités :

var Calculator = new Evaluator({
        variable:function(varName)      {
            return ...;     //Renvoie la valeur de la variable *varName* que le programme gère.
        },
        callback:function(funcName, args)       {
            //Exemples d'utilisation
            if (funcName == "sqrt")     return Math.sqrt(args);
            if (funcName == "sin")      return Math.sin(args);
            if (funcName == "cos")      return Math.cos(args);
        }
    });
    //
    var Result = Calculator.eval("34-75*3+(4*8*2-4+6%5*2)-12*(15%7-3*2)+7").result;

Et oui, c'est rapide et simple à utiliser !

Pour info, le parsing / analyse de l'expression se fait de gauche à droite avec une machine à état, c'est plutôt rapide, mais je ne stocke aucun arbre me permettant d'optimiser les évaluation multiples d'une même expression dont les paramètres changeraient. Le code n'est vraiment pas difficile à modifier pour ajouter cette fonctionnalité.

Pour intégrer ce module dans votre code, il suffit simplement d'inclure le script directement dans votre page, qui pèse 1639 octets avant compression et 864 octets en zippé. �a ne devrait pas alourdir vos pages :)

Admin : chroot et sftp


26 juillet 2011

Je veux lister plusieurs liens concernant la mise en place d'une jail pour les utilisateurs d'un SFTP en attendant de faire un post complet et sérieux :

  • http://ubuntuforums.org/showthread.php?t=915985
  • http://undeadly.org/cgi?action=article&sid=20080220110039
  • http://www.cyberciti.biz/faq/page/7/
  • http://www.queret.net/blog/post/2010/03/03/Chrooter-une-session-SSH-utilisateur

Admin : Apache et rewrite dans des .htaccess


26 juillet 2011

Je veux lister plusieurs liens concernant du rewrite dans des .htaccess en attendant de faire un post complet et sérieux :

  • http://corz.org/serv/tricks/htaccess2.php
  • http://www.askapache.com/htaccess/mod_rewrite-tips-and-tricks.html

JS : fonctions et propriétés globales


15 juillet 2011

Il y a parfois besoin d'accéder à des propriétés (variables/fonctions) globales d'un objet. On peut arguer que dans ce cas-là une simple variable/fonction définie dans le namespace global suffirait (et on n'aurait pas tort) mais si l'utilisation d'un singleton peut paraître plus séduisant, car on minimise les collisions de nom dans ce même espace global, on est confronté à l'absurdité d'appeler une méthode de cet objet alors que cette fonction n'utilise rien de ce même objet. L'appel à une fonction/variables globale dans ce cadre prend simplement la forme suivante :

MonObjet.prototype.MaFonctionGlobale(les paramètres)

Il faut donc juste utiliser le constructeur et son prototype pour adresser la fonction ou la variable. C'est plus long ? Oui, mais parfois il faut indiquer que cette méthode est globale et c'est une très bonne façon de faire.

JS : décomposition d'un new


11 juillet 2011

Voici ma version d'un new en JS :

operator    new(Constructor)        {
    var Instance = {}
    Instance.constructor = Constructor
    Instance.prototype = Constructor.prototype
    var RetVal = Constructor.apply(Instance)
    return typeof RetVal == "undefined" ? Instance : RetVal
}

�a permet de comprendre facilement le langage et sa manière d'opérer.

1 2 3.. 6 7 8 9 10....... 18 19 20