Aller au menu - Aller au contenu

Voici le blog de : Lpu8er

Tech @ All

Recherches et avis personnels sur les technologies Web.

jQuery, images, map et contextMenu

Un bug dont je me suis aperçu récemment m'a sidéré.

Cela concerne ici un événement ô combien tapageur, intrusif, et anti-accessible : contextmenu. Cet événement est lancé lors de l'appel au menu contextuel (généralement par le clic droit, mais pas seulement : laissez votre souris sur un élément de la page, et tapez la touche généralement située entre AltGr et Ctrl Droite, représentant... un menu), et répond aux classiques.

En effet, en plaçant un handler sur cet événement (ou listener, appellez ça comme vous le souhaitez) sur un élément de la page, on effectue une action (généralement afficher son propre menu contextuel), puis le retour définit si on laisse la main au menu contextuel du browser ou non (true/false). C'est le principe de propagation des événements.

Lorsque l'on place un événement onclick sur un lien. Je parle de le placer de façon "correcte", c'est à dire avec du javascript "non-intrusif", via addEventListener ou un équivalent sous votre lib préférée. Cliquez sur le lien. Miracle, ça marche. Placez un listener de la même façon sur le même event mais sur la page. Cliquez sur le lien : cela marche. C'est un principe simple:
Lorsque l'on place un événement sur un élément, cet élément capture en premier l'événement qui lui est associé
Non seulement ça coule un peu de source, mais ça semble logique. Placez maintenant ce lien en position absolue sur la page : cela marche toujours.

J'en viens à notre cas : l'association map/area/img.
On utilise les maps afin de "placer" une carte virtuelle, une espèce d'overlay sur une image. On règle l'attribut name de la map, on règle nos différentes "zones réactives" via des balises area dans la map, qui précisent la forme (attribut shape) et surtout les coordonnées de cette forme sur la carte.
Puis, on place la carte sur l'image en associant les deux, via l'attribut usemap de la balise img qui fait une référence un peu bizarre (avec un dièse devant, chose normalement réservée aux IDs) au name de la map.
Les areas sont réactives : elles peuvent posséder un attribut href réagissant comme le href des balises a. Elles sont susceptibles de capter le clic, le survol de la souris, etc. Tout laisse à penser qu'elles réagissent comme notre petit lien de tout à l'heure.

Maintenant, testez de placer un handler d'événement contextmenu sur une area.
En javascript non-intrusif.
Firefox, Opera : okay. Pas de soucis.
IE : ah, tiens. Pas d'erreur. Menu contextuel de base. Si on va plus loin, on voit que IE ne passe même pas par l'événement contextmenu de l'area.

Maintenant, ajoutez un handler d'événement contextmenu sur l'image.
En javascript non-intrusif.
IE : ah, tiens, celui-ci il le voit. Areas ou non.
Firefox, Opera : il voit l'event sur les areas, et celui sur l'image de manière indépendante.

Et à présent, retirez le handler d'événement contextmenu des areas...
En javascript non-intrusif.
IE : pas de changement.
Firefox, Opera : WTF ?? L'événement n'est pas pris en compte sur les area.

Explication ?
Firefox, Opera & consorts placent la map comme un overlay plein. Ou plutôt, les areas. C'est comme si vous aviez placé de vieux blocs en position absolute sur la page. Ces blocs "interceptent" donc l'événement. Et là où c'est vicieux, c'est que même si aucun gestionnaire n'est présent, et donc que l'événement répond aux classiques, il n'est pas propagé à l'élément "en-dessous".
IE, lui, ne place absolument pas la map (ou les areas) en overlay. Il effectue une espèce de mapping des formes et des coordonnées, pour capturer certains (pas tous... j'ai pu constater que le clic et le survol fonctionnaient) événements.
Mais pas le contextmenu.

J'ai naïvement tenté de modifier le z-index, l'ordre html des balises... Rien à faire, c'est implémenté coté comportement général.

La seule solution que j'ai finalement trouvé : surveiller les événements contextmenu sur toute l'image, vérifier les coordonnées par rapport aux area d'une éventuelle map, pour exécuter une fonction de callback. Je sette également un handler sur chaque area pour capturer le cas "hors IE".
En somme, ce patch corrige un comportement différent sous IE et autres... comportement qui ne devrait pas être.

Le patch:
var oldPatchContextArea = function(xmc, ymc, callback) {
var found = null;

// get areas
var listAreas = $('area');
listAreas.each(function() {
var xcrds = $(this).attr('coords').split(',');
var xsc = xcrds[0];
var ysc = xcrds[1];
var xec = xcrds[2];
var yec = xcrds[3];

if((xmc > xsc) && (xmc < xec) && (ymc > ysc) && (ymc < yec)) { found = $(this).attr('id'); } }); if(found != null) { callback($('#'+found)); } return (found == null); }; var setupPatchContextArea = function(callback) { // get all bind images $('img[usemap]').each(function() { // if map has some special class, watch it if($(this).hasClass('contextMenuAreas')) { // setup image AND areas context menu event $('#'+$(this).attr('id')).bind('contextmenu', function(e) { return oldPatchContextArea((e.pageX - $(this).offset().left), (e.pageY - $(this).offset().top), callback); }); // get map name var mapName = $(this).attr('usemap').replace('#', ''); $('map[name='+mapName+'] area').bind('contextmenu', function() { return callback($(this)); }); } }); };

Pour l'initialiser:
setupPatchContextArea(votreFonctionDeCallback); // au chargement ou autre

Limitation:
Ce patch ne détectera que les areas rectangulaires. Si quelqu'un a une solution pas trop gourmande pour savoir si un point fait partie d'un polygone, idem pour un cercle, je suis preneur.
Autre petit souci : ce patch a besoin d'une classe (contextMenuAreas) sur l'image mappée. On peut normalement remplacer cela par une détection d'éventuels handlers contextmenu placés sur les areas.

Bien sûr, ce problème, encore une fois, ne devrait même pas se poser. map/area est un duo immonde, qui n'a absolument rien à faire dans HTML. La réactivité de zones placées au jugé sur la page n'a aucun sens sémantique, surtout que ceci se trouve sur un média (image)...

Le dictat de la démocratie (aka Web 2.1)

Pour commencer, un petit lien:
http://fr.wikipedia.org/wiki/Web_2.0

On peut aisément résumer ça comme étant l'encouragement massif entraîné... par la masse, cela sur le web. Tout réseau social embarquant de l'AJAX est aujourd'hui considéré comme Web 2.0.

Dans cette masse de "nouvelle génération", on retrouve néanmoins certaines choses ô combien hallucinantes.

Prenons l'exemple (facile) d'un site précis: lotro.fr.

Celui-ci est très connu par cet ensemble : "lotro.fr", qui est également son URL. Testez.

Aujourd'hui, les gens (la majorité, CQFD) ne rentrent pas cela dans leur barre URL. Cette même barre est d'ailleurs limite optionelle, on pourrait la supprimer que cela ne dérangerait pas vraiment, quoi, 50% des internautes, avant un bon moment.

Si bien qu'on en revient au sempiternel "google is on the web, web is not google". Mais où est le souci à cela ?

A l'heure actuelle, les techniques de référencement sont diverses, mais se recoupent. Il a fallu du temps pour montrer qu'un contenu fait correctement est mieux réalisé qu'une page satellite embarquant vers un site réalisé par un singe armé du dernier crack Adobe CS qui ne s'intéresse pas à ce qu'il fait, encore moins s'il le fait bien.

Demeurent les classiques problèmes de compromis entre l'accessibilité et le référencement. Comme exemple récurrent, l'ouverture d'une nouvelle fenêtre. Pour conserver la validation W3C et ainsi croiser les doigts pour un meilleur classement (lien de cause à effet à vérifier), des "astuces" sont mises en place. On ne s'intéresse pas à "pourquoi", mais à "comment ne pas".
Passons sur ces pseudo-compromis.

L'algo de google, tel qu'on le dit souvent, possède une notion de confiance. Mieux un site est classé, meilleurs seront les scores des sites vers lesquels il pointe. Si énormément d'entreprises se sont ainsi positionnées sur facebook (passable) et sur les blogs (moche), c'est bien pour ça : des sites générant de très forts trafics humains et de liens générent un indice de confiance assez monstrueux, en toute logique.
Une démonstration des effets pervers possibles a été réalisée, à de nombreuses reprises, via le google bombing.

Mais le souci n'est pas tellement google. Google ne fait que son "boulot", ce pourquoi cette boîte en est là : répondre à la demande.

Là où taper "youtube.fr" ou "youtube.com" dans la barre URL serait plus simple, plus rapide, et ce pour tous, l'internaute moyen va taper ça dans sa page d'accueil: google (ne parlons pas de bing!, on est sérieux là) dans la très grosse majorité des cas.

On se dirige ainsi vers un phénomène assez effrayant : la centralisation totale de tous types de contenus. Si demain, un blackout sur le site google search avait lieu, la phrase la plus typique sur Facebook (puisque beaucoup de smartphones embarquent une application "facebook" qui n'est qu'une vaste fumisterie. Pour créer une application facebook sur votre PC, clic-droit > Raccourci) serait "le net marche plus".

Y'a pas comme un souci dans les habitudes ?

Retour

Après un bon temps d'absence dû à certains problèmes personnels aujourd'hui réglés (en principe, comme toujours), je reviens ici. Même si le nombre de commentaires n'a toujours pas décollé de 0, je continue. Les stats montrent quelques visites (sortis des bots officiels ou non), c'est donc que de rares personnes passent par là !

De la fermeture du choix, aKa "l'alternance"

Je ne vais pas cracher sur l'alternance.
Oh non, bien au contraire, c'est l'une des seules idées "puissantes" qu'il y ai eu de fait en France, et qui ai été (chose rare et ô combien appréciable) acceptée de manière générale.

Mais sur un phénomène très pénible, qui enlève pas mal de possibilités aux personnes à la recherche d'un contrat d'apprentissage ou de professionnalisation.

En effet, on voit apparaître ça et là, des écoles privées se réservant leur place sur le marché. Comment ? Je m'explique.

L'école "ME" est chère. Assez pour qu'on s'en détourne aisément. Seulement voilà, ils ont un business à faire tourner. L'école contacte donc tous ses partenaires: des entreprises. Soit de celles ayant accueilli des alternants venant de chez eux, soit prospectées par téléphone (c'est courant pour les grandes boîtes, donc celles qui engagent le plus). L'école leur propose de s'occuper de toutes les formalités administratives, de placer un garde-fou avant que d'éventuels postulants puissent arriver jusqu'à la case "je contacte l'entreprise". Elle promet également un résultat : X alternants pour la période demandée.

C'est là qu'on se "marre". Les annonces atterrissent donc chez ME. Manque de bol (c'est si étrange !), ils proposeront aux postulants de rejoindre leur établissement, ou d'aller se faire mettre (à peu près).

Petite étude, au 26/08/2010:
Recherche ANPE Pôle-emploi via le portail gouvernemental: http://www.contrats-alternance.gouv.fr/resultats-recherche-@/104/view-104-category.html
Contrats de pro ou d'apprenti, mots-clefs : "vendeur", niveau visé : IV, Région: Grenoble
19 résultats
Nombre d'annonces libres : 1
Nombre d'annonces "postuler en ligne" (donc indéterminé): 4
Nombre d'annonces "occupées" (par les écoles): 5
Et en passant, nombre d'annonces "occupées" par un certain centre "G5", sur les 5 occupées : 4.

Petit aparté, dans ce genre de cas, les écoles tapent autour. Bien autour. Un département autour. Après tout, 2h30 matin et 2h30 soir pour assister à des cours, ça les vaut. Et on est remboursé à 20% par le salaire. "Un étudiant vit chez ses parents et est aidé, de toute manière".

Je me questionne. Est-ce légal ?

Normalement, faire obstruction à une personne quant à la possibilité qu'elle se présente à un emploi, ça sent une loi socialo qui dit "non". Donc, AMHA, ce genre de pratiques mériterait qu'on se penche un peu dessus.

Ah, et en passant, je pense continuer à dénoncer les écoles qui aiment bien ce genre de pratiques.
On notera donc, pour le moment (dernière MàJ : 26/08/2010):
G5 pour la vente et l'informatique
La Seconde Ecole pour l'informatique


Toute information supplémentaire ou discussion, n'hésitez surtout pas.

Mensonge en boîte : video.

Ouin ouin.
Je suis Youtube, enfant adopté par Google, et je chouine.

To switch to pure HTML5 video would mean YouTube would have to give up features like live streaming, dynamic video quality control and the ability to allow users to jump to specific points in a video.

Alors soit j'ai du mal à lire les specs, soit y'a un souci quelque part.

Live streaming : c'est au navigateur et aux devs de faire le boulot, pas la spec, puisqu'il s'agit ici de rechercher l'information sans "tuer" le flux. Or, la spec précise : "The user agent may use whatever means necessary to fetch the resource (within the constraints put forward by this and other specifications); for example, reconnecting to the server in the face of network errors, using HTTP range retrieval requests, or switching to a streaming protocol."
Du moment que le flux est alimenté, et selon l'implémentation, il n'y a pas de raisons que le "live streaming" ne soit pas supporté, donc.

Dynamic video control : hors de propos. Faut être sérieux, hein, là c'est du prétexte de sourd. On pense tous que Flash le fait à la volée ? Laissez-moi rire.

Jump : http://www.w3.org/TR/html5/video.html#dom-media-seek
Nan parce que ça va deux minutes.

En gros, HTML5 n'est pas en cause. C'est le retard des navigateurs qui est à blâmer.
Et ce retard, coté tag video en tout cas, provient probablement (ne bossant ni chez Google ni chez App£e, ne contribuant pas à la Mozilla) du bordel ambiant coté codec.
Quel est donc l'intérêt d'avoir "son" codec adopté ?
Si le codec vous appartient, en gros, c'est vous qui empocherez les droits d'utilisation, et donc, d'implémentation. Si Ogg Theora était un peu plus solide, la question ne se poserait pas, soit dit en passant.

Sinon, Flash, c'est connu, c'est supporté partout. Oopa. Combien d'années ont-elles été nécessaires afin que la plupart des éléments flash soient gérés sur la plupart des plateformes ?

Par contre, HTML5 doit être intégralement géré dès sa sortie, sinon on l'enterre.

Adobe devrait bientôt sortir les gros sous.

Domino Day

... ou comment UNE faille de sécurité peut faire effet domino très aisément.

Là, on va pointer du doigt pas mal de choses, et pas de la techno.

Pour commencer, mini-historique:
Léoserveur s'est fait pirater vendredi 25/06 aux alentours de 21h30. Nous avons pu sécuriser rapidement le serveur, afin de limiter les dégats, malheureusement un compte admin a été compromis et des hébergements ont été supprimés avant que nous ne puissions faire quoique ce soit.
Léoserveur est un hébergeur à prix libre, faisant partie du RHIEN (Réseau d'Hébergeurs Indépendants et ENgagés), hébergeant ces derniers, d'ailleurs.

De ce que j'ai pu lire sous le forum, deux causes sont possibles:
- le pirate est passé par une faille de type Injection SQL (ou XSS, peu importe à ce niveau) sur l'un des sites hébergés afin d'accéder à un compte, d'y récupérer le mot de passe. Ce compte appartenant à l'un des admins de léoserveur.
- le pirate a logé par upload un petit soft capturant la saisie de mots de passe tout en crawlant pour récupérer ceux enregistrés.
A mon avis, et cela semble se confirmer, un mélange des deux a été fait : faille du site, upload "pirate" pour remplacer un des fichiers en téléchargement afin de préparer le terrain par la suite.

Bien évidemment, le pirate en question a "brouillé" les pistes. Genre TOR.

Mais là où le cas est intéressant, c'est l'effet. Le pirate a en effet ainsi eu accès à un password de cet admin, qui avait le même à peu près partout : léoserveur, msn, fb... Tout y est passé.

Et c'est là où on tombe dans le cas. Parce que l'un des sites hébergés était faillible, ceci a compromis la sécurité de l'hébergeur. Ceci a permis la prise de contrôle, le vol d'identité de cette personne, pour les sites et applis les plus répandues et connues. Avec un seul mot de passe.

CERTES. Plusieurs mots de passe, c'est chiant. Faut les noter, si on commence à charger, et du coup ça change pas grand chose. Le problème n'est pas toujours là.

Le problème, en mon sens, c'est le fait de négliger la sécurité d'un site ou d'une appli, car "peu importante". La moindre faille dans une communauté ridicule peut amener à ce genre de cas (à noter que la communauté en question était assez bien fournie, mais pas à la mesure d'autres).

Webmestres, Développeurs. Se dire "on s'en fout de la sécu, c'est juste pour ***" amène à ce genre de cas.

Du JS à la sauce pseudo-framework

J'ai, à la base, une certaine aversion envers JS. J'ai des raisons, hein:
- dépendance totale au client
- utilisation faisant en général sauter tout concept d'accessibilité au nom du visuel
- règles de syntaxe encore plus laxistes que PHP
- debug horrible
- entièrement contextuel

Après, dans le cadre de mon travail (et même, pour le domaine en général), j'utilise JS. Logique, dans le web. Les effets visuels apportés restent intéressants, et c'est là que l'utilisation de "frameworks" (bien que j'aurais plus tendance à parler de bibliothèques, mais bref) se révèle intéressante, afin d'éviter de recoder la roue, mais aussi et surtout de se maintenir sur une ligne de conduite, dans le sens où l'on a moins de divergences de codes, pour peu qu'on utilise les éléments du framework.

Ici, parlons de prototype, extrêmement répandu, et souvent associé à script.aculo.us (que nous allons négliger).

Outre la syntaxe jQuery offerte par prototype, via les méthodes $, $$, et autres $XYZ qui ne sont finalement que des raccourcis dont il faut parfois se méfier, certaines méthodes se révèlent très intéressantes, de par le temps ainsi gagné.

Coté Array, tout d'abord, le each permet un raccourci syntaxique remarquable. Le for ... in étant quasi inutilisable malgré lui dans la plupart des cas de DOM, son utilisation en pleine analyse d'une structure de document évite des lignes et des lignes de passages JS. Autre méthode très intéressante, en terme de raccourcis d'écriture, souvent inutilisée, mais quand y'a besoin, limite salvatrice : without.
En JS, j'ai l'habitude d'empiler / dépiler des éléments. Or, la gestion actuelle des Arrays, proche mais pas assez de celle de PHP rend cette habitude difficile, et without simplifie la vie.

Coté AJAX, on est tous d'accord, les méthodes fournies, bien que peu nombreuses, couvrent les principaux besoins, et créent une économie de code.  Surtout en conjonction avec DOM, ou plutôt Element.

Et là, prototype peut se targuer d'être bon : Element. Enfin, ses "extensions de DOM" comme dit dans la doc (qui se révèle trop sobre et brève). Nombre des méthodes d'Element sont extrêmement utiles, à un point tel que je ne passe plus sur les références JS, mais sur celle de prototype pour manipuler des éléments DOM.

Maintenant, reste à ne pas tomber dans le travers que je vois trop souvent: passer trop d'éléments HTML par JS sous prétexte de libérer la bande passante. Il ne faut pas oublier que le JS également est envoyé, et que charger le client comme une mule n'est pas forcément la meilleure idée, surtout pour ce qui concerne du contenu...

L'UTF-8 et le web

De nombreuses personnes se posent deux questions principales à propos d'UTF8. On va tâcher d'y répondre, quitte à ce que ça tombe dans le néant.


Pourquoi ?
Pourquoi devrais-je migrer (ou utiliser) UTF-8 ? ISO-8859(-1/15) est utilisé par plein de monde, et surtout par Windows / IE ?

UTF-8 est standard. Cet élément n'est pas négligeable: il signifie qu'à plus ou moins long terme, tout navigateur devra supporter et comprendre cet encodage (de manière non-absolue, bien entendu). Cela élargit donc le public possible.

UTF-8 est universel. Je parle ici en termes de caractères. Les caractères "supportés" par UTF-8 représentent une large gamme, bien plus large que la plupart des autres jeux de caractères.

UTF-8 est aisément manipulable. Ce qui signifie, de manière plus expansive, qu'il est plus aisé de manipuler (compter les caractères, décalage de bits pour les changer...) de manipuler une chaîne encodée UTF-8 qu'une chaîne, par exemple, latin1.

Reste la principale difficulté qui fait hésiter : la migration de données existantes.


Comment ?
Comment utiliser UTF-8 ? Comment migrer mes données en UTF-8 ?
Prenons l'exemple aisé d'une structure PHP / MySQL / xHTML (& co).
Tout d'abord, il faut séparer deux éléments: ce que l'on a dans le code, et ce que l'on envoie au navigateur.
Dans le code, tout d'abord, il nous faut enregistrer le fichier en UTF-8. Si l'on entre des accents à la main, le système va prendre l'encodage choisi. Si vous changez d'encodage, vous verrez vos accents dans le code devenir légèrement étranges, le codage étant différent. Le choix de l'encodage est donc généralement à faire au début, sous peine de modifier tous les accents dans tous les codes sources.
On peut contourner ça en saisissant les entités HTML remplaçant les accents (&eacute; & co).
Attention: pour le cas de PHP, par exemple, vous devez enregistrer en UTF-8 SANS BOM. Le BOM ou Byte Order Mark rajoute un octet significatif pour indiquer au système qu'il s'agit d'UTF-8. Le problème est que cela crée une sortie standard, et donc parasite l'envoie d'en-tête. Toute fonction d'envoi d'en-tête (header, setcookie...) crache alors une erreur qui fait peur ("ligne 0 ? Comment ça, ligne 0 ?").

Toujours dans le code, afin que le navigateur comprenne qu'il s'agisse d'UTF-8.
Pour cela, il suffit d'envoyer un en-tête signifiant le type et l'encodage du document:
header("Content-type: text/html; charset=utf-8");
Le rappel de type MIME devrait être obligatoire, de toute manière, cela devrait donc être présent en tête de chacun de vos codes retournant du HTML en sortie standard.

Cela suffit à Opera et Mozilla Firefox (eh oui). Techniquement, IE, Safari (et Gogole Chrome) également. Si je peux avoir des retours sur l'élément qui fait comprendre à ces navigateurs le charset, je suis preneur.
Il peut néanmoins être utile de passer, coté HTML, la balise meta charset indiquant que le document est en UTF-8, afin de rester le plus possible standard. Ainsi, les applications externes reconnaîtront l'encodage de la page, même si elle a été mise en cache. Les visiteurs n'auront alors pas non plus de problèmes après enregistrement de la page HTML sur leur poste.

Reste le problème des bases de données.
Une fois que des données sont présentes, migrer ces données depuis latin1 (utilisé par défaut et de manière trop fréquente pour MySQL) vers UTF-8 pourrait se révéler un vrai cauchemar, s'il n'y avait pas...
ALTER TABLE {tablename} CONVERT TO CHARACTER SET utf8;
La magie opère. Après tests, les chaînes sont correctement converties à l'exception des éléments de type BLOB, qui devront être migrés à la main. Dans un tel cas, une ligne sélection / conversion / suppression / insertion suffit. Et PHP sait le faire, via utf8_encode.
Enfin, et pour être rigoureux, reste à définir l'encodage de la connexion. Cela permet d'éviter aux applis externes (WebServices notemment) d'avoir des soucis à l'envoi. Pour cela, une requête SQL est nécessaire:
SET NAMES utf8;
Afin que la connexion passe (ou reste) en encodage UTF8.


Le choix de l'encodage est donc primordial, et est à faire généralement lors du premier développement, mais une migration est possible, comme on l'a vu. Et les intérêts à passer en UTF8 sont intéressants. Qu'attendons-nous ?

Ces hérésies

Oui, il y a un certain nombre de choses qui ne devraient pas être, et qui se répandent, pourtant.;
Une liste, ça va vite.

Le XML n'est pas un format de stockage !
Le XML est un format très verbieux. Très lourd.
Le point fort de ce format, est surtout le fait qu'il soit standardisé, connu de beaucoup de langages, et donc est un langage d'échange très utile, très compris, et très pratique. Les temps de lecture / écriture sont tout à fait honorables, pour ce genre de langages.
Donc stop XML = stockage. Le format n'est pas adapté. Vous avez des données structurées à transférer, depuis ou vers des applications sur lesquelles vous n'avez pas de contrôle ? Utilisez XML.

Le tout objet, ça pue.
Oui, je l'affirme haut et fort. Le tout objet est une plaie. Sous un prétexte de structuration, on complexifie une application, on demande plus de travail à l'interprétation/compilation, sans forcément de plu-value. Voir une classe solitaire avec une simple méthode statique (ou même plusieurs, notez), juste pour que le shéma UML soit conforme, je trouve ça assez immonde.
Idem pour l'utilisation de classes en tant que structures de données (CQFD classe avec propriétés + constructeur + setters + getters). En bref, faut simplement faire la part des choses, et pas avec un shéma UML défini pour englober toute l'application dans une myriade de théorie bien fumante.

L'encapsulation, faut l'enfermer.
"L'encapsulation, c'est foutre toutes les propriétés en private, et faire des accesseurs".
J'aime bien le dire, donc: "lolilol".
Une propriété en private n'est pas visible depuis les classes héritées. Et si la classe n'est pas supposée devenir mère, il y a un moyen de le signifier autrement, de façon bien plus claire (finale).
En somme, une propriété devrait être le plus souvent possible en protected, et en private si et seulement si la classe peut être héritée, et que cette propriété doit ne pas être visible directement des enfants, fait rarissime en pratique.

htmlentities, c'est pas à l'enregistrement.
Simple: d'après vous, quelle place prend le caractère "é" en base, vis-à-vis de "é" ?
Cette manie a été prise à cause d'une faille XSS de phpmyadmin (interface utilisée fréquemment pour consulter des shémas ou des contenus de tables MySQL).
En somme, htmlentities (et idéalement, htmlspecialchars), c'est à l'affichage, point.

Bref. C'est une petite partie. Mais si ça peut servir à quelqu'un.

De la facilité de créer du WebService adaptable

Quelque chose qui me tente depuis un moment est la création de WebServices.
Un rappel rapide de ce que je considère comme WebService (la définition variant légèrement de façon systématique):
Application Web pouvant être utilisée de manière classique ou par n'importe quelle application connectée à Internet.

Je distingue donc bien les Webservices des Webservices avec WSDL.
Ces derniers envoient également un shéma définissant les manières de contacter le service, de communiquer avec lui.
La rédaction d'un fichier WSDL est assez ardue. Je n'ai pu trouver "que" la spécification sur ce point, en Anglais, et elle est parfois assez difficile à suivre. Pour le moment, je ne conçois donc que la partie Web de l'application, car une fois cela effectué, on peut créer une application (par exemple, en Java) spécifique pour communiquer. Par la suite, quand le sujet me sera plus acquis, je pourrais réaliser les fichiers WSDL correspondants.

Le tout est alors de réaliser des standards de communication pour l'application, des standards bien précis.

Pour commencer, le format d'échange. Là, une solution évidente est pointée: XML.
De très nombreux langages comprennent et savent manipuler du XML. Le format est parfaitement adapté à l'échange de données temporaires (et non au stockage, chose que beaucoup devraient noter). Ca tombe bien, PHP dispose de plusieurs API et autres pour manipuler du XML. Prenons SimpleXML, par exemple, qui permet, allons, en 4 ou 5 lignes, de créer un document XML bien-formé.

Pour contacter le service, il suffit d'envoyer une requête HTTP POST. Cela se fait aisément, car beaucoup de langages "de nouvelle génération" (PHP, Java, C#, python...) savent comment réaliser ce genre de requêtes.
Pour une application Web appellée depuis le Web, cURL fait parfaitement le travail.
Encore mieux: AJAX fait en réalité exactement le même travail, via l'objet xmlhttprequest (ou l'activeX d'IE).

En bref, ni l'appel ni le retour ne sont une gêne.
Ce sont les standards de communication qui sont donc centraux ici.
Et ces standards varient selon l'application.

Il suffit donc d'avoir une bonne idée de l'application, d'en fixer les standards voulus, et paf. Le WebService est né.
Reste à faire la documentation, pour que chacun puisse créer une interface de communication.
Et, idéalement, le WSDL afin que les outils les plus génériques puissent s'y brancher, quel que soit le langage.

En somme, le WebService, c'est très simple. Et encore mieux: c'est LE bien. N'importe qui peut créer son interface de communication, avec une ergonomie propre et adaptée, et pour peu que l'interface soit correcte (assez générique) et que le fichier WSDL soit mis à jour avec le service, la maintenabilité est parfaite.

EDITION :
Au moment où j'écrit, je découvre qu'un tuto sur le SdZ expose un peu les WSDL. J'espère que celui-ci sera plus clair que le peu qui existe sur le Web.

Projets

Des projets en cours ! Et il y en a.

Projet Izzy
Framework se voulant simple pour son utilisateur, avec respect des conventions PEAR et du xHTML (CQFD, ce qui est généré est valide XML et, tant que l'utilisateur respecte le standard du framework, valide W3C).
Basé sur du MVC (malgré le fait que je sois l'un de ses détracteurs), avec un VRAI système de templates (pas un truc à coup de short_tags PHP, et sans processus de décision ou structurel if / foreach).
Des API embarquées, nécessitant PHP 5.1+.
Actuellement, je suis sur la partie ORM. Je posterais probablement (quand j'aurais le temps et une connexion stable) l'avancement du projet, pour qui cela intéresse.

Projet 3-days coding (3DC)
Simple, ça rassemble toutes les applis que je développe seul ou en équipe en peu de temps (3 jours étant une moyenne).
Actuellement, un système de chan AJAX pouvant être contacté comme WebService pousse ses premiers cris en phase de debug.

Projet Refuge
Le gros projet. Actuellement en développement, c'est le premier élément que je passerais sous Izzy, ça sera un très bon test.
Il s'agira d'une plateforme communautaire semi-fermée. L'objectif est de créer un environnement communautaire "sain", avec un tri sélectif des entrées, mais sans réelle contrainte autre que celles légales, à l'intérieur.

Je profite aussi de ce post pour placer quelques tags (ou "libellés" pour Blogger. Pas l'habitude de cette appellation). Ca fait pas de mal.

Qui suis-je ?

Oui, quand même, il paraît qu'il faut un minimum de présentation.

Donc au-delà du pseudo anonyme parfois pratique (et imprononçable) de Lpu8er, le Quentin que je suis loge du coté de Lyon (et parfois Grenoble).
Depuis 2005 (ce qui peut sembler très récent et lointain à la fois), je reste passionné des technologies informatiques, en particulier ce qui touche au Web.

Ayant terminé mon Baccalauréat, et après une période peu active du fait d'une trop grande naïveté de ma part (pensant alors qu'un autodidacte puisse accéder à un emploi dans cette branche sans diplôme supérieur), j'ai effectué une formation en alternance entre une école et une entreprise. Cette dernière n'étant d'ailleurs pas spécialisé dans le domaine, mais ayant besoin d'un Analyste-Programmeur coté Web.

Ayant donc décroché le diplôme (BTS Informatique de Gestion, Option Développeur d'Applications), et après un rapide accès à un emploi ayant mal tourné (difficultés financières de l'employeur, entre autres) au même poste que précédemment mais dans une entreprise spécialisée dans la création de sites Web (sous un framework fort intéressant, d'ailleurs, dont je reparlerais ultérieurement), j'ai rempilé deux ans d'études, et suis donc, au moment où j'écris ce message, à la recherche d'un contrat en alternance pour passer d'un niveau +2 à +4.

Voilà pour le parcours. Coté connaissances, je reste principalement sur les classiques PHP / MySQL (tout en dérivant, d'ailleurs, vers d'autres SGBDR), avec une ouverture importante vers les langages tels que Java, .NET, ainsi que tous les domaines connexes (galaxie XML, HTML 5...).

Les billets qui suivront seront donc principalement dans ces domaines, mais s'étaleront également sur des considérations moins "programmées", telles que certaines décisions légales, des tendances et climats dans l'informatique en général, etc.

Pour me trouver en-dehors de Blogger:
Le Site du Zér0 : http://www.siteduzero.com/membres-294-3082.html
Site adressé principalement aux débutants, mais très riche de contenu, que ce soit coté tutoriels ou forums
Facebook: http://www.facebook.com/profile.php?id=100000448432186
Parce qu'il "faut bien quand même"


Lpu8er

Ouverture de Tech-At-All

Yop là.

En cette année 2010 qui se prépare à pas rapides, je concrétise une décision que j'ai pris depuis belle lurette, qui est de créer un espace de publication pour mes recherches et avis personnels quant aux nouvelles technologies dans le domaine du Web.

Le format Weblog s'étant tout naturellement imposé, restait le choix d'où publier.

A la base fut un projet de me monter moi-même ma plate-forme Blog, ce qui n'est réellement pas compliqué. Néanmoins, il reste utile de consulter les outils déjà existants, et il s'est avéré que quelques plate-formes pouvaient tout à fait correspondre. Ce fut finalement Blogger qui fut choisi, principalement en raison de sa popularité et de sa facilité d'accès pour chacun.

Voici donc ouvert le Weblog Tech-at-all, qui a et gardera pour principe l'accès aux nouvelles technologies pour tous, se traduisant par la publication de recherches, avis personnels, et débats sur le vaste sujet qu'est la toile, ainsi que ses domaines connexes.

Bonne lecture, et n'hésitez pas à réagir !


Lpu8er