Archive

Archives pour la catégorie ‘Langages’

SVG + JavaScript = Stress !

Depuis peu, les navigateurs modernes permettent d’utiliser des graphiques au format SVG. Cela est intéressant, car il est possible d’interagir avec ces graphiques à l’aide de JavaScript. Non plus seulement afin de redimensionner l’image, d’en modifier l’attribut alt, mais carrément de dessiner comme on le ferait avec un logiciel de dessin tel que Inkscape ! Mieux : il est possible non seulement de dessiner, mais d’intercepter des événements et de modifier l’image en conséquence ! Il devient ainsi possible de faire des choses étonnantes, et il n’y a presque plus besoin de Flash pour faire des applications web intéressantes.

La preuve : je me suis amusé à faire un petit jeu (que j’ai également ajouté sur ScriptLand) pour tester un peu ce qu’il était possible de faire. Voici ci-dessous : il s’agit de démêler les nœuds. Attention ! Il existe encore quelques petits bugs que je corrigerai – un jour…

À noter que pour faire cela, j’ai utilisé le merveilleux Prototype Graphic Framework qui simplifie bien la vie !

N’hésitez pas à faire part de vos commentaires !

Categories: JavaScript Tags: ,

Prototype et les interpréteurs JSON natifs des navigateurs : NATIVE_JSON_PARSE_SUPPORT

J’ai aujourd’hui expérimenté un curieux problème en essayant de mettre à jour Prototype sur un site web. Du code qui fonctionnait bien, subitement, ne fonctionnait plus avec la version 1.7.

En cherchant bien, j’ai fini pas comprendre qu’il y avait un problème avec du code JSON. Or, à première vue, ce code paraissait tout à fait correct :

{
	mode : "exact",
	elements : "textarea_bouzi_txt_index_para_1",
	theme : "advanced",
	skin : "o2k7",
	plugins : "",
	theme_advanced_toolbar_location : "top",
	theme_advanced_toolbar_align : "left",
	theme_advanced_statusbar_location : "bottom",
	convert_urls : false,
	relative_urls : false,
	forced_root_block : false,
	extended_valid_elements : "div[*],iframe[*]"
}

Pourquoi cela ne fonctionnait-il pas alors ? C’est qu’en y regardant de plus près, on voit qu’il n’est pas correct : les propriétés ne sont pas entre guillemets. Ce code (qui provient je crois de TinyMCE - c’est à vérifier) devrait donc plutôt être :

{
	"mode" : "exact",
	"elements" : "textarea_bouzi_txt_index_para_1",
	"theme" : "advanced",
	"skin" : "o2k7",
	"plugins" : "",
	"theme_advanced_toolbar_location" : "top",
	"theme_advanced_toolbar_align" : "left",
	"theme_advanced_statusbar_location" : "bottom",
	"convert_urls" : false,
	"relative_urls" : false,
	"forced_root_block" : false,
	"extended_valid_elements" : "div[*],iframe[*]"
}

Reste que cela n’explique pas pourquoi ce code, aussi erroné soit-il, ne fonctionnait subitement plus.

La réponse est que les navigateurs récents implémentent désormais d’une manière native le propre interpréteur JSON. Plus besoin de passer par une bibliothèque JavaScript JSON ; on fait simplement :

JSON.parse('["du code JSON"]');

Or, dans sa dernière version, Prototype essaye de s’appuyer sur l’interpréteur JSON natif du navigateur quand il en existe un, ceci à des fins de performance. Mais c’est là qu’il y a un problème : cet interpréteur est en général beaucoup plus rigoureux. J’ai en effet essayé avec Firefox 3.6 et Internet Explorer 9.0, et dans les deux cas, le code JSON qui n’utilise pas de guillemets pour les propriétés provoque une erreur.

Au sens strict, on ne peut pas parler d’un bug de ces interpréteurs, car le code JSON est effectivement mal formé. Cependant, il existe un grand nombre de bibliothèques qui ne rendent pas un code JSON avec les propriétés entre guillemets (comme apparemment la version de TinyMCE que j’utilise). Tout ce code fera immanquablement planter la dernière version de Prototype, ce qui est problématique.

La meilleure solution consisterait à fournir du code JSON bien formé à Prototype, mais ce n’est pas toujours possible. Reste alors une autre solution simple, consistant à downgrader prototype afin qu’il ne cherche pas à utiliser le parser natif du navigateur lorsqu’il y en a un, et le forcer à utiliser son propre interpréteur.

Pour ce faire, il y a plusieurs solutions, qui nécessitent toutes de modifier un peu le fichier prototype.js. Je les liste par ordre de préférence personnelle :

  • Remplacer la ligne 772 par :
    evalJSON: evalJSON,
  • Remplacer le bloc des lignes 535-537 par :
    var NATIVE_JSON_PARSE_SUPPORT = false;
  • Remplacer le bloc des lignes 718-721 par :
    function parseJSON() {
        var json = this.unfilterJSON();
        return evalJSON(json);
    }

Faites votre propre choix ! Même si la meilleure solution reste d’avoir du code JSON propre dès le départ :)

PHP : programmer sans erreurs du type « notice »

J’en connais certains qui aiment avoir un code PHP qui ne génère aucune erreur du type « notice« . Une erreur notice, c’est lorsque, par exemple, on essaye de traiter une variable qui n’est pas initialisée :

//$bob = "pas initialisée, c'est un commentaire";
print $bob; // cela va générer une erreur de type notice

Il ne s’agit pas d’erreur au sens propre du terme. PHP est un langage de script, beaucoup moins rigoureux qu’un « vrai » langage, comme Java par exemple. S’accorder de telles libertés dans le code ne l’empêchera pas de fonctionner. Pour ma part, un code qui générerait d’innombrable erreur de ce type notice ne me dérangerait pas. Ainsi, une solution simple pour en finir avec elle consiste à changer le niveau du rapport d’erreur. Par exemple, en tout début de code, quelque chose comme :

error_reporting(E_ALL | ~E_NOTICE);

Ou dans le fichier php.ini :

error_reporting = E_ALL | ~E_NOTICE

Cependant, cela ne fait que masquer le problème – si tant est que ça en soit un -, puisque les erreurs de ce type continuent d’exister ; elles ne sont simplement plus affichée.

Pour bien faire, la vraie solution rigoureuse consistera alors à récrire son code de façon à ce qu’il n’en génère plus. Comme la plupart de ces erreurs sont souvent dues à des variables non initialisées que l’on utilise sans les tester, une solution simple consiste à s’assurer qu’elles ont bien une valeur avant toute chose. Par exemple, le code de tout à l’heure devient :

//$bob = "pas initialisée, c'est un commentaire";
if(isset($bob))
{
	print $bob; // cela va générer une erreur notice
}
else
{
	// faire autre chose
}

On comprend que répéter ce code à chaque fois peut être facilement très fastidieux… Mais on peut s’éviter cette peine grâce à la petite fonction suivante :

function getIfSet(& $var, $default = null)
{
	if(isset($var))
	{
		return $var;
	}
	else
	{
		return $default;
	}
}

Cette fonction prend en premier argument la variable que l’on souhaite utiliser, mais dont on ignore si elle est initialisée ou non. Le deuxième argument, qui est optionnel (et est à null par défaut), est la valeur qui sera renvoyée s’il se trouve que la variable n’est pas initialisée :

//$bob = "pas initialisée, c'est un commentaire";
print $bob; // cela va générer une erreur de type notice
print getIfSet($bob); // cela ne génère pas d'erreur et n'affiche rien
print getIfSet($bob, "pas initialisée"); // cela affiche "pas initialisée"

Cette fonction sera à coup sûr très utile à tous ceux qui souhaitent débarrasser leur code de ce type d’erreurs !

Categories: PHP Tags: ,

L’expérience MagicDroid : comment avoir une application Android à succès ?

Je suis fier de vous annoncer une nouvelle application Android : MagicDroid.

Le principe est tout simple. Il s’agit d’un tour de magie reposant sur la numération binaire, qui doit être au moins aussi vieux que celui-ci.

En fait, j’ai fait cette application avant tout comme un test. En effet, le Calendrier Philosophique m’a demandé plusieurs semaines de travail intensif, alors que celle-ci seulement quelques heures. Je voulais comparer, et voir en terme de succès ce qu’il en serait. Faut-il qu’une application soit très travaillée, bien finie, repose sur un bon concept pour qu’elle soit plébiscitée ? Ou un petit truc bidouillé en quelques heures suffit-il ?

Les résultats sont sans appel, et confirme un peu ce que je soupçonnais. Je joue la carte de la transparence, et vous livre mes chers statistiques :

Calendrier Philosophique MagicDroid
Téléchargements 1070 675
Installations actives 31% 56%
Note 4 étoiles 5 étoiles
Votes 8 6
Commentaires 5 4

Sachant que j’ai fait le MagicDroid quelques semaines après : ces chiffres sont à pondérer. Reste que l’on voit que le MagicDroid, malgré ses défauts, plaît beaucoup plus ! Notamment les installations actives : cela laisse penser que beaucoup de personnes l’utilisent régulièrement !

Si vous voulez avoir du succès, laissez tomber les applications culturelles : préférez donc le divertissement !

Comme MagicDroid semble plaire dans son état actuel, je vais essayer, dès que j’aurai le temps, de la perfectionner et la rendre un peu plus intéressante. J’ai déjà quelques idées !

Categories: Android Tags:

Le calendrier philosophique : ma première application sous Android

Depuis que j’ai découvert Android, j’ai l’impression de revivre les premières émotions que j’avais connues alors que je découvrais l’informatique et la programmation il y a de ça plusieurs années : j’ai envie de développer toutes sortes d’applications. Et je viens de finir la première ! J’ai en effet collaboré avec Morbleu ! afin de mettre au point leur « Calendrier Positiviste ». Si vous avez Android, n’hésitez pas à télécharger l’application et à nous dire ce que vous en pensez !

Categories: Android Tags:

Facebook lance HipHop, un compilateur PHP

Cela n’aura pas échappé aux plus observateurs : Facebook est construit − plus ou moins − en PHP.

PHP : code interprété ou pseudo-interprété. Sur de petites, moyennes et grandes applications, c’est un langage parfait. Mais sur une application de la dimension de Facebook, qui est une énorme et gigantesque application utilisée par des millions d’utilisateurs simultanément, il est nécessaire de l’optimiser.

Facebook a mis au point une sorte de compilateur pour PHP, baptisé HipHop, qui transforme le code PHP en C++. Grâce à un système en plusieurs couches, le code que l’on écrit en PHP peut ainsi être au final compilé et gagner en rapidité.

HipHop_transformation_processTout ceci est censé être publié en OpenSource, pour le plus grand bonheur de tous, contrairement à certains autres produits bien connus…

Categories: PHP Tags: , , ,

Nouvelle version de Media Library Gallery

Nous avons le plaisir de vous annoncer qu’une nouvelle version du plugin WordPress Media Library Gallery a été publiée !

Ce plugin vous permet d’afficher toutes les images que les posts possèdent en attachement. Idéal pour créer automatiquement une galerie avec toutes les images que vous avez postez sur votre blog !

http://www.cybwarrior.com/wp-content/plugins/downloads-manager/img/icons/winzip.gif download: Media Library Gallery (209.66KB)
added: 13/12/2009
clicks: 1350
description: The very magical WordPress plugin that displays a gallery of all your image attachments! See the related Media Library Gallery WordPress page for more information. La merveilleuse extension WordPress qui affiche une galerie de toutes vos images attachées ! Reportez-vous à la page WordPress associée à Media Library Gallery pour plus d'informations.

Categories: PHP Tags: , ,

Comment mettre facilement en cache le résultat d’une fonction PHP

Voici une petite fonction PHP permettant de mettre facilement en cache ce que renvoie une autre fonction afin de ne pas avoir à l’appeler à chaque fois. Cela permet d’optimiser grandement la vitesse d’exécution des scripts lorsque ceux-ci reposent sur des traitements longs.

Pour l’utiliser, il suffit d’inclure le code du fichier lib_cache (http://www.cybwarrior.com/?file_id=73) et d’appeler la fonction cache de la façon suivante :

function pause($a)
{
sleep($a);

return ’stop’;
}

print cache(3600 * 24, ‘pause’, array(10));

Le premier argument désigne en secondes la fréquence (ou plutôt la période :-) ) à laquelle exécuter la fonction – dans notre cas, tous les jours.

Le deuxième argument est le nom de la fonction. Mais il est aussi possible de passer la méthode d’un objet : c’est très souple. Le fonctionnement repose sur la fonction call_user_func_array. Reportez-vous à la documentation pour plus d’informations.

Le troisième argument est le tableau des arguments à passer à la fonction, le premier élément contenant le premier argument, et ainsi de suite.

Un quatrième argument facultatif peut être ajouté, qui doit être une conjonction des constantes CACHE_REFRESH et CACHE_NO_REFRESH, qui respectivement force le rafraîchissement du cache ou au contraire renvoie le contenu même s’il est expiré.

Résultat : dans notre cas, la fonction prend 10 secondes à s’exécuter. Mais appelée avec la fonction cache, celle-ci n’est en fait exécutée complétement qu’une seule fois par jour, et le reste du temps, le résultat de la fonction contenu en cache est renvoyé.

http://www.cybwarrior.com/wp-content/plugins/downloads-manager/img/icons/default.gif download: PHP Cache (1.68KB)
added: 08/10/2009
clicks: 1062
description: Une fonction très utile pour mettre en cache le résultat d'une fonction PHP, afin d'optimiser son code et le rendre plus rapide en ne l'appelant à chaque fois. A very useful function which store in a cache file what an other function returns, in order to optimize the code and make it quicker.

Categories: PHP Tags: ,

Résoudre le problème de liens avec FPDF/phpToPDF

Pour créer des documents PDF avec PHP, il existe la bibliothèque FPDF. Et pour créer des documents PDF avec FPDF encore plus facilement, il existe phpToPDF.

Cependant, en utilisant cette dernière afin de créer un sommaire inséré de manière automatique dans le document, je rencontrai un problème faisant que chaque lien créé après le sommaire voyait sa zone décalée d’une page : le lien était bien ajouté et était cliquable, mais sa zone se situait une page avant.

Après avoir longuement cherché, je suis parvenu à résoudre le problème en modifiant le code de phpToPDF ainsi :

Dans la fonction insertTOC(), modifier par :

//grab it and move to selected location
$n=$this->page;
$n_toc = $n – $tocstart + 1;
$last = array();
$last_links = array();

//store toc pages
for($i = $tocstart;$i <= $n;$i++)
{
$last[]=$this->pages[$i];
$last_links[] = $this->PageLinks[$i];
}

//move pages
for($i=$tocstart – 1;$i>=$location-1;$i–)
{
$this->pages[$i+$n_toc]=$this->pages[$i];
$this->PageLinks[$i + $n_toc] = $this->PageLinks[$i];
}

//Put toc pages at insert point
for($i = 0;$i < $n_toc;$i++)
{
$this->pages[$location + $i]=$last[$i];
$this->PageLinks[$location + $i] = $last_links[$i];
}

Categories: PHP Tags: ,

PHP – Les chaînes de caractères

This entry is part 7 of 7 in the series PHP - Tutoriel

  1. Apostrophes ou guillemets ?
  2. Caractères spéciaux
  3. Here Doc
  4. Accolades

Apostrophes ou guillemets ?

Un chaîne de caractères est contenue soit entre des guillemets (« ), soit entre des apostrophes ().

Les deux lignes suivantes sont donc equivalentes :


print "Hello!";		// Avec des guillemets

print 'Hello!';		// Avec des apostrophes

Quelle est la différence ? La voici : en utilisant des guillemets, les variables contenues à l’interieur de

la chaîne seront évaluées et remplacées par leur valeur à l’instant t.

Ainsi :


$nom = "Raphaël";

print "Je m'appelle $nom";	// Sortie -> Je m'appelle Raphaël

print 'Je m'appelle $nom';	// Sortie -> Je m'appelle $nom

Caractères spéciaux

Comme en C, on peut utiliser l’anti-slash (\) pour echapper des caractères spéciaux, comme par

exemple, un apostrophe ou des guillemets :


print 'It\'s Sunday and I\'ll go to the Church';	// It's Sunday and I'll go to the Church

print "Et il lui cria : \"Bouh!\" et il sursauta";	// Et il lui cria : "Bouh!" et il sursauta

Il existe aussi des caractères qui ont une signification particulière, comme le montre le tableau ci-dessous.

On appelle ceci des séquences echapes.

Les caractères spéciaux en PHP

Sequences

Signification

\n

Nouvelle ligne (LineFeed). Caractère ASCII 10

\r

Retour chariot (Carriage Return). Caractère ASCII 13

\t

Tabulation. Caractère ASCII 9

\\

Anti-slash lui même

\$

Caractère $. Valable uniquement pour les guillemets (")

Here Doc

Ce qui est bien avec PHP, c’est que l’on peut écrire une chaîne de caractères sur plusieurs lignes :


$html = "

	<html>

	<head>

	<title>Ma page Web</title>

	</head>

	<body>

	<h2>Welcome to Paradise!</h2>

	</body>

	</html>

";

Par contre si on veut pouvoir être tout à fait libre d’utiliser n’importe quel caractère dans une chaîne,

comme les guillemets par exemple, on peut utiliser la syntaxe Here Doc heritée de Perl (que j’aime

bien :-) . On débute la chaîne par <<< et un identifiant quelconque. On écrit ensuite notre texte,

puis on termine en ré-écrivant l’identifiant choisi en DEBUT d’une nouvelle ligne, sans oublier le point-virgule

bien sur.

Par exemple :


$html = <<< MON_DOC_HTML

	<html>

	<head>

	<title>Ma page Web</title>

	<meta name="description" content="Ma Page Oueb">

	<meta name="keywords" content="paradise,web,page,perso">

	</head>

	<body>

	<h2 align="center">Welcome to Paradise!</h2>

	</body>

	</html>

MON_DOC_HTML;

Attention cependant : avec cette syntaxe, les variables sont toujours interprétées.

Accolades

Dans une chaîne avec guillemets, les accolades permettent de specifier des noms de variables comme si elles

se situées hors de cette chaîne.


$var = "N'est ce pas ?";

print "Quelle complexitée! ${'v' . 'a' . 'r'}";		// Une concatenation est effectuée 

							// lors de l'analyse

Les accolades sont également utiles pour passer des tableaux mutli-dimensionnels (que nous verrons plus tard) :


$ar = array();

$ar[] = array("fou");

print "C'est $ar[0][0], non ?";		// Provoque une erreur

print "C'est {$ar[0][0]}, non ?";	// OK!
Categories: PHP Tags: