De l’intérêt d’utiliser un langage interprété – Appliquer une fonction aux références arrières avec preg_replace

Eveything goes with PHP sauce
Vous connaissez tous la fonction preg_replace. Je l’utilise depuis des années mais n’avais jamais observé son comportement associée au modificateur « e »

Jetez juste un coup d’oeil au code suivant:

echo preg_replace(
  '/{(.*?)}/e', 
  'strtoupper("$1")', 
  '{did you know} you {could} apply {a} function to {a replacement} using preg_replace?'
);

Le résultat vas être « DID YOU KNOW you COULD apply A function to A REPLACEMENT using preg_replace? ».
On a choisit strtoupper pour l’exemple mais n’importe quelle expression fonctionnera.

A noter, et c’est important, que la fonction est incluse dans la chaîne de caractère du remplacement.

Le truc est le modificateur « e » de l’expression régulière. Le comportement de preg_replace est alors modifié pour utiliser non plus la chaîne de remplacement donnée à preg_replace mais le résultat de son traitement par eval().

Attention donc, le second paramètre doit toujours être une chaîne de caractères et il convient alors de l’échapper correctement.

jQuery tags plugin

from http://dragonartz.wordpress.com/tag/flowers/
Je cherchais un plugin pour jQuery pour prendre en charge joliment l’édition de tags, à la manière de ce que propose tumblr et n’en trouvais pas. Il est probable que la raison en soit que je n’a pas bien proprement cherché. Toujours est-il que j’ai décidé de coder un peu pour le prendre en charge.

Vous pouvez trouver ici une démo des premiers résultats.

L’utilisation est des plus simples:

$('.tags').tags(options);

Avec options :

{
    separator:',',
    add:function( added_tag_txt, tags ){ },
    remove: function( removed_tag_txt, tags ){ }
}

Tous les paramètres sont optionnels.

Les sources sont disponibles sur github.

Have fun.

Surcharger des membres statiques: Absurde?

Suis-je vraiment le seul à être souvent tenté d’écrire des choses absurdes comme?:

abstract class MyAbstractClass
{
	public static abstract string MyString	{ get; }
}

Bien sûr que c’est absurde, en tout cas en .Net/Mono, Java et j’imagine dans la plupart sinon tous les langages object compilés.
Pour ceux qui trouveraient le code ci-dessus légitime: Un membre statique est attachée à la classe où elle est définie. Vouloir le surcharger _ce qu’implique évidemment le abstract__, n’a donc pas de sens.

D’ailleurs, il faut dans tous les cas toujours explicitement indiquer la classe du membre statique que l’on appelle.

class Class1
{
	public static void MyMethod()
	{	Console.WriteLine("I am Class1.MyMethod");	}
}
 
class Class2:Class1{ }
 
class Class3:Class2
{
	public static new void MyMethod()
	{	Console.WriteLine("I am Class3.MyMethod");	}
}
 
class Main
{
	public static void Main(string[] args)
	{
		Class1.MyMethod();	// prints "I am Class1.MyMethod"
		Class2.MyMethod();	// prints "I am Class1.MyMethod"
		Class3.MyMethod();	// prints "I am Class3.MyMethod"
 
	}
}

Le terme statique n’est pas anodin. Il a été choisi pour indiquer qu’il ne peut y avoir d’ambiguité pour le compilateur sur la définition du membre à utiliser.
Il s’oppose naturellement à dynamique où il se peut que le choix du membre ne puisse être déterminé qu’au moment de l’éxecution du code.

Par exemple:

class Class1
{
	public void MyMethod()
	{	Console.WriteLine("I am Class1.MyMethod");	}
}
 
class Class2:Class1{ }
 
class Class3:Class2
{
	public new void MyMethod()
	{	Console.WriteLine("I am Class3.MyMethod");	}
}
 
class Main
{
	public static void Main(string[] args)
	{
		this.Test(new Class1());
		this.Test(new Class2());
		this.Test(new Class3());
	}
 
	public void Test(Class1 obj)
	{	obj.MyMethod();	}
 
}

La méthode appelée par obj.MyMethod(); dépend du type de obj.
Le compilateur ne peut savoir quelle méthode sera appelée et le lien se fera au moment de l’éxecution.

Alors, si le code présenté au départ est si absurde, pourquoi vouloir l’écrire ?

Il me semble que c’est principalement parce que deux définitions de la notion de membre statique peuvent avoir des zones de friction:
- D’une part, la notion d’attachement à la classe par opposition à l’instance.
- D’autre part la notion d’immuabilité du type pour le compilateur.

La première notion est purement conceptuelle:
_ Tous les insectes ont 6 pattes
_ Cette fourmi transporte une feuille

Puisque tous les insectes ont 6 pattes, il peut paraître logique de définir cette valeur au niveau de la classe, et donc en utilisant un membre statique.

class Insect
{
	public static int NbLegs
	{
		get:{ return 6; }
	}
}

Après tout, définir une valeur pour l’instance impliquerait conceptuellement que cette valeur puisse changer d’une instance à l’autre, non ?

Imaginons maintenant que nous désirions créer une interface pour définir l’ensemble des animaux dont on connaît le nombre de pattes par famille.

interface AnimalsWeKnowTheNumberOfLegs{...}

Le fait que le nombre de pattes sera connu de toutes les instances implémentant cette interface est bien évidemment à indiquer

interface AnimalsWeKnowTheNumberOfLegs
{..
	int NbLegs{	get;	}
..}

Ouis, mais si on trouve plus logique que la valeur de la propriété soit attachée à la classe plutôt qu’à ses instances ?

interface AnimalsWeKnowTheNumberOfLegs
{..
	static int NbLegs{	get;	}
..}

File=AnimalsWeKnowTheNumberOfLegs.cs, Line=10, Column=24, Type=Error, Priority=Normal, Description=The modifier `static’ is not valid for this item(CS0106)

ARghle…

Mais arrêtons-nous un moment.
Que cherche-t-on à exprimer ici ?

Ce que l’on aimerait, c’est exprimer que le nombre de pattes des instances des classes qui héritent de AnimalsWeKnowTheNumberOfLegs est une valeur définie pour leur classe.
Je sais, c’est un peu tordu.

En traduisant cette proposition en utilisant un membre statique, on commet un contre-sens:

Une propriété de la classe != Une propriété partagée par toutes les instances de la classe!!

La classe des insectes n’a pas 6 pattes! La classe des insectes n’a pas de pattes du tout! C’est une classe, pas un animal enfin!
Seuls les insectes ont 6 pattes.

Oui, mais comment alors exprimer le fait que la propriété est partagée par toutes les instances de la classe ?

- Et bien, en .Net/Mono au moins, on dispose à cet effet au sein d’une classe donnée du mot-clé const.
On peut alors retourner le const dans le get de notre propriété.

Par contre, on n’a toujours pas de moyen de forcer la définition d’un const dans une classe enfant.
En d’autre termes, impossible de spécifier un const dans une interface, en temps de membre abstrait ou même virtuel.

- En Java, on ne peut pas. A ma connaissance, final est l’équivalent de readonly et pas de const.

- Pour les langages prototype-based, il suffit de définir la propriété sur le prototype.
Ex en Javascript:

var o = {
};
 
var F = function(){};
F.prototype = o;
another_o = new F(); // o and another_o share the same prototype
 
o.prototype['my_shared_value'] = 25;
 
alert(o.my_share_value);
alert(another_o.my_shared_value);

- PHP a aussi un const. Mais les variables ainsi définies sont appelées comme des variable statique.

<?php
class MyClass
{
	const MyConstant = 'A constant';
}
 
echo MyClass::MyConstant;
$a = new MyClass();
echo $a->MyConstant;	// ERROR!
?>

A noter que PHP autorise à écrire « static abstract function test() ».

Il est clair que ma tentation de forcer la définition de membres statiques vient de là.

- En python et python-like, la confusion est là aussi possible. Le mot-clé self permet d’appeler indiféremment des membres statiques ou non.
Le code suivant est valide en Boo:

class MyClass():
	_string = "A string"
 
	public def constructor():
		self.StaticMethod()
		Console.WriteLine(self._string)
 
	public static def StaticMethod():
		pass

En conclusion, je ne vois pas de réelle solution pour forcer dans une interface ou une classe abstraite une propriété dont la valeur serait comune à toutes les instances de la classe.
Cela n’empêche pas bien sûr de coder mais la responsabilité de l’immuabilité d’une valeur d’une propriété pour une classe donnée continuera à échoir au programmeur.

Pour ma part, il me semble qu’il manque aux langages objets class-based un niveau d’abstraction pour définir cet ensemble de valeurs de propriétés communes ax instances d’une classe.
Ce niveau est justement celui définit par la notion de prototype dans les langages prototype-based.

A quand des langages permettant enfin des choses comme ceci ?:

class Insect(Animal):
	prototype:
		public NbLegs = 6;
 
	public def constructor():
		pass

Comment émuler des membres privés en Javascript

Comme vous le savez, tous les membres d’un objet sont publics en Javascript. Il n’existe aucun moyen de définir une variable comme étant privée ou protégée.

Pourtant, dans certains cas, il peut être utile, voire nécessaire, de garder privé certaines variables, par exemple lorsqu’on développe une librairie destinée à être utilisée par des tiers.
Dans son excellent petit livre Javascript, the Good parts, Douglas Crockford, le père de JSON, nous explique la bidouille pour en mimer le comportement:

var o = function(){
    var _my_private_var = "I am private";
    return {
        test: function(){
            alert("I am a plublic method, having access to a private var: " + _my_private_var);
        }
    }
}();
 
o.test(); // will display the message

Le truc est d’utiliser une fonction anonyme pour définir notre objet.

En Javascript, les fonctions sont des clôtures, ce qui implique qu’elles contiennent une référence au contexte dans lequel elles ont été créés et peuvent y accéder.

La deuxième chose à savoir est que, contrairement par exemple au C, où le scope est défini par block, Javascript définit son contexte par fonction. Si l’on définit une fonction enfant au sein d’une fonction parent, la fonction enfant aura accès aux variables définies dans le parent.

Enfin, afin d’empêcher de retrouver notre variable privée, on utilise une méthode anonyme qu’on exécute directement (cf the « }() » à la fin) pour retourner notre objet.

Du coup, voici ce qui se passe lorsque nous appelons notre méthode test(). La fonction test embarque avec elle une référence au contexte où elle a été créée. Dans notre cas, il s’agit de la méthode anonyme. Elle a donc accès aux variables qui y étaient définies et donc à _my_private_var.

D’un autre côté, nous n’avons pas stocké de référence à la fonction anonyme. L’objet o est le résultat de la fonction anonyme. Nous n’avons donc plus de moyen d’accéder à _my_private_var directement.
Notez que si nous avions enregistré une référence à la fonction, comme les fonctions sont aussi des objets en Javascript, il aurait été possible d’atteindre _my_private_var.

var func = function(){
    var _my_private_var = "I am not that private";
};
alert(func._my_private_var); // Will display "Im am not that private"

Les délimiteurs de bloc – Une évolution syntaxique

Depuis peu, je joue avec Boo et le framework Mono. Même s’il est très dommage que Boo ait perdu pour l’instant son auto-complétion dans Monodevelop 2, la syntaxe python-like est un réel plaisir à utiliser. J’attends avec impatience la nouvelle version du plugin pour Monodevelop et de tester la version alpha du plugin pour VS 2008.

Je me suis rendu compte à l’usage que ce que je préfèrais dans les langages inspirés de python n’était pas leurs capacité intrinsèques.
Soyons honêtes, on ne code pas de la même manière en Boo ou IronPython qu’en python. Le fait de se reposer sur un framework (.Net or Mono) change énormément la donne et dans la plupart des cas, l’approche même du problème.

Bien sûr, les possibilités offertes par le langage sont importantes. Très importantes même. Il s’avère juste que ce n’est pas la raison la plus importante du pourquoi j’affectionne les langages issus de python.

Si ce qui compte le plus n’est pas ce que le langage fait, qu’est-ce ?
J’ai réalisé récemment que ce que j’aimais vraiment, c’était d’être enfin libéré des délimitateurs de blocs.
Ca, et le fait que le compilateur/interpréteur ait l’air un peu moins crétain et qu’il soit finalement capable de deviner quel type j’utilise sans lui spécifier deux fois systématiquement.
Pourquoi faudrait-il que ‘jaie à taper

T var = new T();

?
Est-ce que le compilateur ne peut pas deviner à partir de la partie droite de l’assertion que var est de type T? Je sais, C#3 y arrive finalement, mais il aura falu une éternité pour que cela advienne si vous voulez mon avis.

Mais le meilleur point est définitement de ne plus avoir à taper d’acoolades en codant.
Si, comme moi, vous utilisez un clavier AZERTY, il vous faut appuyer sur AltRight + 4 et AltrRight + « + » pour faire les accolades.

Clairement, le type qui a designé le clavier AZERTY n’était pas un codeur C…

Bien sûr, avec le temps, tout développeur qui se respecte apprend à étendre son annulaire pour atteindre la combinaison de touche sans y réfléchir. Mais j’ai toujours considéré ce point comme une difficulté supplémentaire et inutile à l’apprentissage de la programmaion.

Mais à y réfléchir, la situation a été encore pire fût un temp! Je me rappelle un temps où il fallait taper des mots entiers (!) pour délimiter un bloc de code.

Je suis arrivé à la programmation à la fin des années 80. A cette époque, j’expérimentais mes premières douleurs programmationistiques en GFA basic sur mon Atari ST. Les commentaires suivants sont aussi valables à l’école qui est venue à la programmation par le VB.

Le Basic, une fois qu’il est devenu assez mature pour intégrer des réels contrôles de flux et plus uniquement les GOTO et GOSUB, de nouveaux mots ont été intégré pour délimiter ces blocs d’instructions.
Pour chaque boucle ou bloc conditionnel, on a un délimiteur de début et un de fin.

Dans le but, j’imagine (sic), de rendre les choses plus claires pour les developpeurs Basic, il a été décidé de définir des délimiteur spécifiques par type de bloc

If IWantAnIf Then
	'... DoSomeStuff
EndIf
 
Do
	'... Whatever
Until done
 
Do
	'.. Loop
Loop
 
For i = 0 To 1
	'...
Next

Etc.

A noter que cette syntaxe est toujours valide, par exemple en VB.Net ou VBA.

Après le Basic, le second langage que j’ai appris a été le Pascal, à l’école.
Avec le Pascal, il m’était introduit le concept de délimiteurs de blocs universels. Une fois que le type du bloc est défini et les conditions remplis, le bloc est toujours délimité par un begin et un end.

program WHILE_DEMO (output);
	const   PI = 3.14;
	var     XL, Frequency, Inductance : real
	begin
	        Inductance := 1.0;
	        Frequency  := 100.00;
	        while  Frequency &lt; 1000.00 do
	        begin
	            XL := 2 * PI * Frequency * Inductance;
	            writeln('XL at ',Frequency:4:0,' hertz = ', XL:8:2 );
	            Frequency := Frequency + 100.00
	        end
	 end

Les choses devenaient déjà un peu plus simples, mais il me fallait toujours taper 8 charactères uniquement pour que le compiler comprenne où le bloc commence et où il finit.
On retrouve ce genre de syntaxe par exemple en PL/SQL et en T-SQL.

C’est ensuite que j’ai rencontré le C…

A l’époque, passer de beginend à {…} était déjà un gros soulagement pour moi. Il était évident qu’il s’agissait de LA manière de procéder. D’ailleurs, la grande majorité des langages courants que j’ai ensuite appréhendés utilisaient la même méthode: C++, Java, Javascript, Perl, PHP, C# etc.
Très vite, j’ai commencé à croire que les accolades étaient un paradigme universel.

Jusqu’à ce que je tombe sur du code en ruby et python… Ma première réaction a été négative. Le code me semblait « sale » et probablement sujet à erreur. J’utilisais les accolades avec tous mes langages depuis 10 ans et il avait certainement une bonne raison pour cela. C’était la manière de faire.
Point barre.

A part qu’il a fallu que je change d’avis. A force de croiser d’excellentes applications développées à partir de Django ou en voyant que Google utilisait massivement python en interne, je me suis forcé à y jeter un nouveau coup d’oeil. Et ça déchire.

Une chose est certaine: Au bout du compte, coder, c’est taper. Et plus on a à taper, moins on pense au code.
Plus la syntaxe est simple, plus on peut se concentrer sur ce que le code doit faire et pas sur comment l’écrire. Cela permet aussi d’avoir un code plus lisible et donc plus facilement débuggable.

Comparons juste les deux bouts de code suivants :
C#

class MyClass
{
	private string _name;
 
	public string Name
	{
		get	{	return this._name;	}
		set	{	this._name = value;	}
	}
}

Et maintenant, en Boo

class MyClass:
	[Property(Name)]
	_name as string

Les deux font exactement la même chose et vont produire virtuellement le même code MSIL.
Lequel des deux est le plus rapide à écrire ?
Lequel des deux est le plus facile à lire ?

Mais même si il y a un gros buzz atour de ruby, python et consors depuis un certain temps, je ne suis pas persuadé que ces langages, basés sur ce nouveau type de syntaxe aient encore atteint leur pleine maturité.
Premier symptôme: La relative pauvreté en matière d’intégration dans les IDE.

Concernant Python:

  • Boo a perdu son auto-completion dans MonoDevelop avec la version 2.0. Un plugin pour VS est dispo depuis peu, en version alpha.
  • PyDev, sur Eclipe, apporte la complétion des méthodes natives mais a encore un gros chemin à parcourir. On est encore très loin de la qualité d’un CDT, PDT ou JDT.
  • Cobra en est encore juste au stade de la coloration syntaxique, sans intégration réelle dans aucun IDE à ma connaissance.
  • IronPython fait figure d’exception. Il est relativement bien intégré à Visual Studio mais il faut alors se limiter à Windows.

Je suis très loin d’être un expert en ruby mais j’ai l’impression que la situation pour ce langage est un peu inverse (assez bonne intégration dans Eclipse, à un stade très jeune pour IronRuby)

De plus, notamment concernant python, trop de dialectes concurrents existent encore, dont aucun n’a encore rendu l’âme.
Le python « natif » a naturellement l’avantage grâce à son age mais les performances sont un problèmes. Autre souci: le manque de portabilité. Sous Windows, il faut encore ajouter la relative confidentialité de ce langage.
IronPython est assez mature lorsqu’il s’agit de faire du .Net mais n’est toujours pas officiellement supporté au sein de l’écosystème Mono. Boo est excellent et offre des possibilités supplémentaires comme le duck typing mais est encore très jeune.

De manière intéressante, on peut observer à peu près la même évolution pour les formats d’échange de données pour le web

Depuis le début des années 90, le roi est sans conteste XML. Il a été décliné en un nombre quasi infini de spécifcations, formats ou standards que tous, nous utilisons ou devrions utiliser tous les jours (XHTML, SOAP & WSDL, XSL(T), XSD, RDF, OWL, XMAL, XUL, SVG, OpenDocument ou autres standards Oasis…)
XML a été si largement adopté que certains ne peuvent même s’imaginer autre chose pour échanger des données.

Je regardais l’autre jour une conférence de Douglas Crockford, le père de JSON. J’ai été choqué de voir que certains clients refusaient d’utiliser JSON au prétexte que leur politique était « de se conformer à XML ».

Si on regarde un message XML, on se retrouve devant quelque chose de verbeux, qui donne plus d’importace aux méta-informations qu’à l’information elle-même. Tous les délimiters de bloc sont spécifiques par bloc et utilisent des mots entiers.
D’une certaine manière, XML est aux formats d’échange de données ce que Basic est aux langages de programmation.

JSon utilise les accolades. Il est déjà beaucoup plus facile à lire, permet généralement des tailles de message plus réduites, ce qui peut rapidement devenir un avantage de poids sur un réseau.

Enfin, on a YAML, le python|ruby des formats d’échange de données.

Et là encore, les deux derniers formats paraissent bien imatures comparés à XML. Je dois concéder qu’il y a de bonnes raisons à cela.

Toutes les plateformes de développement offrent au moins une, souvent plus, bibliothèque de parsing XML. Cela commence aussi à être vrai pour JSON, pas encore pour YAML.
Seul XML offre la possibilité d’être validé par schéma ou DTD.
ET bien sûr, la base installée des applications web basées sur XML est par beaucoup plus importante que n’importe quel autre format.

Et vous, êtes-vous prêt pour les syntaxes basées sur l’indentation ?

*[EDIT:] Je viens de réinstaller PyDev et je dois dire que de gros progès ont été faits. PyDev est maintenant capable d’indiquer quels imports sont nécessaires ou pas et de chercher dans vos imports pour vous offrir de la complétion sur vos types. Je n’arrive toujours pas à forcer l’autocompletion d’un type dans un for mais je suis à peu près sûr qu’il doit y avoir un moyen en utilisant des commentaires.

Un client HTTP léger en PHP

Si vous cherchez un client HTTP léger en PHP5 et que vous trouvez les solutions de Snoopy, Zend ou Pear un peu trop lourdes, voici peut-être ce que vous cherchez.

J’ai écrit une petite class pour simuler un browser et retourner le source de la page visitée.

Il vous faudra cUrl installé et activé pour PHP.

La classe expose deux méthodes publiques: get et post. Les fonctionalités sont très limitées. Pas de moyen de traquer les headers, pas de gestion d’erreur non plus.

Exemple:

$c = new WebClient();
var_dump($c->get('http://www.google.com'));
var_dump($c->post('http://www.myform.com', 'field1=value1&field2=value2');
 
$c->close();

Si ca peut servir…

Comment récupérer le dernier auto-incrément avec SQlite et Mono ?

J’ai toujours trouvé un peu étrange que chaque base de données gère la récupération du dernier auto-incrément (@@IDENTITY) à sa manière.
Encore plus étrange, j’aurais escompté qu’ADO.Net par exemple, unifie le processus. Mais ce n’est pas le cas et j’imagine qu’il y a de bonnes raisons pour cela.

Toujours est-il que si vous vous demandez comment récupérer le dernier auto-incrément inséré en utilisant l’extension Mono.Data.SqliteClient, voici la marche à suivre.
La class Mono.Data.SqliteConnection inclue la propriété LastInsertRowId, qui contient la valeur recherchée

Ce qui donne quelque chose comme (en BOO) :

import Mono.Data.SqliteClient
 
cnx = SqliteConnection("URI=file:sqliteDb.db")
cmd = SqliteCommand("INSERT INTO my_table (field) VALUES ('value')", cnx)
 
cnx.Open()
cmd.ExecuteNonQuery()
inserted_id = cnx.LastInsertRowId
cnx.Close()