Archive for the 'développement' Category

juillet 28th 2010

Parlons binaire mais parlons bien

Bonsoir à toutes et à toutes. Je sais, je n’ai pas posté depuis la naissance de mon dernier stagiaire (fake story, si vous voulez savoir). Mais comprenez-moi, j’ai un agenda de chinois du FBI. Du coup, c’est entre 2 exécutions que je prend le temps de publier un petit billet absolument inutile. Mais marrant. Mais inutile quand même.

Aujourd’hui donc, nous allons apprendre à passer pour des gros nerds encoder du texte en binaire !

Tout d’abord, si vous cherchez une explication complète sur le système binaire, allez vous faire voir sur Wikipedia. Ce que je vais vous présenter est un script de conversion binaire/textuel. Ce qui implique une seconde étape, en réalité, car vous n’ignorez pas que le système binaire n’est rien de plus qu’un système numérique, et que par conséquent, tout nombre binaire ne reste qu’un nombre. Il faut donc savoir convertir des chaînes de caractères en nombres. Pour cela, on va utiliser la table ASCII, qui associe à chaque nombre de 0 à 127 (ce qui représente 7 bits, mais est écrit sur 8 par principe) un caractère (alphabet en casses haute et basse, chiffres, ponctuation, caractères de contrôle…). Problème, cette table ne contient aucun caractère accentué, ou ponctuation exotique… La solution est donc d’utiliser l’UTF-8, qui est défini sur 8 bits (donc, un octet). Il permet donc de représenter potentiellement tout caractère utilisable, dans toutes les langues existantes (sur Terre, je préfère le préciser). Ainsi, il nous est possible de convertir chaque caractère d’une chaîne en représentation binaire sur 8 bits, et donc, notre conversion est faite ! C’est aussi simple que ça. Et stupide, je vous l’accorde.

Avant toute chose, posons-nous une question d’importance :

À quoi ça sert ?

Ha, ha, ha. À rien de constructif. À passer pour un con, à se croire supérieur, à me servir d’excuse pour publier un billet tant attendu par mon public conquis. Mais aussi à cacher des messages dans d’autres, par exemple : imaginez un texte dont les premières lettres de lignes, converties en 0 ou 1 selon qu’elles soient voyelles ou consonnes, formeraient un message « secret » à déchiffrer par cette méthode ? C’est un peu la base de la stéganographie, et ça peut être rigolo.

Alors, on fait comment ?

J’y viens, ne poussez pas. Veuillez considérer la complexité malsaine du script ci-dessous :

< ?php

//Cette fonction décode une chaîne binaire (mise en forme avec des espaces ou non)
function bin2str($bin) {
$bin = str_replace(' ', '', $bin); //On se débarasse des éventuels espaces, utiles uniquement à la mise en forme
$string = '';
for($i=0;$i<strlen($bin);$i = $i+8) { //On découpe la chaîne en octets, qu'on traitera les uns après les autres
$string .= chr(bindec(substr($bin, $i, 8))); //Ici, le substr récupère effectivement l'octet qui nous intéresse; bindec le convertit en binaire (exemple : 00101111 => 47), et chr donne le caractère correspondant à cet index dans la table UTF-8)
}
return $string;
}

//Cette fonction transforme une chaîne de caractères quelconque en représentation binaire, et scinde cette représentation en octets pour faciliter la présentation
function str2bin($string) {
$bin = '';
for($i=0;$i<strlen ($string);$i++) { //On encode les caractères un à un, donc on parcourt l'intégralité de la chaîne
$bin .= str_pad(decbin(ord($string[$i])), 8, '0', STR_PAD_LEFT).' '; //La fonction ord() renvoie l'index (décimal) ASCII du caractère demandé; ensuite, on le convertit en binaire, puis on remplit de 0 sur la gauche jusqu'à obtenir une chaîne de 8 caractères (un octet valide). Puis on rajoute un espace pour faciliter la mise en forme
}
$bin = substr($bin, 0, -1); //On supprime le dernier espace
return $bin;
}

//Nous avons un seul formulaire, avec 2 actions possibles : celle à exécuter dépend du bouton "submit" cliqué (sa value est transmise, et on récupère le nom du bouton cliqué)
if(isset($_POST['act_bin'])) { //On traite le décodage du binaire
if(!empty($_POST['bin'])) { //Vérification de l'existence de la donnée
if(preg_match('/^[01 ]*$/', $_POST['bin'])) { //On s'attend à du binaire, donc on renvoie une erreur si ça n'en est pas
$bin = $_POST['bin'];
$str = bin2str($bin);
} else {
$warn = 'Format invalide.';
}
} else {
$warn = 'Veuillez entrer une chaîne binaire.';
}
}
if(isset($_POST['act_str'])) { //On traite la conversion en binaire
if(!empty($_POST['str'])) { //Vérification de l'existence de la donnée
$str = $_POST['str'];
$bin = str2bin($str);
} else {
$warn = 'Veuillez entrer une chaîne de caracères.';
}
}

?>
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Conversion chaîne-binaire</title>
<style type="text/css"> /* mise en forme basique, inutile d'utiliser un CSS externe pour ça */
.warn { color: red; font-weight: bold; }
fieldset { margin: 10px; float: left; width: 300px; }
fieldset textarea { width: 100%; }
</style>
</head>
<body>
< ?php if(isset($warn) &amp;&amp; !empty($warn)) echo '<p>'.htmlspecialchars($warn).''; //Si un message d'erreur a été défini, on l'affiche dans un rouge effrayant ?>
<form action="bin.php" method="post">
<fieldset> <!-- subtilité : nous avons 2 fieldsets, chacun contenant un bouton "submit". Selon le bouton utilisé, on appelle une fonction ou l'autre -->
<legend>Chaîne</legend>
<textarea name="str" cols="25" rows="10">< ?php if(isset($str) &amp;&amp; !empty($str)) echo htmlspecialchars($str); ?></textarea>
<input type="submit" name="act_str" value="Convertir &amp;gt;&amp;gt;" />
</fieldset>
<fieldset>
<legend>Binaire</legend>
<textarea name="bin" cols="25" rows="10">< ?php if(isset($bin) &amp;&amp; !empty($bin)) echo htmlspecialchars($bin); ?></textarea>
<input type="submit" name="act_bin" value=" &amp;lt;&amp;lt; Convertir" />
</fieldset>
</form>
</body>
</html>

Voilà, c’est tout commenté et propre, et vous pouvez tester le convertisseur en ligne ici. Utilisable si un con (moi) se met à écrire en binaire sur un forum.

5 Comments »

décembre 4th 2009

Parlons de vous…

Je vous ai bien eu, chenapans ! Non, je ne parlerai pas de vous, mais d’eux. J’entend par là les personnes avec qui j’ai pu travailler ces derniers temps. Ou pas si derniers, étant donné la fréquence de mises à jour de ce blog.

Pour commencer sobrement, voici naturoforme.fr. Naturoforme est le site de présentation d’un naturopathe, dont l’activité s’apparente visiblement à l’art d’ôter la vie à des innocents par le biais de plantes ou de méthodes naturelles : ingestion de scorpions, strangulation à la liane, tortures à l’hortie, et moultes techniques ninjas permettant de tuer en appuyant à divers endroits rigolos sur le corps.

Mais comme tout bon assassin, celui-ci prétend que son art repose sur les soins naturels, à base d’huiles essentielles (ingénieux terme utilisé pour cacher le fait qu’il se débarrasse des corps en les arrosant d’essence, puis en lançant dessus un félin embrasé), de remèdes à base de plantes (empoisonnées, est-il nécessaire de le préciser), de diverses manipulations manuelles sur la viande des victimes, pardon des patients… Suivez mon conseil, posez-vous des questions la prochaine fois qu’on vous parle d’acupuncture, et que votre praticien est affilié à un boucher, et passe ses dimanches à la chasse.

Ceci dit, force est d’admettre que je ne suis pas peu fier d’avoir un tueur en série dans ma famille. Car oui, il s’agit de mon père (qui, comme tout bon assassin, a le bon goût de pouvoir aveugler ses victimes en faisant réfléchir la lumière du soleil sur son cuir non chevelu), que j’ai massivement arnaqué aidé dans le déploiement de sa nouvelle activité, en concevant son site. Celui-ci ne présente rien de bien particulier, je ne me suis pas chargé de la partie graphique, préférant reléguer cette tâche.

edit : alors que je voulais initialement glisser une référence obscure, dans le but de ne pas porter directement atteinte à une personne en la citant explicitement, je me suis rendu compte que le lien était en fait évident, étant donné que le site Naturoforme indique précisément ses auteurs. Suite à la demande (peu cordiale) de la personne concernée, je retire donc le paragraphe qui en fait référence.

Avant que j’oublie et que je passe à un autre sujet, je tiens toutefois à faire remarquer la navigation fluide sur le site Naturoforme. Comme vous pourrez le remarquer en visitant le site, car je sais que vous allez le faire, les pages se chargent avec un bel effet de fondu. Concrètement, c’est de l’AJAX, mais intégré de façon (quasi) totalement transparente : quasiment aucune modification côté affichage ou serveur n’est requise, seulement une inclusion de fichier, une classe CSS sur les liens internes à « ajaxer » (j’aurais pu l’améliorer et cibler automatiquement tous les liens internes, sauf les exceptions protégées, elles, par une autre classe), et environ 5 lignes de code sur chaque page côté serveur. Et paf, pastèque, tout le site est en AJAX ! Ça marche aussi pour les formulaires, ce qui est bien plus utile : on valide le formulaire en direct, les éventuelles erreurs sont affichées immédiatement sans perdre le reste de la page, et tout est beau et les oiseaux gazouillent gazouillent. Pour l’effet de fading, c’est appliqué sur tous les liens, pour le fun.

Bon, concrètement, l’utilité sur ce site est purement visuelle. Il faut néanmoins savoir que la navigation sans Javascript est parfaitement fonctionnelle, et c’est là que mon système est, à mes yeux, intéressant. Aucun INpact négatif sur le référencement à cause de l’AJAX (Google et autres ne suivant pas le fonctionnement de l’application JS). Pour l’anecdote, ce système avait été initialement développé pour un site présentant un lecteur audio, et donc le visiteur devait pouvoir naviguer librement sans perdre la chanson qu’il écoutait.

Ça fait un moment que j’écris sans illustrer mon propos, donc voici une random image :

Random Encounter

Random Encounter

Ce n'est certainement pas un caillou.Nous allons maintenant passer à autre chose. Il ne me semble pas avoir encore parlé d’Evelyz, graphiste/illustratrice très douée, importée d’Ardèche, et semi-poilue. J’ai eu le plaisir de travailler avec elle, jusqu’à ce qu’un rachat peu scrupuleux de société l’évince avec bien peu de ménagement (et que j’en profite pour démissionner en laissant tout le monde dans la merde, haha quelle rigolade). Je l’ai aidée à déployer un fort joli blog, que je suis fier aujourd’hui de présenter, l’occasion m’en étant donnée par la découverte de la page « crédits » de son blog, illustrée tout comme le reste du site. Avec l’aimable autorisation de l’artiste, je publie ici une partie de cette illustration, représentant votre peu aimable hôte (je pourrais faire une blague avec « host », mais il est probable que ce soit à peu près aussi drôle qu’un « Snoop doggy dog, alors qu’est-ce qu’on attend ?« , donc je m’abstiendrai pour cette fois).

Quoi qu’il en soit, je remercie bien aimablement Evelyz pour cette superbe illustration, malgré le fait qu’elle m’ait honteusement dépeint comme Ubuntero, et également pour son blog, qui est un délice pour les yeux.

Sans transition, on passe à la suite, avec un peu de pub. Pas réellement, en fait, mais c’est gratuit, je suis comme ça moi, je partage mes adresses. Concrètement, et comme vous le savez déjà si vous avez lu le début de cet article (si ce n’est pas le cas, je me demande vraiment pour quelle raison vous décidez de lire les articles en commençant par le milieu), j’ai démissionné, et donc changé d’employeur (mais pas de bureaux, ce qui constitue une certaine forme d’EPIC WIN, du moins en ne tenant pas compte de l’état de délabrement avancé de la rue dans laquelle je bosse). Travaillant maintenant dans une agence bien plus orientée développement, je dois dire que ce n’est pas un mal. Pour l’anecdote, il s’agit de la première boîte dans laquelle j’avais travaillé, il y a environ 5 ans de cela, en tant que misérable stagiaire. C’est là que j’avais appris les valeurs du Web, telles que l’accessibilité, le respect des standards et l’interopérabilité. Quoi qu’il en soit, les associés à l’origine de cette société ont décidé de se lancer dans un projet de très grande envergure, et ont créé WiziShop. Très basiquement, c’est une plate-forme de e-commerce. Dans le détail, vous pouvez en quelques clics ouvrir une boutique (comme un gamin inintéressant ouvrirait un Skyblog pour raconter sa vie de merde comme je le fais), la paramétrer (le tout avec une interface que je trouve très agréable et intuitive), et, après quelques formalités, commencer à vendre tous types de produits en ligne. Cela ne dispense évidemment pas de devoir gérer ça comme une vraie boutique, mais, pour qui veut se lancer dans le e-commerce, c’est une solution extrêmement intéressante. Car, au-delà de la possibilité de mettre sur pied une boutique en quelques clics, il n’y a aucun frais de mise en service, et le modèle économique se base uniquement sur un petit pourcentage du chiffre d’affaires hors taxes et hors frais de port du vendeur. Le risque financier est donc réellement nul. Evidemment, on pense tout de suite à des frais cachés, comme des modules payants (et quasiment obligatoires), etc, mais il n’en est rien. L’équipe travaille continuellement à de nouvelles fonctionnalités qui sont proposées gratuitement aux vendeurs, comme un guide d’achat, WiziShopping, mis en place il y a quelques mois, et référençant gratuitement les produits des WiziShoppiens. Ce terme n’est pas de mon invention, et dénote le fait qu’une réelle communauté s’est créée derrière la marque, ce qui booste le potentiel d’évolution.

Tout cela ressemble honteusement à de la pub, je sais, mais c’est en toute honnêteté que je dis ça : je suis impressionné de voir tourner Wizishop, et, force est de constater, ça marche bien. Donc, ne serait-ce que par curiosité, allez voir comment c’est fait. Et, pour vos achats de Noël, WiziShopping est une mine d’idées avec son moteur de recherche spécial cadeaux.

Voilà, je vous laisse avec ce texte à digérer, et un teaser pour le dessert : j’aurai bientôt un nouveau site tout neuf à vous annoncer, bien plus personnel que ceux présentés plus haut. ???????????? ? ???? ! (ça veut dire « restez à l’écoute, en biélorusse)

2 Comments »

novembre 26th 2009

La grande vague

D’aucuns pourraient avancer, non sans raison, que je cherche, en publiant ce billet, à m’attirer les foules de non-VIP Google, c’est à dire les morts de faim qui cherchent à recevoir des invitations Google Wave, et qui le font savoir, sur Twitter ou autre.

Pour expliquer vite fait, sachez que Google Wave est un nouvel outil de communication, collaboration, etc. Notez le « etc », très important. Car Wave (on va l’appeler par son petit nom) est un OVNI, un concept, un briquet, voire une poutre ! Imaginez une seconde un forum de discussion, dans lequel tous les participants à un sujet peuvent répondre à n’importe quel message, sans que leur réponse s’inscrive dans le flux linéaire… Je suis peut-être un poil complexe (si ça me dérangeait de ne pas être compris, ça se saurait).  Donc, je vais tenter d’expliquer en images.

La fenêtre principale de Google Wave

Là, vous voyez les enfants ? C’est Google Wave (woaaaaa !) Ce qui m’amène à préciser que Wave est une web app, c’est à dire une application qui se lance directement dans le navigateur, sous la forme d’un site web (donc accessible depuis n’importe quel poste). On peut reconnaître au passage une build linux de Chromium. L’interface rappelle vaguement Gmail, le webmail de Google. Il est à noter que les fenêtres peuvent se réduire, de sorte à optimiser l’affichage selon ses besoins (exemple ci-dessous)

Une disposition de fenêtres de Google Wave

Comme on peut donc le voir, ici les onglets « navigation » et « contacts » ont été réduits en haut, ce qui est pratique lorsque l’on participe à une wave assez dynamique. Il est également possible de réduire pareillement la fenêtre « inbox », afin de consacrer un maximum de place à la wave. Petite précision, ce que j’appelle wave ici (sans majuscule) est la « discussion », ou le « travail collaboratif ». Un sujet, en quelque sorte. Les messages composant ce sujet sont appelés « blips ». C’est assez rigolo, si vous voulez mon avis.

Continuons, voulez-vous ? En passant sous silence les deux fenêtres de gauche, assez explicites à mon goût, nous pouvons observer la fenêtre de liste (sur le screenshot, montre la « inbox », c’est à dire les waves actives auxquelles on participe).

La liste des waves

Comme pour Gmail, il est possible de cliquer sur une wave pour l’ouvrir sur la droite, mais également d’archiver, marquer comme spam, etc, une wave. On peut noter, dans la liste, que plusieurs vignettes apparaissent à gauche d’une wave. Elles symbolisent les participants. Car, lorsqu’on crée une wave, on y attribue des participants (ce qui peut aussi être fait à tout moment par les participants), qui pourront lire et écrire dans la wave. Ou faire plein d’autres trucs, vous allez voir.

Observons deux papillons. La dernière fenêtre, pardon. La sacro-sainte fenêtre contenant la wave ! (tadaaaaa)

Le contenu d'une wave

C’est là que ça se (John_) corse. Là qu’on se rend compte qu’en fait, ça ne ressemble pas vraiment à un thread de forum, ou à une fenêtre de conversation Jabber. C’est bien plus que ça. Comme je l’ai déjà dit, une wave est composée de blips, et les blips peuvent contenir toute forme de contenu : du texte, mis en forme ou pas, mais aussi des images, des vidéos, une carte interactive (se basant, de façon fort surprenante, sur Google Map) sur laquelle les participants peuvent poser des points, tracer des figures, etc. Mais chez Google, on ‘est pas (totalement) sectaire, ainsi vous pouvez insérer un « gadget » sous forme d’une URL (qui pointera, bien sûr, sur une ressource compatible), et qui n’est limité que par l’imagination. En plus de ça, car jusque là, ce n’est pas vraiment révolutionnaire, sachez qu’il est possible de répondre à la suite des blips, mais aussi à un blip particulier (la réponse s’affichera en retrait sous ce blip), mais, et c’est très amusant, à un mot au sein d’un blip ! Dans ce cas, le blip réponse sera symbolisé par une petite bulle permettant d’afficher ou non la réponse (pour un souci de lisibilité). Ainsi, on peut répondre à n’importe quoi, et c’est un aspect très pratique, car il est alors possible d’utiliser l’outil pour collaborer sur l’écriture d’un document (on va écrire les sujets principaux, puis développer en répondant aux éléments en question, etc). On comprend vraiment l’utilité en l’utilisant. Par ailleurs, il est possible pour chacun des participants d’éditer tous les blips. J’entend déjà les forumeux crier au scandale, mais il faut se rappeler qu’une wave n’est pas publique (enfin, il est possible de la rendre publique, mais par défaut, elle est limitée à ses participants), donc je ne pense pas que ça puisse poser de problèmes (attention : pour l’instant, il n’est pas possible de supprimer un participant, la fonction est en cours d’implémentation).

Détail amusant, faute d’être réellement utile pour l’instant : lorsque l’on édite un blip, tous les participants nous voient taper en direct \o/ En fait, c’est assez pratique lorsqu’on travaille à plusieurs sur le même blip.

En plus de cette preview, qui je l’espère éveillera votre curiosité, vous pouvez lire l’excellent guide disponible ici.

Enfin, pour l’instant, Google Wave est en preview fermée. C’est à dire qu’il faut recevoir une invitation pour tester le bouzin. J’ai reçu récemment plein d’invitations à distribuer, et je vous propose de vous les vendre 600€ chacun. Ou pas, comme beaucoup sur la blogosphère, je les offre. Il suffira de poster un commentaire sous cet article, en renseignant une adresse e-mail valide (elle ne sera pas publique). Je choisirai arbitrairement les heureux gagnants. A l’heure actuelle, j’ai 12 invitations à distribuer, alors battez-vous farouchement pour les obtenir !

Et, pendant que j’y pense, je reviens sur ce que j’ai dit plus haut : « chez Google, on n’est pas (totalement) sectaire ». Raison de plus pour dire ça, Google Wave sera, à sa sortie, distribué sous licence libre ! C’est à dire que Wave, qui est en réalité un « protocole », d’après les dires de Google, sera librement utilisable, et des clients et serveurs alternatifs pourront naître partout, tout comme il sera possible d’installer « Google Wave » (l’interface web qu’on connaît aujourd’hui) sur son propre serveur, pour un réseau décentralisé, sur lequel on aura le contrôle total. Ce qui est, à mon sens, une excellente nouvelle, même si on peut légitimement se demander quel est l’intérêt de Google derrière tout ça (Wave, Chromium, Chromium OS, le nouveau langage Go, le nouveau protocole web, etc…). Je pense qu’on ne pourra pas le deviner en débattant sur les commentaires d’un blog, donc attendons.

Donc là, vous êtes devant un gros pavé de texte, vous avez eu la flemme de lire, et donc vous n’avez pas vu que je distribuais 12 invitations pour participer à la preview de Google Wave ! Je suis vraiment méchant :D

2 Comments »

décembre 6th 2008

Pixels§

Je sais ce que vous allez dire. Ou plutôt, je n’en ai pas la moindre idée et de toutes façons ça ne m’intéresse pas, mais j’ai semé le doute dans vos faibles esprits qui se sont immédiatement dit « OMG HAX ».

Quoi qu’il en soit, les plus pertinents auront remarqué non sans une once de vérité, qu’il y a longtemps que je n’avais plus écrit ici. La première raison étant que je n’avais toujours pas de connexion chez moi, et qu’étant donné que le réseau 3G passe assez mal par ici, j’avais la flemme d’écrire des pavés sur mon téléphone.

Mais que d’excuse, mes chers amis, cela fait maintenant 2 semaines que je peux à nouveau virevolter joyeusement sur le Réseau des Réseaux (profitez, vous aussi, on n’aura plus cette chance pour longtemps). Et aucun article ! Mais Foutrelama, me direz-vous, que vas-tu encore inventer, impie créature, pour encore une fois renier ton devoir ? C’est là que je suis censé répondre, mais j’utilise mon joker du TPPT.

Donc, ça, c’est fait… Ha, le monsieur du fond a une question ? Oui, je vous écoute. « pourquoi ce titre ? » Haha, mon bon monsieur, vous êtes bien stupide. Ou l’inverse, je ne sais plus. Il serait bien incroyable que mes mots aient une quelconque corrélation entre eux. Et pour preuve, ils en ont. Pour la petite histoire, hier soir, seul au fond de mon lit, terrorisé par ces connards de fantômes, j’ai eu une lumineuse idée, et croyez-moi, c’était une idée qui était lumineuse. En effet, il faut bien l’avouer, je regrettais de ne pas plus m’occuper de ce blog. Et j’avais depuis un certain moment envie de créer moultes et moultes expérimentations HTMListiques de tous genres. L’une d’entre elles était de jouer avec des pixels. Comme vous pouvez le constater, il est possible de m’émerveiller à moindre coût.

Ainsi, aujourd’hui, par un virulent moment de solitude, j’ai pris mon courage à demain, et, après être revenu dans le passé à cause de ce pitoyable jeu de mots, je me suis penché sur le problème, qui n’existait pas. Je pourrais passer des heures à me demander la raison qui m’a poussé à développer quelque chose d’aussi inutile, mais il me faudrait ensuite réfléchir à la raison de cette réflexion visiblement inutile. Nous omettrons donc toute considération logique de mon oeuvre.

Passons donc, car vous le voulez bien, aux choses sérieuses : voici une image :

Le fruit de mon travail, ne vous moquez pas je vous prie.

Le fruit de mon travail, ne vous moquez pas je vous prie.

C2QUOI LOL ? J’ai intitulé ça « cet homme ne sait pas quoi faire de son temps libre ». Très concrètement, à l’état initial est générée une matrice de points (le carré à gauche), avec pour chaque point une couleur aléatoire. Ensuite, un de ces points est déterminé au hasard, sous contrôle d’huissier. Sa couleur deviendra le centre d’une « cristallisation » des autres points. Concrètement, le programme effectuera un tri sur la matrice en fonction des couleurs, pour rapprocher les points de couleur semblable. Passons les détails techniques, une fois la matrice triée, elle est redessinée. Et ça fait un sublime dégradé ! Génial, non ? Ça sert à quoi ? À rien.

Vous pouvez tester vous-mêmes le script, si vous avez une confiance sans failles dans votre navigateur, à cette adresse. Je vous préviens tout de même : plutôt que de dessiner la matrice dans une image avec GD, j’ai trouvé amusant d’effectuer le rendu en XHTML pur. Ce qui résulte en 45 002 blocs à afficher (outre les calculs de tri sur le serveur), et, si l’on en croit les râles qui s’échappent de ma mémoire vive, ça picote ardemment le browser. S’il me vient un jour la folle envie de continuer ce script, je tâcherai de dessiner le rendu avec GD, ou bien d’utiliser l’AJAX pour calculer dynamiquement les matrices selon le point souhaité par l’utilisateur. Espérons, pour notre bien à tous, que j’aurai d’ici là trouvé d’autres occuppations plus intéressantes.

2 Comments »

novembre 21st 2008

Le tri des déchets pour les geeks

<?php

$sourceXML = <<<EOT
<?xml version="1.0" encoding="UTF-8" ?>
<trash>
    <waste type="glass" />
    <waste type="paper" />
    <waste type="organic" />
    <waste type="paper" />
    <waste type="glass" />
    <waste type="paper" />
</trash>
EOT;

$sheetXML = <<<EOT
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" method="xml" encoding="UTF-8"/>
    <xsl:template match="/">
        <xsl:apply-templates select="trash" />
    </xsl:template>
    <xsl:template match="trash">
        <trash>
            <xsl:apply-templates select="waste">
                <xsl:sort select="@type" data-type="text" />
            </xsl:apply-templates>
        </trash>
    </xsl:template>
    <xsl:template match="waste">
        <waste>
            <xsl:attribute name="type">
                <xsl:value-of select="@type" />
            </xsl:attribute>
        </waste>
    </xsl:template>
</xsl:stylesheet>
EOT;

$sourceDoc =new DOMDocument();
$sourceDoc->loadXML($sourceXML);

$sheetDoc =new DOMDocument();
$sheetDoc->loadXML($sheetXML);

$proc = new XSLTProcessor();
$proc->importStyleSheet($sheetDoc);

$resultDoc = $proc->transformToDoc($sourceDoc);
$resultDoc->formatOutput = TRUE;

echo $resultDoc->saveXML();

?>

OUI je sais, j’ai déjà publié ça sur Facebook. Mais je pense que ça a plus sa place ici, tout compte fait. Et puis Facebook indexe mon flux RSS, donc ça revient au même.² Ceci dit, il est bien plus agréable de trier les déchets que les dates, croyez-moi.

No Comments yet »

juillet 25th 2008

Une petite fonction de génération de mot de passe aléatoire

Aller où ? à Toire ? Connais pas. Bref, une fois n’est pas coutume, revenons à nos caméramans.

Je vais donc vous présenter ici-bas, en sus d’un superbe plugin de mise en forme de code déniché ici pour l’occasion

< ?php
function genRandomPass($level = 3) {
switch($level) {
case 1:
$passLen = mt_rand(6, 8);
$charList = 'abcdefghijklmnopqrstuvwxyz0123456789';
break;
case 2:
$passLen = mt_rand(8, 10);
$charList = 'abcdefghijklmnopqrstuvwxyz0123456789.@-_';
break;
case 3:
$passLen = mt_rand(10, 12);
$charList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:?/!@&amp;amp;-_*$%';
break;
default:
$passLen = mt_rand(10, 12);
$charList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:?/!@&amp;amp;-_*$%';
break;
}
$password = '';
for($i = 0; $i < $passLen; $i ++) {
$password .= $charList[mt_rand(0, strlen($charList))];
}
return $password;
}
?>

Donc ça c’est la fonction en dur et non commentée : voici en détail son fonctionnement :

  • Tout d’abord, on déclare la fonction avec un argument entier attendu, initialisé par défaut à 3 : il s’agit du niveau de sécurité procuré par le mot de passe souhaité.
  • Ensuite, une boucle switch testera la valeur de cet argument, pour définir les paramètres de génération du mot de passe : on voudra, dans tous les cas, une chaîne de caractères générée aléatoirement. La longueur des chaînes pourra être aléatoire elle aussi, pour pouvoir générer des mots de passe moins prévisibles. La différence entre les niveaux se situera donc essentiellement dans ces deux lignes variant selon le niveau (un niveau autre que 1, 2 ou 3 se verra traité comme un niveau 3) :
    $passLen = mt_rand(10, 12);
    $charList = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.,;:?/!@&amp;amp;-_*$%'

    La première ligne définit la longueur de la chaîne, qui sera donc comprise entre 10 et 12 caractères. La seconde définit les caractères utilisables, ici des lettres minuscules et majuscules, des chiffres, et des signes de ponctuation, pour varier les choix.

  • Ensuite vient la génération à proprement parler : pour chaque caractère du futur mot de passe (dont la longueur est, comme vu ci-dessus, aléatoire), on concatène un caractère aléatoire de la chaîne $charList
  • On renvoie ensuite bien évidemment le mot de passe généré

Bref, on a là une fonction très simple, légère, et qui permet une personnalisation assez poussée : on peut facilement ajouter de nouveaux niveaux, modifier ceux existants, etc… Bien sûr, rien d’exceptionnel, mais je me suis dit que ça pouvait être utile à quelqu’un… Pour ceux qui souhaiteraient tester le script, le voilà en application ici.

3 Comments »

juillet 12th 2008

Projets du jour

Une fois n’est pas coutume (costume non plus d’ailleurs), je vais rester sérieux pour parler de plusieurs projet sur lesquels je planche en ce moment, et qui seraient susceptibles de vous intéresser, sans quoi bien sûr cela ne servirait à rien d’en parler, mais je suis plus à ça près. Ce ne sont que des projets personnels, que je partage avec des amis, et qui n’en sont pour l’instant qu’à un stade de conception plus ou moins avancée.

  • Pour commencer, le projet Roll-list, qui est un projet dont peu d’infos doivent filtrer à ce stade. Il concerne Frantz et moi. Sachez tout de même qu’il s’agit d’un projet pour les rôlistes, comme son nom pourrait sembler l’indiquer. Actuellement, on pourrait dire qu’il est en développement, je vous tiendrai informés dès que quelque chose sera mis en ligne.
  • Dans la continuité de Roll-list, il y a un autre projet qui lui n’en est qu’à ses balbutiements. Il n’est pas encore nommé, seul le concept est défini, et vous comprendrez aisément que je ne pourrai donner aucune information supplémentaire à ce sujet.
  • Dans un tout autre cadre, bien que ça puisse à l’avenir concerner les projets précédents, il s’agit d’un projet également en phase de conception, mais qui pourrait voir le jour bien plus vite. Le nom sera communiqué ultérieurement, mais sachez qu’il s’agira d’un RPG (jeu de rôle) sur navigateur, comprenez sous la forme d’un site web, mais très différent de ce qu’on peut trouver actuellement (des jeux de stratégie/gestion, principalement, mais aussi certains jeux axés RPG sur le thème d’une quelconque guerre). Restez dans le coin donc, il se pourrait que j’aie plus à vous en dire prochainement. (waa, comme je gère les annonces vides)
  • Enfin, et là il s’agit de plusieurs idées de projets, mais dont je peux parler aisément : divers services d’hosting de différents types (images, liens, pourquoi pas blogs…). Pour l’instant rien n’est sûr, je m’occupperai de ces hypothétiques projets selon la demande de mes connaissances.

Et voilà, en fait y’avait pas grand chose à en dire, mais au fur et à mesure de l’avancée, je laisserai filtrer plus d’informations, en attendant leur mise en service.

No Comments yet »