[{"content":"This is an example page. It\u0026rsquo;s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:\nHi there! I\u0026rsquo;m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\u0026rsquo; caught in the rain.)\n\u0026hellip;or something like this:\nThe XYZ Doohickey Company was founded in 1971, and has been providing quality doohickeys to the public ever since. Located in Gotham City, XYZ employs over 2,000 people and does all kinds of awesome things for the Gotham community.\nAs a new WordPress user, you should go to your dashboard to delete this page and create new pages for your content. Have fun!\n","permalink":"https://outweb.eu/sample-page/","summary":"\u003cp\u003eThis is an example page. It\u0026rsquo;s different from a blog post because it will stay in one place and will show up in your site navigation (in most themes). Most people start with an About page that introduces them to potential site visitors. It might say something like this:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHi there! I\u0026rsquo;m a bike messenger by day, aspiring actor by night, and this is my website. I live in Los Angeles, have a great dog named Jack, and I like piña coladas. (And gettin\u0026rsquo; caught in the rain.)\u003c/p\u003e","title":"Sample Page"},{"content":"Les entreprises ont dû mettre en place une nouvelle organisation pour poursuivre leur activité malgré la pandémie. Le télétravail a ainsi explosé depuis la crise sanitaire mondiale. Bien que cette transformation numérique leur ait permis de ne pas sombrer, les problèmes liés à la cybersécurité restent une préoccupation essentielle. Prévoir des solutions informatiques sécurisées est donc devenu une priorité.\nUne augmentation des cyberattaques Le télétravail a connu un essor important depuis le début de la crise sanitaire. La transformation numérique était donc incontournable pour de nombreuses entreprises, tous secteurs d\u0026rsquo;activité confondus.\nCependant, le travail à distance a favorisé la multiplication des cyberattaques en tout genre. Faute d\u0026rsquo;anticipation, les entreprises se sont retrouvées vulnérables face à des problèmes de sécurité informatique. La révolution du télétravail les oblige pourtant à envisager des solutions efficaces pour remédier à ce souci.\nDiverses formes d\u0026rsquo;attaques menées par des hackers dans le but de s\u0026rsquo;emparer des données personnelles des utilisateurs se sont multipliées. Il existe différents types de menaces :\nL\u0026rsquo;IOT ou Internet des objets, utilisé pour optimiser le contrôle de la maison à distance, a par exemple multiplié les risques de cybersécurité depuis la pandémie. En travaillant depuis chez lui, le salarié met les données de l\u0026rsquo;entreprise en danger. D\u0026rsquo;où la nécessité de recourir à une entreprise spécialisée comme www.landvart.com pour auditer la sécurité informatique. Le phishing ou la récupération de données via des logiciels malveillants et l\u0026rsquo;intelligence artificielle a aussi pris de l\u0026rsquo;ampleur durant la crise sanitaire. L\u0026rsquo;utilisation quotidienne des réseaux sociaux a davantage facilité le piratage des données confidentielles des employés. De plus, il a été plus facile pour les hackers d\u0026rsquo;exploiter ce canal en partageant des liens.\nle cloud une solution de cybersécurité\nRenforcer la sécurité informatique : une priorité pour les entreprises Bien que la situation commence à s\u0026rsquo;améliorer avec le retour au bureau en présentiel, le renforcement de la sécurité reste une priorité pour les entreprises. D\u0026rsquo;autant plus que le télétravail risque d\u0026rsquo;occuper une place de plus en plus importante dans l\u0026rsquo;avenir. Ainsi, de nouvelles stratégies doivent être mises en place pour sécuriser les différents appareils et services hébergés sur serveurs.\nLa migration des serveurs sur le cloud La migration vers le cloud peut être un choix judicieux pour minimiser les risques de cybersécurité. Cela peut concerner les serveurs, les données, les applications, et même les emails et sauvegardes.\nEn plus de faciliter le télétravail, cette solution garantit une meilleure organisation, et surtout une sécurité plus poussée. Toutes les données de votre entreprise seront à l\u0026rsquo;abri de toute tentative de fraude. Tout le monde peut avoir accès aux informations à distance, à tout moment, et vous pouvez vous libérer des mises à jour et maintenance des serveurs.\nFaire appel à une société de services informatiques Pour mener à bien la migration vers le cloud, il n\u0026rsquo;y a rien de tel que le recours à une entreprise d\u0026rsquo;informatique spécialisée dans le domaine. Le basculement vers cette solution sécurisée peut s\u0026rsquo;avérer compliqué, d\u0026rsquo;où la nécessité de se faire accompagner. Avec un professionnel, vous pouvez bénéficier de conseils pratiques, et d\u0026rsquo;une offre sur mesure en fonction de vos besoins précis.\n","permalink":"https://outweb.eu/2021/08/26/securite-informatique-quel-est-limpact-de-la-pandemie/","summary":"\u003cp\u003eLes entreprises ont dû mettre en place une nouvelle organisation pour poursuivre leur activité malgré la pandémie. Le télétravail a ainsi explosé depuis la crise sanitaire mondiale. Bien que cette transformation numérique leur ait permis de ne pas sombrer, les problèmes liés à la cybersécurité restent une préoccupation essentielle. Prévoir des solutions informatiques sécurisées est donc devenu une priorité.\u003c/p\u003e\n\u003ch2 id=\"une-augmentation-des-cyberattaques\"\u003eUne augmentation des cyberattaques\u003c/h2\u003e\n\u003cp\u003eLe \u003cstrong\u003etélétravail a connu un essor important\u003c/strong\u003e depuis le début de la crise sanitaire. La transformation numérique était donc incontournable pour de nombreuses entreprises, tous secteurs d\u0026rsquo;activité confondus.\u003c/p\u003e","title":"Sécurité informatique : quel est l'impact de la pandémie ?"},{"content":"Si vous désirez faire connaître votre site, le rendre plus visible et augmenter le trafic, il est important de bien le référencer. La question du référencement d\u0026rsquo;un site est en effet cruciale, aussi bien pour une grande entreprise que pour une PME ou même un particulier. Alors, comment bien référencer son site ? Voici quelques conseils et astuces pour mener à bien votre mission et vous faire davantage connaître des internautes.\nSolliciter les services d\u0026rsquo;une agence spécialisée dans la création de sites web Pour améliorer la visibilité de votre site dans les moteurs de recherche, vous devez passer par le référencement naturel ou SEO. Il s\u0026rsquo;agit d\u0026rsquo;un ensemble d\u0026rsquo;outils et de techniques assez complexes pour les non-initiés. Vous devez donc faire appel aux services d\u0026rsquo;une agence spécialisée dans la création de sites web pour vous aider.\nElle vous aidera à obtenir un positionnement en première page des moteurs de recherche. Une agence est à même d\u0026rsquo;assurer un travail méthodique de précision et de qualité pour vous éviter d\u0026rsquo;être pénalisé par les algorithmes des moteurs de recherche et les failles techniques possibles sur un site. Si vous cliquez ici par exemple, vous pourrez trouver une agence à même de vous accompagner convenablement pour le référencement de votre site.\nLes différentes activités d\u0026rsquo;une agence spécialisée pour le référencement Si vous possédez déjà un site qui est hébergé avec un design et une charte graphique qui vous conviennent, vous aurez besoin d\u0026rsquo; une offre de référencement complète et de qualité, notamment :\nune indexation et un référencement on-page dans Google, une soumission dans les annuaires, une option médias sociaux, une campagne Netlinking à autorité. Toutes ces activités permettront à votre site de se retrouver dans le Top 10 de Google.\nL\u0026rsquo;amélioration du contenu de votre site Le travail de votre agence spécialisée se fera aussi bien sur les aspects techniques que visuels de votre site internet. Vos contenus doivent être originaux et de qualité. De plus, le travail de référencement doit assurer une visibilité pérenne de votre site. N\u0026rsquo;oubliez pas que seuls des contenus de qualité vous permettront d\u0026rsquo;avoir un trafic de qualité et ciblé.\nLe choix des bons mots-clés Pour assurer un bon positionnement de votre site parmi les résultats des moteurs de recherche, vous devez choisir les bons mots-clés. Ils doivent décrire votre activité, vos produits ou services et être utilisés pour faire une recherche dans les moteurs de recherche. Vous pouvez vous référer au contenu de la concurrence ou aux communications de vos différents clients pour les choisir.\nLe renseignement des contenus Ce renseignement doit être appliqué sur tous les contenus des pages web du site : images, articles, etc. Vous pouvez par exemple vous servir de balises dans vos contenus rédactionnels pour une bonne structuration. Il est également recommandé de vous servir des balises title, méta descriptions et des attributs Alt sur l\u0026rsquo;ensemble des pages de votre site. N\u0026rsquo;oubliez pas que ces balises doivent comporter les mots-clés que vous avez identifiés et en lien direct avec le contenu des pages. Cela vous permettra de renforcer l\u0026rsquo;indexation de chaque page dans les moteurs de recherche.\nL\u0026rsquo;importance des liens Pour le référencement naturel, les liens internes sont très importants. Ils permettent au moteur de recherche de comprendre les liaisons entre les divers sujets traités dans le site internet. Les liens externes sont liés à la popularité de votre site et donc au positionnement parmi les résultats de recherche Google. Ils doivent être qualitatifs et liés à des sites ayant des noms de domaine fiables. Par ailleurs, il est préférable d\u0026rsquo; instaurer des liens externes vers plusieurs noms de domaines que de multiplier les liens vers un seul site. Vous savez à présent l\u0026rsquo;essentiel à faire pour que votre site figure parmi les premiers résultats de Google.\n","permalink":"https://outweb.eu/2021/08/20/internet-comment-bien-referencer-son-site/","summary":"\u003cp\u003eSi vous désirez faire connaître votre site, le rendre plus visible et augmenter le trafic, il est important de bien le référencer. La question du référencement d\u0026rsquo;un site est en effet cruciale, aussi bien pour une grande entreprise que pour une PME ou même un particulier. Alors, comment bien référencer son site ? Voici quelques conseils et astuces pour mener à bien votre mission et vous faire davantage connaître des internautes.\u003c/p\u003e","title":"Internet : comment bien référencer son site ?"},{"content":"Je viens d\u0026rsquo;emménager dans une nouvelle maison dans laquelle il n\u0026rsquo;y avait pas du tout de réseau filaire. Comme on avait pas mal de travaux de décoration à faire j\u0026rsquo;ai fait poser des prises réseaux dans les pièces principales de la maison.\nAvant de commencer les travaux j\u0026rsquo;ai donc fait venir des électriciens pour mettre le réseau électrique en sécurité et tirer des câbles réseau dans la plupart des pièces de la maison. Pensez bien à le faire avant de commencer les travaux de rénovation car, pour faire propre, il faut faire des saignées et des trous un peu partout.\nMatériel réseau Je n\u0026rsquo;avais pas demandé aux électriciens de brasser les câbles, juste de faire arriver les câbles à proximité de mon tableau électrique. Dans cet article je vais détailler la mise en place du caisson réseau et du brassage du réseau local.\nPour faire quelque chose de propre il va falloir un peu de matériel. Voici ma sélection qui, selon moi, est un bon compromis qualité / prix:\nOutils Je vous invite à investir aussi quelques euros dans des outils comme le testeur de câble ou un dénudeur de câble. Dans tout les cas vous aurez besoin d\u0026rsquo;un cutter ou d\u0026rsquo;une pince coupante pour couper les câbles à la bonne longueur. C\u0026rsquo;est toujours plus simple en ayant les bons outils.\nFixer les keystones sur les câbles réseaux J\u0026rsquo;ai opté pour des deleyCON Module Keystone Cat 6a (https://amzn.to/3a1EULb) car ils sont très simple à installer grâce au système snap-in. Le plus simple pour y arriver correctement est de regarder un tutoriel vidéo et de reproduire. Normalement vous en avez pour quelques minutes par prise. Dans les faits ils suffit de suivre les codes couleurs.\nUne fois chaque prise fixées je vous invite à les tester une à une via le testeur de câble ethernet. Il est préférable de se rendre compte d\u0026rsquo;un mauvais raccord à ce moment de l\u0026rsquo;installation.\nFixer le caisson au mur Pour cette étape à vous de voir en fonction de la composition du mur. Chez moi, dans cette pièce, c\u0026rsquo;est de l\u0026rsquo;agglo plaqué avec du bois. Il faut donc aller percer en profondeur pour être certain de tenir la charge du caisson et de son contenu.\nPour cacher les câbles arrivants et sortants du caisson le mieux est de mettre des goulottes. C\u0026rsquo;est relativement simple à mettre en place mais vous aurez un rendu bien plus propre.\nMise en place des élèments La multiptise Pour ma part j\u0026rsquo;ai choisi de la mettre tout en haut pour profiter du léger renfoncement au dessus de la porte pour cacher les prises et aussi pour faire passer les câbles par dessus et les dissimuler à l\u0026rsquo;arrière du caisson. C\u0026rsquo;est un peu plus compliqué pour ajouter une nouvelle prise mais c\u0026rsquo;est plus propre visuellement. Le model Perel 37331 (https://amzn.to/32dBNNW) fait parfaitement le job pour une installation domestique.\nL\u0026rsquo;enfichage des keystones Rien de plus simple, vous présentez la fiche RG45 en face d\u0026rsquo;un des trous et vous attacher le câble à l\u0026rsquo;aide d\u0026rsquo;un serflex à l\u0026rsquo;arrière sur la petite attache.\nSi vous avez choisi le même switch que moi et que vous n\u0026rsquo;avez pas besoin de tout les emplacements du bandeau je vous conseil d\u0026rsquo;enficher au dessus des ports du switch et non tout à gauche. De cette manière vous pourrez utiliser de petits cables ethernet (20cm) et le brassage sera plus lisible.\nLe plus important est de noter sur chaque fiche à quoi correspond le câble. Sans ça vous allez vite perdre le fil ( ba dum tss).\nIl ne reste plus qu\u0026rsquo;à racker le panneau DIGITUS Patch Panel Modular (https://amzn.to/3k1o5Uz) dans votre caisson.\nLe switch Encore une fois la mise en place est simple, il faut néanmoins fixer soit même les pattes sur le switch pour pouvoir le racker. Une fois fixer et alimenté, le switch est prêt à être utiliser.\nC\u0026rsquo;est sur cet élément que j\u0026rsquo;ai fait la plus grosse dépense. Si vous voulez mon avis il ne faut pas lésiner sur cet élément. Le TP-Link TL-SG1024 (https://amzn.to/35tYRKi) et le choix le plus courant pour ce type d\u0026rsquo;installation. Pour ma part j\u0026rsquo;ai pris un 24 ports afin d\u0026rsquo;avoir encore un peu de place pour brancher des rasps pour de futures projets de domotique.\nLe brassage du réseau local A moins d\u0026rsquo;un besoin particulier vous pouvez simplement brancher un câble ethernet pour relier chaque prises au switch. De cette manière votre réseau sera distribué de la même manière sur chaque prise.\nSi jamais vous avez une box TV qui a un besoin particulier de branchement, il faudra la brancher en directe sur la sortie de votre box internet sans passer par le switch. C\u0026rsquo;est dans cette éventualité que j\u0026rsquo;ai fait mettre deux prises réseau murales à l\u0026rsquo;endroit de la TV. Une pour le réseau classique et une en cas de besoin particulier de la TV.\nMettre en place la boxe internet Maintenant que votre réseau local est brassé il ne reste plus qu\u0026rsquo;à brancher votre box, qui sera ici le DHCP. Brancher la box comme indiqué par votre FAI et brancher un câble ethernet de la box au switch. Si jamais vous avez un besoin particulier, une boxe TV qui doit être directement connectée à la box connectez directement le port de la box à la bonne fiche ethernet sans passer par le switch.\nUne fois la boxe internet ajoutée vous pouvez un ou plusieurs NAS s\u0026rsquo;il vous reste de la place et que vous en avez le besoin.\nListe du matériel Voici une version synthétique de ce qui est nécessaire pour réaliser cette installation chez vous avec un budget modeste.\nNom du produit Prix (Sept 2020) Lien du produit Caisson SoHoline DN-19 07-U-EC 82,90 € Lien TP-Link TL-SG1024 Switch 24 Ports Gigabit 92,88 € Lien DIGITUS Patch Panel Modular - 24 Ports 18,84 € Lien Perel 37331 Bloc 8 Prises pour Montage Rack 19\u0026quot; 20,95 € Lien deleyCON 20x Vis et Écrous à Cages M6 pour Armoires Réseau 7,39 € Lien deleyCON 8X Module Keystone Cat 6a Jack 27,59 € Lien Cat.7 Câble Ethernet 10x 25cm 18,19 € Lien Jokari 30400 Outil à dégainer et dénuder 23,98 € Lien Testeur Ligne câble Patch testeur câble RJ45 RJ11 11,95 € Lien Total 304,67 € Profitez-en c\u0026rsquo;est bientôt noël :D\n","permalink":"https://outweb.eu/2020/09/15/monter-un-caisson-reseau-a-la-maison/","summary":"\u003cp\u003eJe viens d\u0026rsquo;emménager dans une nouvelle maison dans laquelle il n\u0026rsquo;y avait pas du tout de réseau filaire. Comme on avait pas mal de travaux de décoration à faire j\u0026rsquo;ai fait poser des prises réseaux dans les pièces principales de la maison.\u003c/p\u003e\n\u003cp\u003eAvant de commencer les travaux j\u0026rsquo;ai donc fait venir des électriciens pour mettre le réseau électrique en sécurité et tirer des câbles réseau dans la plupart des pièces de la maison. Pensez bien à le faire avant de commencer les travaux de rénovation car, pour faire propre, il faut faire des saignées et des trous un peu partout.\u003c/p\u003e","title":"Monter un caisson réseau à la maison"},{"content":"","permalink":"https://outweb.eu/blog-2/","summary":"","title":"Les articles récents"},{"content":" Blog tenu par Arnaud LAHAXE Ce blog est tenu par Arnaud LAHAXE.\nCV: https://lahaxe.fr\n","permalink":"https://outweb.eu/about/","summary":"\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"https://lahaxe.fr/assets/photo-B8JYFnx6.png\"\n         alt=\"Arnaud LAHAXE\"/\u003e \n\u003c/figure\u003e\n\n\u003ch2 id=\"blog-tenu-par-arnaud-lahaxe\"\u003eBlog tenu par Arnaud LAHAXE\u003c/h2\u003e\n\u003cp\u003eCe blog est tenu par Arnaud LAHAXE.\u003c/p\u003e\n\u003cp\u003eCV: \u003ca href=\"https://lahaxe.fr\"\u003ehttps://lahaxe.fr\u003c/a\u003e\u003c/p\u003e","title":"A propos"},{"content":"Lancer une activité ou créer votre société n\u0026rsquo;est pas toujours facile. En effet, outre sa création, il est aussi essentiel de maintenir la réputation et la notoriété de votre société. Cela permettra de vous faire connaître davantage afin d\u0026rsquo;attirer plus de clients. Depuis quelque temps, les outils digitaux ne cessent de connaître des évolutions si bien que les notions de notoriété et de réputation d\u0026rsquo;une entreprise se propagent aussi dans le monde virtuel. Alors, comment cela fonctionne et pourquoi est-ce si important ?\nQu\u0026rsquo;est-ce que l\u0026rsquo;e-réputation ? Souvent confondue avec l\u0026rsquo;e-notoriété, l\u0026rsquo;E-réputation se concentre surtout sur l\u0026rsquo;opinion publique en ligne. Une entreprise peut être connue (c\u0026rsquo;est-à-dire avoir une certaine notoriété), mais l\u0026rsquo;E-réputation permettra de savoir si elle a une bonne image ou non.\nEn général, votre e-réputation est déterminée par les contenus diffusés par les utilisateurs sur des blogs, des réseaux sociaux ou des forums. Elle constitue plus de 75% des informations sur une marque ou une entreprise. C\u0026rsquo;est-à-dire que la majorité de ce qui est dit à propos d\u0026rsquo;une marque ne vient pas de la marque elle-même, mais des internautes.\nAinsi, gérer votre e-réputation est indispensable, car, combinée avec l\u0026rsquo;E-notoriété, elles formeront votre identité numérique. En général, avant de pratiquer un achat de service ou avant de consommer une marque, les prospects vérifient tout d\u0026rsquo;abord sur les différents moteurs de recherche. Ils auront alors un aperçu général des avis des internautes et pourront décider si oui ou non, ils vont s\u0026rsquo;en tenir à la marque.\nComment améliorer votre e-réputation ? User du SEO pour assurer votre e-réputation Le référencement naturel peut jouer grandement sur votre e-réputation. En fait, lorsque la visibilité de votre marque ou votre société est plus claire au niveau des moteurs de recherche, cela aura un impact sur votre image. Donc, plus votre site ou page web monte en visibilité, plus votre image sera consultée par les internautes.\nEffectivement, les internautes ont souvent tendance à faire des recherches et ne lire que les liens en première page des résultats de recherche. Les contenus en tête joueront donc sur la construction de l\u0026rsquo;image d\u0026rsquo;une entreprise ou d\u0026rsquo;une marque. Voilà pourquoi il est essentiel d\u0026rsquo;assurer le référencement naturel de vos contenus.\nGérer les clients mécontents Généralement, les clients satisfaits sont les plus silencieux sur internet. Les clients mécontents, quant à eux, sont les plus actifs et font des retours par rapport à leur mésaventure. Ainsi, afin de mieux gérer les avis négatifs des clients, la réactivité est de mise.\nPour assurer une réactivité instantanée de votre marque, nous vous conseillons de former une équipe chargée de la veille. Cette dernière effectuera alors les veilles digitales pour votre marque afin que vous puissiez réagir rapidement aux commentaires désagréables des internautes. Il est essentiel de savoir que : plus vite vous réagissez, moindre sera le risque que le client en fasse une tonne.\nBref, comme tout se passe actuellement en ligne, garder une certaine E-réputation est important pour assurer une bonne image de la marque. Il est à savoir qu\u0026rsquo;une E-réputation est principalement basée sur vos clients. Ainsi, outre les activités web que vous pouvez réaliser, bien gérer les clients constitue un point clé pour garder une bonne image de votre société.\n","permalink":"https://outweb.eu/2019/12/10/comment-fonctionne-le-reputation/","summary":"\u003cp\u003eLancer une activité ou créer votre société n\u0026rsquo;est pas toujours facile. En effet, outre sa création, il est aussi essentiel de maintenir la réputation et la notoriété de votre société. Cela permettra de vous faire connaître davantage afin d\u0026rsquo;attirer plus de clients. Depuis quelque temps, les outils digitaux ne cessent de connaître des évolutions si bien que les notions de notoriété et de réputation d\u0026rsquo;une entreprise se propagent aussi dans le monde virtuel. Alors, comment cela fonctionne et pourquoi est-ce si important ?\u003c/p\u003e","title":"Comment fonctionne l'e-reputation ?"},{"content":"Le développement de votre activité est votre finalité. Créer votre entreprise a été assez facile, mais pour la faire grandir le chemin se révèle compliqué. Faire évoluer votre business plus rapidement nécessite ainsi des plans d\u0026rsquo;action bien pensés. Je vais donc attirer votre attention sur le webmarketing aujourd\u0026rsquo;hui, un outil indispensable au fleurissement de votre boîte.\nLa visibilité sur internet, un levier de croissance à ne pas négliger Pour faire grandir votre activité à Bordeaux, vous devez être visible et connu. Internet peut vous aider à atteindre cet objectif. D\u0026rsquo;où le webmarketing. Ce dernier regroupe tous les dispositifs mis en œuvre pour faire la promotion en ligne de votre activité. Pour booster la réussite de votre entreprise, vous devrez penser à vous faire accompagner par une agence de référencement naturel de votre ville, que vous trouverez par exemple sur https://www.adf-referencement-bordeaux.com/ .\nLe marketing est incontournable pour promouvoir votre entreprise, vos produits et services auprès des consommateurs. Il est aussi nécessaire pour construire l\u0026rsquo;image et la notoriété de votre marque. Le marketing vous permet de vous faire connaître, de stimuler vos ventes et d\u0026rsquo;augmenter vos profits. Ce qui vous conduit au succès de votre activité.\nAvec une évolution constante du marché, l\u0026rsquo;e-marketing s\u0026rsquo;avère être plus performant que le marketing traditionnel. À travers un affichage publicitaire par exemple, il vous est difficile de connaître avec exactitude le nombre de personnes ayant montré de l\u0026rsquo;intérêt pour votre offre. Le webmarketing permet en revanche d\u0026rsquo;atteindre efficacement une cible plus large grâce aux différents canaux pouvant être déployés . Il vous donne la possibilité de mesurer l\u0026rsquo;impact de vos campagnes publicitaires. C\u0026rsquo;est également un atout face à la concurrence.\nDe nos jours, les gens sont ultra connectés. Ils cherchent des informations (idées de vacances, formations…) sur Google, effectuent leur shopping ou encore d\u0026rsquo;autres opérations sur le Net, comme la recherche d\u0026rsquo;un plombier et différents services. La visibilité sur internet n\u0026rsquo;est donc plus discutable ! La stratégie digitale doit faire partie de la stratégie globale de votre startup.\nLes enjeux du référencement naturel Votre site web est enfin créé. Avant d\u0026rsquo;utiliser d\u0026rsquo;autres outils pour le développer, vous devrez vous assurer que les fondations de votre site internet soient solides. C\u0026rsquo;est là qu\u0026rsquo;intervient le référencement naturel ou SEO. Celui-ci est une arme indéniable du marketing digital. Un meilleur positionnement durable vous permet d\u0026rsquo;améliorer votre trafic, la prospection, la conversion et la fidélisation de votre clientèle.\nAvec les milliers de sites qui se battent pour apparaître dans la première page des résultats Google, ce moteur de recherche est davantage sévère en matière de référencement. Seuls ceux qu\u0026rsquo;il juge pertinents obtiennent les meilleurs positionnements. Si vous voulez en faire partie, vous devez travailler votre référencement naturel pour optimiser votre présence sur la toile. Pour ce faire, recourir à une agence spécialisée en référencement naturel reste la décision la plus judicieuse.\nÉlaborer une stratégie webmarketing efficace Le marketing numérique est un facteur favorisant la visibilité de votre entreprise. Ce n\u0026rsquo;est pas parce que tous les entrepreneurs se lancent dans la promotion de leur activité en ligne, que vous aussi, vous allez le faire. Cette attitude est contre-productive. Afin de faire prospérer votre business, misez uniquement sur une stratégie personnalisée . C\u0026rsquo;est de cette façon que vous foncerez vers votre succès.\nChaque enseigne est différente. Ce qui a marché pour les autres ne fonctionnera pas forcément pour vous. Vos plans d\u0026rsquo;action doivent être en phase avec la situation de votre entreprise et vos objectifs. L\u0026rsquo;élaboration de votre stratégie digitale gagnante nécessite l\u0026rsquo;intervention d\u0026rsquo;un expert. L\u0026rsquo;appui d\u0026rsquo;une agence web vous sera donc d\u0026rsquo;une grande utilité.\n","permalink":"https://outweb.eu/2019/07/24/developper-rapidement-votre-activite-grace-au-webmarketing/","summary":"\u003cp\u003eLe développement de votre activité est votre finalité. Créer votre entreprise a été assez facile, mais pour la faire grandir\nle chemin se révèle compliqué. Faire évoluer votre business plus rapidement nécessite ainsi des plans d\u0026rsquo;action bien pensés.\nJe vais donc attirer votre attention sur le webmarketing aujourd\u0026rsquo;hui, un outil indispensable au fleurissement de votre boîte.\u003c/p\u003e\n\u003ch2 id=\"la-visibilité-sur-internet-un-levier-de-croissance-à-ne-pas-négliger\"\u003eLa visibilité sur internet, un levier de croissance à ne pas négliger\u003c/h2\u003e\n\u003cp\u003ePour faire grandir votre activité à Bordeaux, vous devez être visible et connu. Internet peut vous aider à atteindre cet\nobjectif. D\u0026rsquo;où le webmarketing. Ce dernier regroupe tous les dispositifs mis en œuvre pour faire la promotion en ligne de\nvotre activité.\n\u003cstrong\u003ePour booster la réussite de votre entreprise, vous devrez penser à vous faire accompagner par une agence de référencement\u003c/strong\u003e\n\u003cstrong\u003enaturel\u003c/strong\u003e\nde votre ville, que vous trouverez par exemple sur\n\u003ca href=\"https://www.adf-referencement-bordeaux.com/\"\u003ehttps://www.adf-referencement-bordeaux.com/\u003c/a\u003e\n.\u003c/p\u003e","title":"Développer rapidement votre activité grâce au webmarketing"},{"content":"Pi-hole est un projet open-source prévu pour tourner sur un raspberry pi, qui permet de filtrer les requêtes DNS dans le but de bloquer les publicités et le tracking. L\u0026rsquo;idée est de faire ce filtrage au niveau du réseau afin de pouvoir bloquer aussi les publicités dans les applications et sur les navigateurs mobiles qui n\u0026rsquo;ont pas forcement d\u0026rsquo;Adblock.\nPour mon installation j\u0026rsquo;ai ressorti un vieux raspberry 1 b+ et j\u0026rsquo;ai utilisé l\u0026rsquo;installation recommandé sur le site:\ncurl -sSL https://install.pi-hole.net | bash﻿ Avant de lancer la commande, pensez-bien à vérifier le script.\nPar la suite j\u0026rsquo;ai laisser tout les paramètres à leurs valeurs par défaut.\nSur ma box j\u0026rsquo;ai fixé une IP fixe pour le raspberry (192.168.1.254).\nUne fois l\u0026rsquo;installation terminé l\u0026rsquo;interface web est accessible à l\u0026rsquo;URL http://192.168.1.254/admin. A la fin de l\u0026rsquo;installation un mot de passe vous a été donné. Mais si vous l\u0026rsquo;avez perdu vous pouvez le réinitialiser via la commande:\npihole -a -p Maintenant il ne reste plus qu\u0026rsquo;à utiliser notre nouveau serveur DNS en tant que DNS primaire.\nSi comme moi vous avez une livebox, vous allez être heureux d\u0026rsquo;apprendre que vous ne pouvez pas/plus changer les DNSs au niveau de la box. J\u0026rsquo;ai donc coupé le wifi de la livebox et ajouté un routeur wifi qui lui va me servir de DHCP et qui va s\u0026rsquo;occuper de résoudre les requêtes DNS en passant par pi-hole.\nSi vous ne souhaitez pas ajouter un routeur WIFI, et que ne vous ne pouvez pas modifier les DNS de votre box, il faudra modifier manuellement les DNS sur chaque PC, téléphone et tablette. (c\u0026rsquo;est vraiment pas idéal)\nAprès quelques heures d\u0026rsquo;utilisation j\u0026rsquo;ai constaté que 15% des resolutions DNS qui sont fait dans le cadre d\u0026rsquo;une navigation classique sont vers des sites de tracking ou de publicité. Je suis franchement surpris car je m\u0026rsquo;attendais à bien pire\u0026hellip;\nIl possible d\u0026rsquo;ajouter manuellement ou via un fichier accessible en HTTP des domaines à bloquer/autoriser.\nEn quelques minutes d\u0026rsquo;installation, grace à pi-hole, il est possible de limiter le tracking est la publicité pour l\u0026rsquo;intégralité de votre réseau local. Simple mais efficace.\nSi on veux aller un peux plus loin dans le blocage ont peux ajouter des listes de noms de domaines maintenues par la communauté. Avec cette liste vous passerez à plus de 600 000 domaines de bloqués.\nPour les ajouter il faut se rendre dans Settings \u0026gt; Blocklists et il faut simplement coller la liste des listes de domaines tel quel dans le champs text et enregistrer.\nPetit test de navigation sur mon téléphone avec et sans pi-hole:\nSans\nAvec\n","permalink":"https://outweb.eu/2019/01/21/filtrer-vos-requetes-dns-sur-votre-reseau-local/","summary":"\u003cp\u003e\u003ca href=\"https://pi-hole.net\"\u003ePi-hole\u003c/a\u003e est un projet open-source prévu pour tourner sur un raspberry pi, qui permet de filtrer les requêtes DNS dans le but de bloquer les publicités et le tracking. L\u0026rsquo;idée est de faire ce filtrage au niveau du réseau afin de pouvoir bloquer aussi les publicités dans les applications et sur les navigateurs mobiles qui n\u0026rsquo;ont pas forcement d\u0026rsquo;Adblock.\u003c/p\u003e\n\u003cp\u003ePour mon installation j\u0026rsquo;ai ressorti un vieux raspberry 1 b+ et j\u0026rsquo;ai utilisé l\u0026rsquo;installation recommandé sur le site:\u003c/p\u003e","title":"Filtrer vos requêtes DNS sur votre réseau local"},{"content":"Il existe plusieurs solutions open sources ou hébergées pour monter sa propre architecture serverless. J\u0026rsquo;ai choisi de tester les deux solutions open sources plus populaires, ainsi que deux des plus gros acteurs actuellement sur le marché afin de me faire une idée du fonctionnement de chaque solution. Je vais déployer un simple hello world sur l\u0026rsquo;ensemble des outils afin de tester l\u0026rsquo;utilisation et les temps de réponses.\nJe ne connais aucunes des solutions, mais je vais me faire mon analyse autour des 5 points suivants :\nEst-ce qu\u0026rsquo;il est possible d\u0026rsquo;avoir une solution hautement disponible ? Est-ce qu\u0026rsquo;il y a un engouement autour de la solution ? (articles, conf, contributions) Est-ce que c\u0026rsquo;est simple à utiliser pendant les développements ? Est-ce que la solution est scallable ? Est-ce que c\u0026rsquo;est utilisable/utilisé en prod ? Pour les solutions hébergées je vais toujours prendre, si possible, un datacenter proche de la France. Pour les solutions open sources je vais utiliser un serveur Scaleway hébergé en France avec 4 coeurs, 4 Go de ram et 300Mo/s de bande passante entièrement dédiée au test. Chaque test sera fait sur une installation \u0026ldquo;propre\u0026rdquo; de Debian Stretch.\nBien évidement il y a d\u0026rsquo;autres facteurs qui entrent en jeux avant de choisir un solution plutôt qu\u0026rsquo;une autre tel que les SLA en cas de problème, la fiabilité du partenaire (Est-ce qu\u0026rsquo;il sera toujours présent dans 5 ans ?), le pays dans lequel les serveurs sont hébergées\u0026hellip; Mais dans le cas présent je m\u0026rsquo;intéresse surtout à la fiabilité du service et je n\u0026rsquo;ai ni impératifs de production ni données sensibles à hébergées.\nA la suite du test je choisirais une solution pour construire une petite application.\nAmazon Lambda Présentation Le plus célèbre acteur du marcher est Amazon avec ses lambdas functions. Ce qui est vraiment pas mal avec cette solution c\u0026rsquo;est que pour un petit projet vous pouvez vous en sortir sans rien avoir à payer car le premier million de hit est gratuit.\nIl y a plusieurs version de java, node, python et .Net de supportées par Amazon Lambda.\nMise en place Les fonctions lambda sont intégrées à la solution AWS et peuvent être lancées par beaucoup d\u0026rsquo;évènements différents. Dans mon cas ce qui m\u0026rsquo;intéresse c\u0026rsquo;est les fonctions lambda déclenchées par une API Gateway. Il n\u0026rsquo;y a aucunes installation à faire avant de pouvoir les utiliser.\nHello world Cette lambda est un bête hello world :\nhttps://gist.github.com/lahaxearnaud/86bb0f3a7c0bd2c4be9cb8534b93e18f\nDéveloppement /Déploiement Une fois enregistrée ma lambda est automatiquement disponible via HTTPS sur une URL unique. Il est possible d\u0026rsquo;activer ou non une couche d\u0026rsquo;authentification, mais pour mon hello world je ne vais pas la mettre en place.\nVia le framework serverless, dont je parlerais dans un prochain article, le déploiement / mise à jours peux se faire en ligne de commande en quelques secondes.\nBenchmark Je vais lancer un petit benchmark dessus pour voir les temps moyens de réponses sur un hello world.\n➜ ~ ab -n 1000 -c 10 https://XXXXXXXXXX.execute-api.eu-central-1.amazonaws.com/default/test [...] Concurrency Level: 10 Time taken for tests: 16.969 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 305000 bytes HTML transferred: 19000 bytes Requests per second: 58.93 [#/sec] (mean) Time per request: 169.686 [ms] (mean) Time per request: 16.969 [ms] (mean, across all concurrent requests) Transfer rate: 17.55 [Kbytes/sec] received [...] Les temps de réponses ne sont vraiment pas mauvais, en moyenne 58 requêtes par seconde.\nConférences Une conférence en français d\u0026rsquo;amazon présente assez bien les fonctions lambda :\nCe qui est très sympa avec cette solution c\u0026rsquo;est que c\u0026rsquo;est clef en main. On a plus qu\u0026rsquo;à se concentrer sur notre application en s\u0026rsquo;abstrayant de la partie gestion des serveurs et de la problématique de haute disponibilité.\nCloud function Google Présentation Google, second grand acteur du serverless avec ses cloud function propose aussi un \u0026ldquo;forfait\u0026rdquo; gratuit pour les deux premiers millions d\u0026rsquo;appel.\nTout comme amazon lambda il est possible de créer et d\u0026rsquo;administer ses lambda via la console web. Il faut patienter une bonne minute entre le moment ou on crée une fonction et le moment ou elle est mise à disposition. Tout comme les lambdas d\u0026rsquo;amazon il est possible de déclencher les Cloud functions via des évènements autres que HTTP (ex: modification dans une base firebase).\nMise en place Il n\u0026rsquo;y a rien de spécifique à faire à part avoir un compte google développeur.\nHello world Voici le code de ma cloud function :\nhttps://gist.github.com/lahaxearnaud/37702e43a4f36377eeb5ec3f91a11646\nDéveloppement / Déploiement De même que pour Amazon Lambda le framework serverless va permettre de travailler avec Google Cloud function.\nCe qui est vraiment un plus, non négligeable, c\u0026rsquo;est qu\u0026rsquo;il est possible de lancer les fonctions en locale avec l\u0026rsquo;emulateur node js pour google cloud.\nBenchmark ➜ ~ ab -n 1000 -c 10 https://europe-west1-XXXXXXX-XXXXX.cloudfunctions.net/function-1 Concurrency Level: 10 Time taken for tests: 15.187 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 361008 bytes HTML transferred: 11000 bytes Requests per second: 65.85 [#/sec] (mean) Time per request: 151.870 [ms] (mean) Time per request: 15.187 [ms] (mean, across all concurrent requests) Transfer rate: 23.21 [Kbytes/sec] received Google Cloud function ne support que du python 3.7 et du node js 6 et 8.\nApache OpenWhisk Présentation OpenWhisk est la solution open source serverless de la fondation apache. Il est possible mettre en place cette solution sur du kubernates, du mesos ou simplement via docker-compose.\nLe support des langages est assez étendu pour les fonctions hébergées sur la solution. Il y a notamment Nodejs, python, PHP, java, Go \u0026hellip;\nLes fonctions, appelées Actions, peuvent être déclenchées par des évènements (trigger), des appels HTTP ou encore via des modifications sur un flux d\u0026rsquo;information (feed).\nMise en place J\u0026rsquo;ai suivi la documentation pour une installation docker compose. Malgrès plusieurs tentative je n\u0026rsquo;ai jamais réussi à faire tourner OpenWhisk sur mon serveur. Le script d\u0026rsquo;install a crashé de multiples fois sur des étapes différentes et la seule fois (sur 7) ou il n\u0026rsquo;a pas crashé pendant les install il n\u0026rsquo;a pas réussi à configurer le client car la stack ne renvoyait que des 500.\nJ\u0026rsquo;ai donc décidé de tester sur mon macbook pro 2017. Sur le mac je n\u0026rsquo;ai eu aucun problème à l\u0026rsquo;installation.\nHello world function main() { return {payload: \u0026#39;Hello world\u0026#39;}; } Développement /Déploiement Un client en ligne de commande est disponible pour gérer les functions déployées. Il est donc assez simple et rapide de mettre à jours une fonction pour la tester.\nJ\u0026rsquo;ai eu beaucoup de difficultés pour trouver l\u0026rsquo;URL pour appeler ma fonction, les crédentials pour m\u0026rsquo;authentifier sur le endpoint (une fois trouvé).\nBenchmark Le benchmark n\u0026rsquo;a pas de sens car l\u0026rsquo;éxecution se fait sur mon mac dans la docker machine. En moyenne les temps de réponses étaient aux alentours de 150ms.\nOpenFaas Présentation OpenFaas est une solution opensource basée sur des orchestrateurs docker. Pour mon test je vais utiliser swarm avec un seul node. OpenFaas vient par défaut avec une interface web d\u0026rsquo;administration, une installation prés-configurée de prometheus afin de collecter des metrics sur la plateforme.\nOpenFaas permet de créer des fonctions dans divers langages (Go, Python, Node, Ruby, Java\u0026hellip;) mais aussi faire une passerelle entre OpenFaas et des binaires. La solution propose aussi un support des lambdas d\u0026rsquo;amazon.\nLa documentation est centralisée et assez complète. On peux y trouver beaucoup d\u0026rsquo;exemple sur l\u0026rsquo;ensemble des langages supportés.\nCe qui est important de noter c\u0026rsquo;est qu\u0026rsquo;il est possible de déployer openfaas sur des serveurs ARM (Raspberry par exemple).\nMise en place L\u0026rsquo;installation sur un docker swarm se fait en moins d\u0026rsquo;une minute en lancant le script présenter dans la documentation. Pour intéragir avec openfaas il client en ligne de commande est disponible en plus de l\u0026rsquo;interface web.\nChaque fonction est une image docker qui doit être présente sur un registry docker.\nHello world \u0026#34;use strict\u0026#34; module.exports = (context, callback) =\u0026gt; { callback(undefined, {status: \u0026#34;Hello World\u0026#34;}); } Développement /Déploiement faas new hello-world --lang node --gateway http://51.15.84.114:8080 # coder la fonction dans le fichier hello-world/handler.js faas build -f hello-world.yml faas push -f hello-world.yml faas deploy -f hello-world.yml Benchmark ➜ ab -n 1000 -c 10 http://51.15.84.114:8080/function/hello-world Concurrency Level: 10 Time taken for tests: 49.517 seconds Complete requests: 1000 Failed requests: 0 Total transferred: 257000 bytes HTML transferred: 26000 bytes Requests per second: 20.20 [#/sec] (mean) Time per request: 495.166 [ms] (mean) Time per request: 49.517 [ms] (mean, across all concurrent requests) Transfer rate: 5.07 [Kbytes/sec] received Conférences J\u0026rsquo;ai aussi regardé du côté de Iron-io mais la solution, bien qu\u0026rsquo;elle fournisse un interface HTTP, semble plus axée sur les traitements asynchrones. Ce n\u0026rsquo;est pas spécialement ce qui m\u0026rsquo;intéresse. Mais pour du traitement de masse comme du travail sur des images, de l\u0026rsquo;envoie de mail\u0026hellip; c\u0026rsquo;est une solution à explorer.\nRésultat du comparatif [table id=3 /]\nOpenFaas est une solution très interessante qu\u0026rsquo;il faut surveiller mais qui, pour le moment ne me paraît pas être encore assez mature pour héberger une application de production.\nActuellement je dirais que Amazon lambda est la solution la plus fiable/stable/simple car elle est très bien intégrée à l\u0026rsquo;environnement AWS, il y a une bonne documentation, elle s\u0026rsquo;appuie sur l\u0026rsquo;expertise d\u0026rsquo;un des leaders sur le sujet de l\u0026rsquo;hébergement.\n","permalink":"https://outweb.eu/2019/01/14/test-des-solutions-serverless/","summary":"\u003cp\u003eIl existe plusieurs solutions open sources ou hébergées pour monter sa propre architecture serverless. J\u0026rsquo;ai choisi de tester les deux solutions open sources plus populaires, ainsi que deux des plus gros acteurs actuellement sur le marché afin de me faire une idée du fonctionnement de chaque solution. Je vais déployer un simple hello world sur l\u0026rsquo;ensemble des outils afin de tester l\u0026rsquo;utilisation et les temps de réponses.\u003c/p\u003e\n\u003cp\u003eJe ne connais aucunes des solutions, mais je vais me faire mon analyse autour des 5 points suivants :\u003c/p\u003e","title":"Test des solutions serverless"},{"content":"Le serverless, je ne connais pas du tout. L\u0026rsquo;idée est de faire une série d\u0026rsquo;articles découvertes sur cette architecture. L\u0026rsquo;idée est d\u0026rsquo;aller jusqu\u0026rsquo;à la création d\u0026rsquo;une petite application.\nDepuis deux ans on parle de plus en plus de serverless mais il n\u0026rsquo;est pas toujours simple de voir exactement de ce que cela implique pour une application d\u0026rsquo;être serverless. Autre point, est-ce qu\u0026rsquo;être serverless implique qu\u0026rsquo;il n\u0026rsquo;y ait pas de serveur du tout ?\nLes principes du serverless Le serverless est une nouvelle façon d\u0026rsquo;héberger ses applications. Avec docker et des orchestrateurs comme kubernetes il est possible de faire de l\u0026rsquo;auto-scalling pour adapter le nombre d\u0026rsquo;instances d\u0026rsquo;une application en fonction de l\u0026rsquo;utilisation de l\u0026rsquo;application. M6 Web a d\u0026rsquo;ailleurs fait un retour d\u0026rsquo;expérience d\u0026rsquo;auto-scalling via la mise en place de kubernates.\nLe serverless est l\u0026rsquo;étape suivante de l\u0026rsquo;auto-scalling tout en apportant une approche micro-service. Quand personne ne va utiliser une application, il n\u0026rsquo;y aura aucune instance qui tourne (selon les solutions). Et c\u0026rsquo;est seulement au premier hit que l\u0026rsquo;application sera bootée. En fonction du nombre d\u0026rsquo;appels, il y aura plus ou moins d\u0026rsquo;instances qui tourneront en même temps. L\u0026rsquo;application est donc fortement liée au backend utilisé.\nCette approche permet, selon la solution choisie, de limiter les coûts d\u0026rsquo;hébergement car les providers (Amazon, Google, Microsoft,\u0026hellip;) facturent l\u0026rsquo;hébergement à la seconde, ou même au centième de seconde d\u0026rsquo;exécution. Si personne n\u0026rsquo;utilise l\u0026rsquo;application, les coûts d\u0026rsquo;infrastructure seront quasiment nuls.\nEt c\u0026rsquo;est bien là, la force de cette approche. Quand on loue des serveurs à l\u0026rsquo;année on est obligé de payer pour un nombre de serveurs permettant d\u0026rsquo;absorber les pics maximum de charge. Le reste du temps les serveurs sont sous-exploités.\nLa rapidité Le serverless n\u0026rsquo;est possible que si on est capable de démarrer un service rapidement. Si l\u0026rsquo;application met 30 secondes à démarrer, il faudra toujours conserver au moins une instance de disponible. A ce moment là on en revient à une solution d\u0026rsquo;autoscalling classique.\nLa fiabilité La mise en place d\u0026rsquo;une architecture serverless déporte une partie de la complexité de l\u0026rsquo;application sur l\u0026rsquo;infrastructure qui va orchestrer nos fonctions. Il est donc primordial qu\u0026rsquo;elle soit fiable et résiliante. Il est donc préférable, pour une application de production d\u0026rsquo;utiliser une solution hautement disponible (HA).\nLa scallabilité Par nature une architecture serverless est scallable car elle va devoir instancier à la demande des applications. Mais pour que ce soit possible il faut que l\u0026rsquo;infrastructure l\u0026rsquo;autorise (allocation/ libération de ressources à la volée).\nLe nouveau paradigme Cette infrastructure impose que chaque fonction soit stateless, mais vous avez la possibilité d\u0026rsquo;interagir avec d\u0026rsquo;autres services comme des bases de données ou des APIs.\nLe développeur est pleinement conscient du fonctionnement de l\u0026rsquo;infrastructure. Comme on l\u0026rsquo;a vu précédemment, la frontière est mince entre l\u0026rsquo;application et la solution d\u0026rsquo;hébergement.\nCette façon de travailler permet, en théorie, de réduire le temps de déploiement d\u0026rsquo;une fonctionnalité car la complexité de chaque fonction est plus faible que celle d\u0026rsquo;une application monolithe. Néanmoins le risque est d\u0026rsquo;avoir autant de façons de faire que de fonctions hébergées. Comme chaque développeur va pouvoir travailler \u0026ldquo;dans son coin\u0026rdquo; en faisant fi de l\u0026rsquo;existant, les dérives et les mauvaises pratiques sont vites arrivées. Il y a, à mon avis, un besoin de revue de code et de tests encore plus important sur ce type d\u0026rsquo;architecture.\nLe dernier point et que l\u0026rsquo;on peut avoir un langage commun sur les problèmes de performance avec la hiérarchie. Comme chaque seconde de traitement augmente la facture, il est plus simple de mettre en avant des projets techniques d\u0026rsquo;optimisation. Un temps de traitement divisé par deux c\u0026rsquo;est une fonctionnalité qui coûte deux fois moins cher. Ce n\u0026rsquo;est pas réellement le cas sur une application classique.\nEn conclusion, le serverless est une nouvelle approche sur la façon de concevoir une application en poussant au maximum les approches devops et micro-services afin de concevoir une application hautement scallable tout en maîtrisant les coûts.\n","permalink":"https://outweb.eu/2019/01/07/cest-quoi-le-serverless/","summary":"\u003cp\u003eLe serverless, je ne connais pas du tout. L\u0026rsquo;idée est de faire une série d\u0026rsquo;articles découvertes sur cette architecture. L\u0026rsquo;idée est d\u0026rsquo;aller jusqu\u0026rsquo;à la création d\u0026rsquo;une petite application.\u003c/p\u003e\n\u003cp\u003eDepuis deux ans on parle de plus en plus de \u003cem\u003eserverless\u003c/em\u003e mais il n\u0026rsquo;est pas toujours simple de voir exactement de ce que cela implique pour une application d\u0026rsquo;être \u003cem\u003eserverless\u003c/em\u003e. Autre point, est-ce qu\u0026rsquo;être serverless implique qu\u0026rsquo;il n\u0026rsquo;y ait pas de serveur du tout ?\u003c/p\u003e","title":"C'est quoi le serverless ?"},{"content":"Si vous n\u0026rsquo;avez pas de compte payant sur docker hub mais que vous ne voulez pas publier publiquement une image docker il va falloir trouver des solutions pour pouvoir héberger vos images docker. Par exemple en montant un registry docker privé pour héberger vos images docker.\nDans cet article nous allons voir comment monter un registry docker et comment y accéder en HTTPs sans avoir à déployer de certificat.\nPour cet exemple je vais utiliser un petit serveur START1-S chez scaleway à moins de 2 euros par mois.\nJe préfère avoir de toutes petites instances de serveurs, plutôt que tout avoir sur la même machine. Si jamais une des machines se fait pirater, ou si elle a une panne matérielle, il n\u0026rsquo;y aura qu\u0026rsquo;un de mes projets perso qui sera hors ligne.\nInstaller docker Dans un premier temps il va falloir installer docker sur la machine. Pour cette étape le mieux est de suivre le tuto présent sur la documentation officielle en fonction de votre OS.\nMettre en place une connexion https Plusieurs méthodes sont possibles, de la plus simple à la plus complexe. Vous pourrez trouver des tutos pour le faire via du let\u0026rsquo;s encrypt mais je suis parti sur quelque chose de plus simple. Comme je gère mes DNS avec cloudflare je vais utiliser le SSL flexible.\nCe n\u0026rsquo;est pas un SSL de bout en bout mais c\u0026rsquo;est suffisant pour ce que je fais sur domaine lahaxe.fr. Il n\u0026rsquo;y a en effet aucune donnée critique qui transite dessus.\nCréer un sous domaine Dans le menu DNS il va falloir ajouter une entrée, par exemple dans mon cas \u0026quot; registry.lahaxe.fr\u0026quot;, et la faire pointer vers votre serveur.\nActiver le SSL flexible dans cloudflare Dans le menu Crypto il y a une section SSL. Dans le menu déroulant il faut sélectionner Flexible.\nEncore une fois, c\u0026rsquo;est satisfaisant pour un projet perso, mais ça ne l\u0026rsquo;est pas pour de la vraie production.\nLancer le registry Il existe une image officielle pour monter son propre registry. Elle est très sobrement nommé registry.\nL\u0026rsquo;image expose le port 5000 mais on va le mapper sur le port 80 afin de profiter du SSL flexible de Cloudflare.\ndocker run -d -p 80:5000 --restart=always --name registry -v /opt/docker-registry:/var/lib/registry registry:2 Vous pouvez vérifier le bon fonctionnement en consultant l\u0026rsquo;url https://registry.lahaxe.fr/v2/_catalog (dans mon cas).\nA partir de ce moment vous avez un registry fonctionnel mais public. N\u0026rsquo;importe qui peut pousser et télécharger une image dessus. Nous verrons dans la section \u0026ldquo;sécuriser le registry\u0026rdquo; comment mettre en place la sécurité sur le registry.\nUploader une image Maintenant que nous avons notre registry de disponible nous allons pouvoir lui pousser une image pour nous assurer que tout est bien configuré.\n# pull d\u0026#39;une image sur le hub docker pull alpine # on re-tag l\u0026#39;image docker image tag alpine registry.lahaxe.fr/alpine # push de l\u0026#39;image sur notre registry docker push registry.lahaxe.fr/alpine Sécuriser le registry Avoir un registry ouvert est une très mauvaise pratique. Afin de le sécuriser un minimum nous pouvons mettre en place deux sécurités de base.\nFiltre par IP L\u0026rsquo;idée est de donner les accès seulement à vos serveurs et aux personnes qui doivent interagir avec. Il va donc falloir sécuriser le port 80 de serveur (ou le 443 si vous faites du SSL de bout en bout).\nDe mon côté je vais utiliser les security policies de scaleway pour bloquer le port. Attention: Il faut bien penser à redémarrer le serveur après avoir changé les règles de firewall scaleway. Mais sinon vous pouvez mettre en place un filtrage via iptable ou via shorewall.\nMettre en place de l\u0026rsquo;authentification Dans un premier temps il va falloir générer un fichier htpasswd avec le ou les logins et mots de passes.\nmkdir auth docker run --entrypoint htpasswd registry:2 -Bbn username MySuperP4ssw0rd123 \u0026gt; auth/htpasswd Il suffit de dire à l\u0026rsquo;image docker de prendre ce fichier et d\u0026rsquo;activer l\u0026rsquo;authentification basique. Il est absolument nécessaire d\u0026rsquo;être en HTTPS pour cette authentification sinon le mot de passe passera en clair dans les trames HTTP.\n# si vous avez un container qui tourne déjà docker rm -f registry docker run -d -p 80:5000 --restart=always --name registry -v `pwd`/auth:/auth -e \u0026#34;REGISTRY_AUTH=htpasswd\u0026#34; -e \u0026#34;REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm\u0026#34; -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /opt/docker-registry:/var/lib/registry registry:2 Sur les pc \u0026ldquo;clients\u0026rdquo;, votre desktop par exemple, il faudra faire un docker login pour pouvoir utiliser le registry.\ndocker login registry.lahaxe.fr Je ne mets pas en place de system de backup sur le registry car je n\u0026rsquo;en ai pas spécialement le besoin. Je préfère stocker l\u0026rsquo;ensemble de mes dockerfiles afin de pouvoir les reconstruire en cas de besoin.\n","permalink":"https://outweb.eu/2018/12/31/monter-un-registry-docker-prive/","summary":"\u003cp\u003eSi vous n\u0026rsquo;avez pas de compte payant sur docker hub mais que vous ne voulez pas publier publiquement une image docker il va falloir trouver des solutions pour pouvoir héberger vos images docker. Par exemple en montant un registry docker privé pour héberger vos images docker.\u003c/p\u003e\n\u003cp\u003eDans cet article nous allons voir comment monter un registry docker et comment y accéder en HTTPs sans avoir à déployer de certificat.\u003c/p\u003e\n\u003cp\u003ePour cet exemple je vais utiliser un petit serveur START1-S chez scaleway à moins de 2 euros par mois.\u003c/p\u003e","title":"Monter un registry docker privé"},{"content":"Mole est une application en ligne de commande qui permet de simplifier la création de tunnels SSH.\nIl est parfois utile de monter un tunnel pour accéder à un service qui n\u0026rsquo;est pas ouvert sur le WEB. Par exemple si votre serveur MYSQL, n\u0026rsquo;est accessible que depuis votre serveur web ou votre serveur de backup. Ou encore pour contourner un firewall qui bloquerait un port en particulier.\nSur cet exemple le serveur bleu ne peut pas accéder au port 80 (application web) du serveur rouge car un firewall le bloque. Mais le port 22 (ssh) est accessible. Il est donc possible de créer un tunnel qui forward le port 80 sur serveur rouge sur le port 8080 du serveur bleu. Une fois le tunnel mis en place il sera possible d\u0026rsquo;accéder à l\u0026rsquo;application web du serveur rouge via l\u0026rsquo;url: http://blue:8080.\nInstallation Deux méthodes d\u0026rsquo;installation sont possibles. Via le script d\u0026rsquo;installation ou via homebrew pour les utilisateurs de mac.\nL\u0026rsquo;installation via le script :\nbash \u0026lt;(curl -fsSL https://raw.githubusercontent.com/davrodpin/mole/master/tools/install.sh) Je vous invite à vérifier le contenu du script avant de le lancer.\nL\u0026rsquo;installation via homebrew :\nbrew tap davrodpin/homebrew-mole \u0026amp;\u0026amp; brew install mole Mole est utile car il nous simplifie la syntaxe pour créer un tunnel ssh. En effet il n\u0026rsquo;apporte rien de plus que de la simplification.\nPar exemple la commande suivante, qui permet d\u0026rsquo;accéder au port 80 local d\u0026rsquo;une machine :\n➜ ssh -L 8080:xxxxx@wordpress:80 root@wordpress Se transforme en quelque chose de plus simple via mole :\n➜ mole -remote :80 -local :8080 -server xxxxx@wordpress Utilisation Pour se connecter à un serveur mysql qui n\u0026rsquo;est pas ouvert sur le web nous allons ouvrir un tunnel entre le port 3306 local du serveur et le port 3307 de mon mac :\n➜ mole -v -remote :3306 -local :3307 -server xxxxx@wordpress Je peux maintenant me connecter au serveur mysql du serveur sur le port 3307 de ma machine :\n➜ mysql connect -h 127.0.0.1 -P 3307 -uxxxxxxx -p Gestion des alias Le dernier point qui est bien pratique si vous avez à jongler avec plusieurs serveurs c\u0026rsquo;est la gestion des alias. Il est possible d\u0026rsquo;enregister des alias pour les tunnels que l\u0026rsquo;on a fréquemment à créer.\n➜ mole -alias wp-mysql -remote :3306 -local :3307 -server xxxxx@wordpress ➜ mole -start wp-mysql ","permalink":"https://outweb.eu/2018/12/24/gerer-ses-tunnels-ssh-avec-mole/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/davrodpin/mole\"\u003eMole\u003c/a\u003e est une application en ligne de commande qui permet de simplifier la création de tunnels SSH.\u003c/p\u003e\n\u003cp\u003eIl est parfois utile de monter un tunnel pour accéder à un service qui n\u0026rsquo;est pas ouvert sur le WEB. Par exemple si votre serveur MYSQL, n\u0026rsquo;est accessible que depuis votre serveur web ou votre serveur de backup. Ou encore pour contourner un firewall qui bloquerait un port en particulier.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2018/11/ssh-local1-1024x628.png\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eSur cet exemple le serveur bleu ne peut pas accéder au port 80 (application web) du serveur rouge car un firewall le bloque. Mais le port 22 (ssh) est accessible. Il est donc possible de créer un tunnel qui forward le port 80 sur serveur rouge sur le port 8080 du serveur bleu. Une fois le tunnel mis en place il sera possible d\u0026rsquo;accéder à l\u0026rsquo;application web du serveur rouge via l\u0026rsquo;url: http://blue:8080.\u003c/p\u003e","title":"Gérer ses tunnels SSH avec Mole"},{"content":"Fx est une application node installable via npm ou yarn qui permet de visualiser et d\u0026rsquo;interagir avec un json directement dans le terminal.\nCe qui est intéressant c\u0026rsquo;est qu\u0026rsquo;il est possible d\u0026rsquo;explorer le json en précisant un path à afficher.\nVoici un exemple sur un fichier package.json :\nIl est même possible d\u0026rsquo;aller un peu plus loin et de lui donner une ou plusieurs fonctions anonymes en paramètre.\nUn petit outil sympa qui va vous éviter de copier/ coller votre json dans un IDE pour le remettre en forme et naviguer dedans.\n","permalink":"https://outweb.eu/2018/12/17/explorer-vos-json-dans-le-terminal-avec-fx/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/antonmedv/fx\"\u003eFx\u003c/a\u003e est une application node installable via npm ou yarn qui permet de visualiser et d\u0026rsquo;interagir avec un json directement dans le terminal.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"https://user-images.githubusercontent.com/141232/47933350-f0f22900-df06-11e8-9cf2-88492c1be774.gif\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eCe qui est intéressant c\u0026rsquo;est qu\u0026rsquo;il est possible d\u0026rsquo;explorer le json en précisant un path à afficher.\u003c/p\u003e\n\u003cp\u003eVoici un exemple sur un fichier package.json :\u003c/p\u003e\n\u003cp\u003eIl est même possible d\u0026rsquo;aller un peu plus loin et de lui donner une ou plusieurs fonctions anonymes en paramètre.\u003c/p\u003e\n\u003cp\u003eUn petit outil sympa qui va vous éviter de copier/ coller votre json dans un IDE pour le remettre en forme et naviguer dedans.\u003c/p\u003e","title":"Explorer vos json dans le terminal avec fx"},{"content":"HypriotOs est une version de raspbian dans laquelle docker, et docker swarm sont pré installés. La particularité est que HypriotOs tourne sur des architectures ARM telles que les Raspberry, le Nvidia shield et quelques autres cartes comme les ODROID C2.\nDans cet article, nous allons voir comment monter un petit cluster swarm avec trois noeuds (1 manager et 2 workers). Une fois la partie serveur montée, nous ferons tourner des services dessus à la fois en lignes de commandes et via une interface graphique.\nSwarm Swarm est l\u0026rsquo;orchestrateur historiquement intégré dans docker. Il permet de distribuer automatiquement les containers sur l\u0026rsquo;un ou l\u0026rsquo;autre des noeuds du cluster en fonction de l\u0026rsquo;indisponibilité ou de la charge d\u0026rsquo;un noeud. Docker inc a été testé pour scal\nler jusqu’à 1 000 nœuds et 50 000 conteneurs sans dégradation de performance. A mon avis nous allons avoir du mal à faire tourner autant de conteneurs sur nos Raspberry.\nIl existe deux types de noeuds, les managers et les workers. Pour faire simple, les managers peuvent administrer ce qui tourne sur le cluster et répartir le travail sur les workers tandis que les workers sont de simples exécutants qui lancent des containers.\nDe base, le cluster va faire du mesh routing. Cela signifie, par exemple, que si vous lancez un serveur web sur le port 80 quelque part sur votre cluster, vous pourrez y accéder en attaquant n\u0026rsquo;importe quelle machine (worker ou manager) qui compose le cluster. Swarm va aussi nous proposer un système de load balancing afin de pouvoir distribuer la charge entre différentes instances d\u0026rsquo;un service.\nLes deux points précédents sont disponibles, sans configuration, dès la création de votre cluster.\nChoix des matériaux Pour monter mon cluster avec trois noeuds il va me falloir le matériel suivant :\n3 Raspberry pi (idéalement v2 ou v3) 4 cables réseaux 1 switch ethernet gigabit 1 alimentation usb (cette alimentation est très bien pour brancher plusieurs Raspberry) 3 cables micro usb 1 support pour empiler les rasps 3 cartes micro SD d\u0026rsquo;au moins 8Go de bonne qualité Installer HypriotOs sur les cartes Pour les utilisateurs de Linux et MacOs il existe un outil proposé par la communauté de Hypriot pour flasher les cartes. Malheureusement, pour les utilisateurs de Windows, les choses sont un peu plus compliquées.\nPour linux et mac Hypriot flash est un utilitaire en lignes de commandes qui va s\u0026rsquo;occuper de tout, de la décompression de l\u0026rsquo;image à l\u0026rsquo;installation sur la carte SIM. Pour l\u0026rsquo;installation, tout est précisé dans le readme du dépôt.\nTélécharger la dernière image de hypriotos wget https://github.com/hypriot/image-builder-rpi/releases/download/v1.9.0/hypriotos-rpi-v1.9.0.img.zip Vérifier le checksum de l\u0026rsquo;image ➜ cat ../Downloads/hypriotos-rpi-v1.9.0.img.zip.sha256 be21a702887817d8c84c053f9ee4c54e04fd55e9fb9692edc3904801b14c33a8 hypriotos-rpi-v1.9.0.img.zip # sur linux sha256sum / sur mac gsha256sum ➜ gsha256sum hypriotos-rpi-v1.9.0.img.zip be21a702887817d8c84c053f9ee4c54e04fd55e9fb9692edc3904801b14c33a8 hypriotos-rpi-v1.9.0.img.zip Flasher les cartes SD Pour notre manager:\nflash hypriotos-rpi-v1.9.0.img.zip --hostname manager-01 Pour nos workers :\nflash hypriotos-rpi-v1.9.0.img.zip --hostname worker-01 flash hypriotos-rpi-v1.9.0.img.zip --hostname worker-02 Votre mot de passe root vous sera demandé pendant l\u0026rsquo;installation de l\u0026rsquo;image sur la carte.\nVous devriez avoir une sortie console proche de celle ci:\nflash --hostname worker-01 hypriotos-rpi-v1.9.0.img.zip Using cached image /tmp/hypriotos-rpi-v1.9.0.img Is /dev/disk2 correct? yes Unmounting /dev/disk2 ... Unmount of all volumes on disk2 was successful Unmount of all volumes on disk2 was successful Flashing /tmp/hypriotos-rpi-v1.9.0.img to /dev/rdisk2 ... No \u0026#39;pv\u0026#39; command found, so no progress available. Press CTRL+T if you want to see the current info of dd command. Password: 930+1 records in 930+1 records out 975765504 bytes transferred in 111.983538 secs (8713473 bytes/sec) Mounting Disk Mounting /dev/disk2 to customize... Set hostname=worker-01 Unmounting /dev/disk2 ... \u0026#34;disk2\u0026#34; ejected. Finished. Pour windows Je n\u0026rsquo;ai jamais flashé mes cartes SD depuis Windows. Mais vous pourrez trouver une procédure sur le site de hypriot.\nDans le cas de Windows il faudra, si possible, éditer le fichier user-data (c\u0026rsquo;est un yml sans extension) à la racine de la carte SD pour changer le hostname qui est présent dedans. Il faudra en nommer un manager-01 et les deux autres worker-01 et worker-02 histoire de pouvoir suivre dans la suite de l\u0026rsquo;article.\nLes branchements Rien de bien complexe, les câbles ethernet dans les prises ethernets, les cables d\u0026rsquo;alimentation dans les micro usb et les cartes SD dans les slots prévus à cet effet. Et hop, le tour est joué. Vous devriez pouvoir détecter les machines sur votre réseau local.\nSe connecter en SSH sur les différents noeuds Sur mac, j\u0026rsquo;utilise l\u0026rsquo;application LanScan Pro depuis des années pour scanner mon réseau local.\nJ\u0026rsquo;ai bien mes trois Raspberry qui sont présents sur le réseau avec les ip 192.168.1.22, 23 et 24.\nPour se connecter en ssh sur les Raspberry il faut utiliser le login/ mot de passe par défaut de hypriotOS. A savoir pirate/ hypriot.\nA cette étape je vous conseille de faire les mises à jour avant d\u0026rsquo;aller plus loin. Ce serait dommage de faire toute sa configuration sur une version qui a des failles de sécu. De plus il est préférable d\u0026rsquo;avoir les versions de docker sur l\u0026rsquo;ensemble du cluster.\nLe temps des mises à jour vous avez le temps d\u0026rsquo;aller prendre un café :D\nCréation du cluster swarm Creation du manager Sur le rasp nommé manager-01 je vais créer le cluster swarm :\ndocker swarm init La commande va créer le cluster, vous enregistrer en temps que leader et vous donner la commande pour ajouter des workers.\nAjout des workers Pour ajouter les workers on va utiliser la commande donnée au moment de la création du cluster en lançant sur les Raspberry worker-01 et worker-02.\nSi vous avez perdu la commande vous pouvez la récupérer en vous connectant sur un manager et en exécutant la ligne de commande :\ndocker swarm join-token worker On va donc se connecter en ssh sur worker-01 et worker-02 et lancer la commande de join. Vous devriez avoir le résultat suivant :\nSur le manager on va voir apparaitre les noeuds en tant que worker si on utilise la commande docker node ls\nInstallation et utilisation de Portainer Portainer est un outil de visualisation et d\u0026rsquo;administration et de visualisation open source pour docker. Il est assez intéressant dans notre cas car il va nous permettre de visualiser ce qu\u0026rsquo;il se passe sur l\u0026rsquo;ensemble de notre cluster depuis une interface WEB.\nInstallation de portainer On va lancer un container Portainer sur le noeud manager-01.\ndocker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer Portainer est maintenant compatible avec notre architecture arm, il est donc possible d\u0026rsquo;utiliser l\u0026rsquo;image officielle.\nUne fois le container lancé, vous pouvez vous rendre, via votre navigateur, sur le port 9000 de votre manager. Pour moi http://192.168.1.22:9000.\nVous allez être redirigé sur la page de création du compte administrateur. Il est préférable de ne pas conserver le nom d\u0026rsquo;utilisateur par défaut.\nLa seconde étape de l\u0026rsquo;installation est le choix du type de connexion à docker. Nous allons choisir local car nous avons monté le socket docker lors de la création du container.\nMaintenant que Portainer est configuré nous allons pouvoir consulter notre cluster swarm, mais aussi lancer des services si nous le souhaitons.\nOn remarque déjà, que notre cluster est présent et que nos 3 noeuds sont bien détectés.\nEn l\u0026rsquo;état notre cluster est composé de 12 coeurs et de 3 Go de ram.\nLancer un service sur swarm Pour lancer un service, il y a deux possibilité. Soit passer par portainer soit le faire en lignes de commandes. A vous de voir ce que vous préférez. J\u0026rsquo;ai préparé une petite image pour faire cette démo. Je m\u0026rsquo;excuse d\u0026rsquo;avance du poids de l\u0026rsquo;image (120Mo) pour faire un hello world\u0026hellip;\nJ\u0026rsquo;ai buildé une image apache/ php qui affiche le hostname courant (celui du container). L\u0026rsquo;idée est de déployer un service sur le cluster et de voir comment il réagit et quel est le comportement que l\u0026rsquo;on obtient.\nDéployer un service en lignes de commandes Nous allons lancer une instance de notre image sur le cluster. Nous n\u0026rsquo;avons pas à nous soucier du choix de la machine sur laquelle l\u0026rsquo;application va tourner car le routing mesh nous permettra d\u0026rsquo;y accéder depuis n\u0026rsquo;importe quel noeud. Mais vous pouvez le savoir dans portainer en retournant sur la vue Cluster visualisation.\ndocker service create -p 80:80 --name hello-world docker.io/lahaxearnaud/swarm-hello-world Il est possible de préciser beaucoup d\u0026rsquo;options pour limiter les ressources que le container pourra utiliser, la façon de vérifier que l\u0026rsquo;application est toujours up (health check)\u0026hellip;\nDéployer un service avec Portainer Toutes les options que l\u0026rsquo;on peut donner via le cli sont disponibles via portainer pour la création de service. La mise en place de nouveau service est très simplifié grâce à l\u0026rsquo;interface graphique.\nPour notre test nous n\u0026rsquo;avons pas besoin des configurations avancées.\nTester le load balancing Nous avons maintenant un service qui tourne sur notre cluster et qui sert une \u0026ldquo;page\u0026rdquo; web contenant le nom du container qui le fait tourner. Pour tester le load balancing on fait une série d\u0026rsquo;appels et on va regarder si on obtient toujours le même nom de container.\nfor ((i=1;i\u0026lt;=10;i++)); do curl \u0026#34;http://192.168.1.22\u0026#34;; echo \u0026#34;\u0026#34;; done Sans surprise pour le moment je vais obtenir 10 fois la même valeur, car nous n\u0026rsquo;avons qu\u0026rsquo;une instance qui tourne :\nDans un premier temps nous allons faire scaller notre application pour faire tourner 9 instances.\ndocker service scale hello-world=9 Vous pouvez aussi le faire via portainer en cliquant sur le service hello-world dans la section service et en modifiant la valeur dans le champs Replicas.\nIl va falloir attendre un peu que l\u0026rsquo;image soit téléchargée sur les différents Raspberry et que les containers soient lancés. Mais une fois que tout est prêt, on va pouvoir relancer notre commande.\nOn se rend bien compte que la charge est distribuée entre les différentes machines. Sur les 10 hits on a touché les 9 instances.\nConsulter les logs Sur le manager vous pouvez faire un tail sur les logs d\u0026rsquo;un service via la commande docker service log -ft hello-world.\nDans portainer par contre il semblerait qu\u0026rsquo;il y ait un bug et qu\u0026rsquo;il ne remonte que les logs des instances présentes sur le manager.\nQue mettre sur le cluster ? Pour ma part, j\u0026rsquo;utilise swarm depuis au moins deux ans pour ma domotique. Comme je voulais jouer un peu avec l\u0026rsquo;IoT j\u0026rsquo;ai mis des capteurs un peu partout dans l\u0026rsquo;appartement (luminosité, température, mouvements, capteurs d\u0026rsquo;ouverture de porte et de fenêtre\u0026hellip;) et chaque élément envoie des messages dans un rabbitmq. Mon cluster contient l\u0026rsquo;ensemble des consommateurs et l\u0026rsquo;application symfony qui sert l\u0026rsquo;interface graphique. Les consommateurs sont des workers symfony 4 qui utilisent le composant symfony messenger.\nAvoir cette architecture en cluster permet de perdre ou d\u0026rsquo;ajouter un ou plusieurs serveurs sans devoir déplacer des applications à la main. Là où il faut être attentif c\u0026rsquo;est que swarm peut continuer de fonctionner en perdant un worker, mais la perte des managers est plus problématique. Il est préférable d\u0026rsquo;avoir plusieurs managers pour éviter que le cluster se retrouve sans manager en cas de panne. Un nombre impair de managers est préférable pour s\u0026rsquo;assurer que l\u0026rsquo;algorithme (Raft) arrive à élire un nouveau leader.\nRetour d\u0026rsquo;expérience La technologie est sympa et la fiabilité est au rendez-vous sur tout ce qui est worker et application web. Par contre, j\u0026rsquo;ai rencontré pas mal de problèmes en voulant mettre un rabbitmq, un elastic search ou encore un mysql dans le cluster. Après plusieurs crashes je les ai installés sur une machine séparée. Je ne sais pas à quel niveau se situe le problème, mais depuis que c\u0026rsquo;est sur un rasp séparé il n\u0026rsquo;y a plus de problèmes.\nL\u0026rsquo;autre point est que j\u0026rsquo;ai une livebox à la maison, c\u0026rsquo;est elle qui me sert de DHCP (c\u0026rsquo;est dans ma todo de faire autrement). Elle a tendance à sortir du réseau les machines avec des ips fixes au bout de quelques jours. Je me suis retrouvé à plusieurs reprises avec un cluster qui était HS car toutes les machines étaient déconnectées.\nLe fait d\u0026rsquo;être sur une architecture ARM nous empêche d\u0026rsquo;utiliser la plupart des images disponibles sur les hubs. Il faut donc passer du temps à faire ses propres images. Ce n\u0026rsquo;est pas forcement un mal !\nFaq Comment retirer proprement un noeud d\u0026rsquo;un cluster swarm ?\nSi c\u0026rsquo;est un manager il faut se poser la question de promouvoir un worker en manager avant de commencer docker node promote worker-02 puis vous devez retirer le role manager au noeud à supprimer docker node demote manager-01. La seconde étape est de dire à l\u0026rsquo;orchestrateur d\u0026rsquo;enlever tout ce qui tourne sur le noeud docker node update --availability drain worker-01. Une fois qu\u0026rsquo;il n\u0026rsquo;y a plus rien sur le noeud on peut le sortir du cluster via la commande docker node rm worker-01. De cette manière il n\u0026rsquo;y aura pas d\u0026rsquo;interruption de service.\nComment supprimer le cluster swarm ?\nDans un premier temps il faut supprimer les services qui tournent dessus : docker service rm mon-service. Une fois que c\u0026rsquo;est fait vous pouvez supprimer les noeuds un à un via docker node rm -f node-name. Puis sur le manager faire un docker swarm leave -f.\nEst-ce qu\u0026rsquo;il est possible de deployer une image locale ?\nNon, il n\u0026rsquo;est pas possible de déployer une image qui n\u0026rsquo;est pas dans un registry. Mais vous pouvez monter votre propre registry et l\u0026rsquo;utiliser pour déployer vos images sur vos workers.\nEst-il possible de déployer un fichier docker-compose sur swarm ?\nOui c\u0026rsquo;est possible via docker stack deploy\nEst-ce que l\u0026rsquo;on peut monter des volumes dans les services ?\nOui vous pouvez, maintenant il y aura autant de volume que de noeuds sur lesquels tourneront vos applications.\n","permalink":"https://outweb.eu/2018/12/10/monter-un-cluster-swarm-avec-des-raspberry-pi-et-hypriotos/","summary":"\u003cp\u003eHypriotOs est une version de \u003ca href=\"https://www.raspberrypi.org/downloads/raspbian/\"\u003eraspbian\u003c/a\u003e dans laquelle docker, et docker swarm sont pré installés. La particularité est que HypriotOs tourne sur des architectures ARM telles que les Raspberry, le Nvidia shield et quelques autres cartes comme les ODROID C2.\u003c/p\u003e\n\u003cp\u003eDans cet article, nous allons voir comment monter un petit cluster swarm avec trois noeuds (1 manager et 2 workers). Une fois la partie serveur montée, nous ferons tourner des services dessus à la fois en lignes de commandes et via une interface graphique.\u003c/p\u003e","title":"Monter un cluster swarm avec des Raspberry pi et HypriotOS"},{"content":"Phpstan est un outil en ligne de commande qui va vous permettre de détecter automatiquement les erreurs les plus simples en scannant l\u0026rsquo;intégralité de votre projet.\nDe base, l\u0026rsquo;outil va analyser une application PHP sans tenir compte des spécificités des différents frameworks et librairies. C\u0026rsquo;est pourquoi il existe des extensions comme PHPstan Symfony pour affiner l\u0026rsquo;analyse.\nSi comme moi vous voulez l\u0026rsquo;utiliser sur un projet qui a beaucoup de legacy (plus de 10 ans) vous allez avoir un rapport gigantesque. Il faut trouver des solutions pour réduire le rapport à la pull request (merge request) que l\u0026rsquo;on doit relire.\nIl existe justement un outil qui permet de faire cette corrélation entre le diff et le rapport de PHPstan. Reviewdog est une application en go qui permet de prendre en entrée le rapport d\u0026rsquo;un outil d\u0026rsquo;analyse de code comme eslint, golint ou dans notre cas PHPstan.\nSans passer par reviewdog :\n➜ vendor/bin/phpstan analyse src -l 4 --no-progress --error-format=raw | wc -l 292 292 anomalies sur la globalité du projet.\nEn passant par reviewdog :\n➜ vendor/bin/phpstan analyse src -l 4 --no-progress --error-format=raw | reviewdog -diff=\u0026#34;git diff master\u0026#34; -f=phpstan | wc -l 2 Il se reste que deux anomalies, et elles sont directement liées au diff entre la branche courante et master.\nReviewdog peut se connecter directement sur votre gitlab ou github pour ajouter des commentaires dans les pull requests.\nTout ceci ne remplace pas une relecture par un \u0026ldquo;humain\u0026rdquo; mais cela va nous donner des indicateurs de qualité et va vous délester des vérifications les plus simples (Est-ce que cette méthode/ classe existe ?). Selon le niveau de vérification que l\u0026rsquo;on donne à PHPstan on va pouvoir vérifier plus ou moins de choses, comme les dockblocks par exemple.\nCe qui est assez intéressant c\u0026rsquo;est que PHPstan est extensible et qu\u0026rsquo;il est donc possible de créer nos propres vérifications. Il serait donc possible, par exemple, de remonter une alerte quand on utilise une classe ou méthode marquée comme dépréciée dans notre code.\n","permalink":"https://outweb.eu/2018/12/03/analyse-de-code-static-avec-phpstan/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/phpstan/phpstan\"\u003ePhpstan\u003c/a\u003e est un outil en ligne de commande qui va vous permettre de détecter automatiquement les erreurs les plus simples en scannant l\u0026rsquo;intégralité de votre projet.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003cimg loading=\"lazy\" src=\"https://github.com/phpstan/phpstan/raw/master/build/phpstan.gif\"/\u003e \n\u003c/figure\u003e\n\n\u003cp\u003eDe base, l\u0026rsquo;outil va analyser une application PHP sans tenir compte des spécificités des différents frameworks et librairies. C\u0026rsquo;est pourquoi il existe des extensions comme \u003ca href=\"https://github.com/phpstan/phpstan-symfony\"\u003ePHPstan Symfony\u003c/a\u003e pour affiner l\u0026rsquo;analyse.\u003c/p\u003e\n\u003cp\u003eSi comme moi vous voulez l\u0026rsquo;utiliser sur un projet qui a beaucoup de legacy (plus de 10 ans) vous allez avoir un rapport gigantesque. Il faut trouver des solutions pour réduire le rapport à la pull request (merge request) que l\u0026rsquo;on doit relire.\u003c/p\u003e","title":"Analyse de code statique avec phpstan"},{"content":"Au travail nous avons pour politique de builder et de maintenir nos propres images docker. Mais pour un projet perso j\u0026rsquo;utilise des images docker publiques. Je m\u0026rsquo;efforce d\u0026rsquo;utiliser au maximum des images officielles mais certaines contributions de la communauté sont parfaites pour mes besoins. Le problème est de savoir avec certitude ce que contient un image. Une image téléchargée sur un hub est une boîte noire qu\u0026rsquo;il faut inspecter avant de l\u0026rsquo;utiliser.\nCas d\u0026rsquo;images corrompues Il y a l\u0026rsquo;exemple de l\u0026rsquo;utilisateur docker123321 qui a diffusé 17 images contenant des backdoors sur dockerhub. Parmi les images il y a tomcat, mysql ou encore cron. Avec quasiment 5 millions de téléchargements docker123321 a réussi à miner plus de 500 Moneros en plus des portes d\u0026rsquo;entrées qu\u0026rsquo;il a créées sur le serveur.\nContenu d\u0026rsquo;une image docker Une image docker est une succession de couches (layers) qui contiennent une liste de modifications du système de fichiers. On peut faire une analogie avec GIT où chaque layer serait un commit. Au moment de la création d\u0026rsquo;un container un layer est ajouté au-dessus de ceux de l\u0026rsquo;image. Mis à part ce layer \u0026ldquo;applicatif\u0026rdquo; les layers sont en read only.\nInspecter les layers avec Dive Dive est un programme écrit en Go qui va vous permettre d\u0026rsquo;en savoir plus sur une image avant de l\u0026rsquo;utiliser. Il ne va pas permettre de s\u0026rsquo;assurer à 100% que l\u0026rsquo;image n\u0026rsquo;est pas corrompue mais il va pouvoir nous donner des information précieuses.\nPour l\u0026rsquo;installation je vous laisse vous référer au readme du projet.\nVoici un exemple d\u0026rsquo;utilisation sur l\u0026rsquo;image jonbaldie/varnish que j\u0026rsquo;utilise pour un projet perso.\n➜ dive jonbaldie/varnish Sur l\u0026rsquo;image on a 5 layers :\nL\u0026rsquo;image de base L\u0026rsquo;ajout d\u0026rsquo;un script d\u0026rsquo;installation (/install.sh) Le résultat de l\u0026rsquo;execution du script d\u0026rsquo;install L\u0026rsquo;ajout du script de boot (/start.sh) Le chmod du script de boot Vérifier les scripts présents dans l\u0026rsquo;image Sur la base des informations données par Dive, il ne nous reste plus qu\u0026rsquo;à vérifier, si possible, le contenu des fichiers install.sh et start.sh\nPour un fichier toujours présent dans le dernier layer Le fichier start.sh n\u0026rsquo;est pas supprimé après l\u0026rsquo;installation. Il est donc simple de le consulter:\n➜ docker run --rm -ti jonbaldie/varnish cat /start.sh Pour un fichier non présent dans le dernier layer Pour le fichier install.sh il ne va malheureusement pas être possible de l\u0026rsquo;afficher car il est supprimé pendant le build. Le docker history de l\u0026rsquo;image ne me donne pas d\u0026rsquo;image Id correspondant à ce layer car je n\u0026rsquo;ai pas buildé l\u0026rsquo;image sur ma machine.\nIl n\u0026rsquo;est pas possible de lancer un container sur une image qui contient le install.sh. Et c\u0026rsquo;est bien là le problème ! C\u0026rsquo;est une boîte noire.\nPour arriver à consulter ce fichier il va falloir exporter l\u0026rsquo;image et naviguer dans les layers \u0026ldquo;à la main\u0026rdquo;.\nPour voir le fichier on va récupérer le tar id du layer qui nous intéresse via Dive :\nOn sait donc maintenant qu\u0026rsquo;il faut regarder le contenu du tar \u0026ldquo;c06fe384a155fd3501bdb5689a4d79a18c80a63243038184f457793490b7ddde\u0026rdquo; pour trouver mon fichier install.sh.\nhttps://gist.github.com/lahaxearnaud/240f2bc3639a7d44ff0e024aa0745ab8\nVérifier l\u0026rsquo;image de base Dans notre cas l\u0026rsquo;image est construite à partir d\u0026rsquo;une debian officielle. Mais comment s\u0026rsquo;en assurer ? Est-ce que cette debian est à jour ?\nDans un premier temps on va chercher la version de debian installée :\n➜ varnish docker run --rm jonbaldie/varnish cat /etc/os-release Malheureusement je ne sais pas comment vérifier que cette debian est bien une version officielle. Je ne peux pas non plus m\u0026rsquo;assurer que les mises à jour de sécurité sont faites.\nLe seul indicateur de qualité à ce niveau est de regarder les builds. Cette image est buildée automatiquement sur la Docker Cloud\u0026rsquo;s infrastructure. Ce point est primordial dans le choix d\u0026rsquo;une image non officielle car cela nous donne l\u0026rsquo;assurance que le docker file affiché est bien celui qui est utilisé pour le build.\nSur le dernier build par exemple nous avons plusieurs informations à disposition :\nBuilding in Docker Cloud\u0026#39;s infrastructure... Cloning into \u0026#39;.\u0026#39;... KernelVersion: 4.4.0-93-generic Arch: amd64 BuildTime: 2017-08-17T22:50:04.828747906+00:00 ApiVersion: 1.30 Version: 17.06.1-ce MinAPIVersion: 1.12 GitCommit: 874a737 Os: linux GoVersion: go1.8.3 Starting build of index.docker.io/jonbaldie/varnish:latest... Step 1/9 : FROM debian ---\u0026gt; 874e27b628fd Step 2/9 : MAINTAINER Jonathan Baldie \u0026#34;jon@jonbaldie.com\u0026#34; ---\u0026gt; Running in 3691027bb23a ---\u0026gt; 6e1fd6e2af21 Removing intermediate container 3691027bb23a Step 3/9 : ADD install.sh install.sh ---\u0026gt; 2d9d517255c6 Removing intermediate container 1882f5bc4a22 Step 4/9 : RUN chmod +x install.sh \u0026amp;\u0026amp; sh ./install.sh \u0026amp;\u0026amp; rm install.sh ---\u0026gt; Running in 77dd464fc5be Ign:1 http://deb.debian.org/debian stretch InRelease //... Get:8 http://security.debian.org stretch/updates/main amd64 Packages [227 kB] Fetched 10.0 MB in 4s (2119 kB/s) Reading package lists... Reading package lists... Building dependency tree... Reading state information... The following additional packages will be installed: binutils cpp cpp-6 gcc gcc-6 libasan3 libatomic1 libbsd0 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libedit2 libgcc-6-dev libgmp10 libgomp1 libgpm2 libisl15 libitm1 libjemalloc1 liblsan0 libmpc3 libmpfr4 libmpx2 libncurses5 libquadmath0 libtsan0 libubsan0 libvarnishapi1 linux-libc-dev manpages manpages-dev Suggested packages: binutils-doc cpp-doc gcc-6-locales gcc-multilib make autoconf automake libtool flex bison gdb gcc-doc gcc-6-multilib gcc-6-doc libgcc1-dbg libgomp1-dbg libitm1-dbg libatomic1-dbg libasan3-dbg liblsan0-dbg libtsan0-dbg libubsan0-dbg libcilkrts5-dbg libmpx2-dbg libquadmath0-dbg glibc-doc gpm man-browser varnish-doc The following NEW packages will be installed: binutils cpp cpp-6 gcc gcc-6 libasan3 libatomic1 libbsd0 libc-dev-bin libc6-dev libcc1-0 libcilkrts5 libedit2 libgcc-6-dev libgmp10 libgomp1 libgpm2 libisl15 libitm1 libjemalloc1 liblsan0 libmpc3 libmpfr4 libmpx2 libncurses5 libquadmath0 libtsan0 libubsan0 libvarnishapi1 linux-libc-dev manpages manpages-dev varnish 0 upgraded, 33 newly installed, 0 to remove and 1 not upgraded. Need to get 30.5 MB of archives. After this operation, 123 MB of additional disk space will be used. Get:1 http://deb.debian.org/debian stretch/main amd64 libbsd0 amd64 0.8.3-1 [83.0 kB] //... Get:33 http://deb.debian.org/debian stretch/main amd64 varnish amd64 5.0.0-7+deb9u1 [690 kB] [91mdebconf: delaying package configuration, since apt-utils is not installed [0m Fetched 30.5 MB in 1s (18.9 MB/s) Selecting previously unselected package libbsd0:amd64. Preparing to unpack .../00-libbsd0_0.8.3-1_amd64.deb ... //... Setting up varnish (5.0.0-7+deb9u1) ... Processing triggers for libc-bin (2.24-11+deb9u1) ... vcl 4.0; backend default { .host = \u0026#34;127.0.0.1\u0026#34;; .port = \u0026#34;8080\u0026#34;; } ---\u0026gt; 0953378c3b8d Removing intermediate container 77dd464fc5be Step 5/9 : VOLUME /var/lib/varnish /etc/varnish ---\u0026gt; Running in c56c31df17fb ---\u0026gt; e7f1ae57b0f0 Removing intermediate container c56c31df17fb Step 6/9 : EXPOSE 80 ---\u0026gt; Running in e1f015e6366e ---\u0026gt; 6000a2d9d149 Removing intermediate container e1f015e6366e Step 7/9 : ADD start.sh /start.sh ---\u0026gt; 085cec1148a7 Removing intermediate container 73e8ab753261 Step 8/9 : RUN chmod +x /start.sh ---\u0026gt; Running in 8ab33da3607a ---\u0026gt; 06f67d6546ac Removing intermediate container 8ab33da3607a Step 9/9 : CMD /start.sh ---\u0026gt; Running in 3910129787df ---\u0026gt; afa9f74c8d64 Removing intermediate container 3910129787df Successfully built afa9f74c8d64 Successfully tagged jonbaldie/varnish:latest Pushing index.docker.io/jonbaldie/varnish:latest... Done! Build finished Première information, l\u0026rsquo;image est bien construite à partir de l\u0026rsquo;image debian officielle comme on peut le voir à la step 1: \u0026ldquo;Step 1/9 : FROM debian\u0026rdquo;.\nSeconde information, l\u0026rsquo;image a été buildée le 17 Août 2017. Toutes les failles détectées depuis cette date sur varnish et debian stretch ne sont donc pas patchées.\nPour les images qui ne sont pas buildées automatiquement sur la plateforme je ne sais pas si c\u0026rsquo;est possible de vérifier l\u0026rsquo;intégrité de l\u0026rsquo;image de base. J\u0026rsquo;ai tenté plusieurs approches mais comme l\u0026rsquo;image utilise une \u0026ldquo;latest\u0026rdquo; et qu\u0026rsquo;elle a été remplacée par une nouvelle version je ne vois pas comment faire pour retrouver mon layer. Si vous avez une solution, je suis preneur.\nBuilder ses propres images La solution qui présente le moins de risques est de builder soi-même ses images à partir des Dockerfiles mis à disposition par les contributeurs. De cette manière on peut faire une revue complète du code et des dépendances. En buildant moi-même mon image je pourrais avoir une version plus à jour de debian et de varnish.\n➜ git clone https://github.com/jonbaldie/varnish.git ➜ cd varnish ➜ docker build -t alahaxe/varnish:latest . Conclusion Il faut absolument se méfier des images mises à disposition sur le Dockerhub. Avant d\u0026rsquo;utiliser une image on doit se poser au minimum les questions suivantes :\nEst-ce que l\u0026rsquo;image est officielle ou buildée automatiquement ? Si non, est-ce que les sources sont disponibles ? Si oui, est-ce que le dockerfile présenté est vraiment celui qui a servi à builder l\u0026rsquo;image ? De quand date la dernière build ? Au moindre doute il est préférable de builder sa propre version de l\u0026rsquo;image ou d\u0026rsquo;en utiliser une autre.\n","permalink":"https://outweb.eu/2018/11/26/securite-verifier-le-contenu-d-une-image-docker/","summary":"\u003cp\u003eAu travail nous avons pour politique de builder et de maintenir nos propres images docker. Mais pour \u003ca href=\"/cocktailand-la-stack-technique/\"\u003eun projet perso\u003c/a\u003e j\u0026rsquo;utilise des images docker publiques. Je m\u0026rsquo;efforce d\u0026rsquo;utiliser au maximum des images officielles mais certaines contributions de la communauté sont parfaites pour mes besoins. Le problème est de savoir avec certitude ce que contient un image. Une image téléchargée sur un hub est une boîte noire qu\u0026rsquo;il faut inspecter avant de l\u0026rsquo;utiliser.\u003c/p\u003e","title":"Comment vérifier le contenu d'une image docker"},{"content":"Avec le boulot, on a décidé de partager notre expérience dans les écoles et événements autour du WEB sur la région Nancéienne . Il n\u0026rsquo;est pas exclu, par la suite, de participer à des événements plus grands comme le forum PHP, le PHP Tour, le blendmix web ou autres événements du genre. Mais comme nous ne sommes pas très habitués à ce genre d\u0026rsquo;événements autant commencer plus modestement. Depuis des années nous assistons aux conférences, mais passer de l\u0026rsquo;autre côté du pupitre n\u0026rsquo;est pas une chose que l\u0026rsquo;on improvise.\nhttps://twitter.com/EpitechNancy/status/1051861581519364096\nLe 15 octobre nous avons fait notre première présentation technique \u0026ldquo;en extérieur\u0026rdquo; dans les locaux d\u0026rsquo;Epitech Nancy. Nous avons parlé de l\u0026rsquo;utilisation que nous faisons du cache HTTP sur notre infrastructure SOA.\nC\u0026rsquo;est une très bonne expérience qui nous oblige à vulgariser notre travail pour pouvoir l\u0026rsquo;expliquer correctement à un groupe. En construisant notre présentation, nous avons dû nous replonger dans la documentation de varnish et des ESI afin d\u0026rsquo;éviter les approximations ou les contre-vérités. Il est parfois simple d\u0026rsquo;utiliser une technologie, avec une connaissance partielle, mais pour expliquer le fonctionnement, il faut la maîtriser totalement.\nCôté étudiants, nous avons eu des retours plutôt positifs. Nous sommes repartis avec une liste de thématiques, propres à notre infra, qui pourraient être intéressantes à présenter la prochaine fois.\nUne première expérience que l\u0026rsquo;on va essayer de répéter rapidement avec les écoles du secteur.\n","permalink":"https://outweb.eu/2018/11/19/intervention-a-epitech-nancy/","summary":"\u003cp\u003eAvec le boulot, on a décidé de partager notre expérience dans les écoles et événements autour du WEB sur la région Nancéienne \u003cstrong\u003e.\u003c/strong\u003e Il n\u0026rsquo;est pas exclu, par la suite, de participer à des événements plus grands comme le forum PHP, le PHP Tour, le blendmix web ou autres événements du genre. Mais comme nous ne sommes pas très habitués à ce genre d\u0026rsquo;événements autant commencer plus modestement. Depuis des années nous assistons aux conférences, mais passer de l\u0026rsquo;autre côté du pupitre n\u0026rsquo;est pas une chose que l\u0026rsquo;on improvise.\u003c/p\u003e","title":"Intervention à Epitech Nancy"},{"content":"Symfony 4 apporte un nouveau composant qui va nous permettre de brancher notre application sur un, ou des, brokers de messages. Grâce à ce composant, on va pouvoir accélérer notre application en traitant de façon asynchrone tout ce qui n\u0026rsquo;est pas strictement nécessaire à l\u0026rsquo;affichage de nos pages. Ce module maintenu par la Core Team Symfony va à terme remplacer les bundles existants.\nUse case Un exemple couramment utilisé pour expliquer pourquoi c\u0026rsquo;est nécessaire d\u0026rsquo;utiliser ce genre de technique est le suivant:\nUn utilisateur passe une commande sur mon site de e-commerce. Il a payé sa commande et attend juste le message de confirmation. Si je traite tout en synchrone je vais devoir réaliser plusieurs traitements avant de lui rendre la main:\nChanger le statut de sa commande Mettre à jour les stocks et invalider les caches qui correspondent Envoyer un email de confirmation au client Prévenir le service de préparation de cette nouvelle commande Envoyer des metrics pour suivre le volume des ventes Sur les 5 tâches citées, le client n\u0026rsquo;a besoin que de la première de façon immédiate. Les autres peuvent se faire dans les secondes ou minutes qui suivent.\nAu-delà du simple point de performance il y a aussi le problème de responsabilité unique. Si toute cette logique est dans le contrôleur, vous allez devoir gérer tout un ensemble de règles disparates. Le contrôleur va forcement devenir inmaintenable au bout d\u0026rsquo;un moment.\nAMQP Pour pouvoir différer les autres tâches, il va falloir que je pousse des messages dans des queues (type rabbitmq, SQS) et que des workers viennent les consommer pour réaliser les traitements.\nSur cet exemple, de Microsoft, on voit bien le principe d\u0026rsquo;un broker de message. Un ou plusieurs producteurs (senders) envoient des messages dans une queue et ils sont dépilés par un ou plusieurs consommateurs (receivers).\nDans le meilleur des mondes, vous n\u0026rsquo;avez qu\u0026rsquo;une technologie de service de queue et peut-être même qu\u0026rsquo;un seul serveur à interroger. Dans ce cas, c\u0026rsquo;est assez simple et vous utilisez sûrement déjà un client php pour le faire.\nMais si vous êtes à cheval sur plusieurs technos/ serveurs, c\u0026rsquo;est vite un casse-tête car il va falloir gérer plusieurs protocoles et serializers.\nSymfony Messenger Le composant Messenger va vous permettre de gérer les problèmes de techno et de serveurs grâce à de la configuration YML. Dans votre implémentation vous n\u0026rsquo;aurez pas à vous soucier de comment va partir votre message, ni de comment le sérializer. Le composant est compatible avec les brokers de messages AMQP (la plupart).\nMessage : Un objet PHP serializable Bus : Le composant qui va s\u0026rsquo;occuper de la communication avec le queue manager et d\u0026rsquo;appliquer les middlewares que l\u0026rsquo;on aura pu enregistrer (logs, debug,\u0026hellip;) Handler : La classe qui va recevoir un message à exécuter. C\u0026rsquo;est cette classe qui va tenir la logique métier. Receiver : Déserialize le message reçu via le bus et le transmet au bon handler. Sender : Sérialize le message et le transmet au queue manager via le bus. Nous allons appliquer ce principe pour le cas de l\u0026rsquo;envoi du mail de confirmation de commande. Il faudra répéter le pattern pour chacun des autres types d\u0026rsquo;action à effectuer.\nMise en application Installation du composant Le composant s\u0026rsquo;installe à l\u0026rsquo;aide de composer via la commande :\ncomposer require symfony/messenger Symfony flex va s\u0026rsquo;occuper automatiquement d\u0026rsquo;enregistrer le bundle et créer le fichier de configuration par défaut. Le composant vient avec son intégration à la Symfony toolbar et au profiler. Il est donc possible de voir en détail les messages dispatchés lors d\u0026rsquo;un hit.\nConfiguration du composant Je vais prendre le cas d\u0026rsquo;un rabbitmq. Il va falloir veiller à installer et activer l\u0026rsquo;extension php amqp.\nUne fois que c\u0026rsquo;est fait, nous pouvons éditer le fichier de configuration de messenger pour y ajouter nos transports.\nhttps://gist.github.com/lahaxearnaud/a72d12feae30abd0ddb75bc0d91e6450\nDans votre fichier .env à la racine de votre dépôt, il faudra ajouter les différents Data Source Name.\nhttps://gist.github.com/lahaxearnaud/226f13d34ca050e1cb96ef5162382e77\nCréation de notre message Le message est un simple objet php.\nhttps://gist.github.com/lahaxearnaud/7587d83e00fe9014afe9fd904bf0e09e\nL\u0026rsquo;interface par défaut de mes messages (Optionnel mais pratique à l\u0026rsquo;usage)\nhttps://gist.github.com/lahaxearnaud/0b46968067f01bfb5be472595c7d7f6c\nL\u0026rsquo;interface des objets de type mail\nhttps://gist.github.com/lahaxearnaud/dc08f60e61e7974b5d9a01bb4e7a7795\nDans mon message j\u0026rsquo;envoie les id des différentes entités. Selon vos besoins vous pouvez directement mettre les entités.\nEnvoie du message dans le broker Maintenant que nous avons notre objet de message nous allons pouvoir le pousser.\nhttps://gist.github.com/lahaxearnaud/4d8e9a4a1ecec3ee8f9e692146db1d41\nTraitement du message Pour le moment, votre application ne fonctionnera pas car Symfony Messenger refusera de prendre en compte un message dont il ne connait pas le handler.\nhttps://gist.github.com/lahaxearnaud/f286ec7d994db7ad04149583a33021d7\nIl faut maintenant enregistrer notre handler dans le container avec le tag \u0026lsquo;messenger.message_handler\u0026rsquo;.\nhttps://gist.github.com/lahaxearnaud/15670c94337cc74e53980bd5c4f58a70\nÀ partir de ce moment, Symfony va vous autoriser à dispatcher les messages ConfirmCommandMailer. Pour cet exemple, j\u0026rsquo;ai utilisé Swift Mailer mais libre à vous d\u0026rsquo;utiliser une autre librairie.\nLe composant va utiliser la reflection PHP pour détecter le handler qui doit être utilisé pour un message. Il va regarder le type du paramètre passé à la fonction __invoke.\nLancer le worker Maintenant que l\u0026rsquo;on a tout ce qu\u0026rsquo;il nous faut, il ne reste plus qu\u0026rsquo;à lancer notre consommateur. Il faudra lancer au minimum autant de workers que de channels.\nbin/console messenger:consume-messages amqp_mailer Il y a pas mal d\u0026rsquo;options disponibles pour limiter la durée de vie du daemon, la mémoire allouée, le temps de pause entre chaque message traité\u0026hellip; Pour ma part je lance toujours au moins deux consommateurs pour un type de message et je fais en sorte qu\u0026rsquo;ils se tuent automatiquement tous les n messages traités.\nVoici une démonstration sous forme de GIF de ce que l\u0026rsquo;on vient de faire. Pour simplifier la démonstration, j\u0026rsquo;ai fait une seconde commande Symfony qui pousse notre message dans la queue.\nEn production En production il faut automatiser le lancement du daemon et le relancer en cas de crash. Pour ce faire vous pouvez utiliser supervisor avec la config suivante :\nhttps://gist.github.com/lahaxearnaud/04ad9a18aa62e3fb24f27733eb779981\nGénéralement je fais tourner les workers dans des conteners docker dans un cluster swarm. De cette manière je peux gérer le nombre de consommateurs par type de message à la volée. Voici un exemple de Docker file qui peut faire tourner un worker symfony messenger. Je l\u0026rsquo;ai fait pour un projet perso, il n\u0026rsquo;est donc pas parfaitement optimisé pour de la vraie prod.\nhttps://gist.github.com/lahaxearnaud/8b34a41b146b82542fc831ffd7521e51\nExemple de docker file simple pour un worker Symfony messenger\nEt voici comment l\u0026rsquo;utiliser dans le cadre d\u0026rsquo;un docker compose :\nhttps://gist.github.com/lahaxearnaud/fe1ae0a84e3597cf1a9b81581efb0ce3\nVous pouvez maintenant faire un docker-compose up ou le lancer sur un cluster swarm via la commande docker stack deploy.\nLimitation Pour le moment il n\u0026rsquo;y a pas de solution \u0026ldquo;out of the box\u0026rdquo; pour gérer le re-jeux des messages en cas d\u0026rsquo;erreur. C\u0026rsquo;est à vous de catcher les erreurs et soit de les pousser dans une autre queue, d\u0026rsquo;écrire un log, une métrique, ou de les stocker en base pour les identifier au besoin. C\u0026rsquo;est une lacune assez importante de la librairie qui devrait être corrigée.\nLes problèmes possibles Que veux dire l\u0026rsquo;erreur : Attempted to load class \u0026ldquo;AMQPConnection\u0026rdquo; from the global namespace.\nDid you forget a \u0026ldquo;use\u0026rdquo; statement?\nCe message vous signale que vous n\u0026rsquo;avez pas l\u0026rsquo;extension amqp d\u0026rsquo;activée sur votre machine. Il faut installer et activer l\u0026rsquo;extension php-amqp.\n**Comment résoudre l\u0026rsquo;erreur: [ErrorException] Declaration of SymfonyFlexParallelDownloader::getRemoteContents($originUrl, $fileUrl, $context) should be compatible with ComposerUtilRemoteFilesystem::getRemoteContents($originUrl, $fileUrl, $context, ?array \u0026amp; $responseHeaders = NULL)\n**\nIl faut exécuter composer update \u0026ndash;no-plugins pour mettre Symfony flex à jour.\nComment corriger l\u0026rsquo;erreur : [SymfonyComponentMessengerExceptionNoHandlerForMessageException]\nNo handler for message \u0026ldquo;AppMessageConfirmCommandMailer\u0026rdquo;.\nIl faut veiller à deux points pour trouver la source de cette erreur. Premièrement que vous avez bel et bien créé un handler avec une méthode __invoke qui prend un objet de type AppMessageConfirmCommandMailer en premier et unique paramètre. Et dans un second temps que vous avez bien ajouté votre handler dans votre fichier services.yml avec le tag \u0026ldquo;messenger.message_handler\u0026rdquo;\n","permalink":"https://outweb.eu/2018/11/12/symfony-messenger-et-rabbitmq/","summary":"\u003cp\u003eSymfony 4 apporte un nouveau composant qui va nous permettre de brancher notre application sur un, ou des, brokers de messages. Grâce à ce composant, on va pouvoir accélérer notre application en traitant de façon asynchrone tout ce qui n\u0026rsquo;est pas strictement nécessaire à l\u0026rsquo;affichage de nos pages. Ce module maintenu par la Core Team Symfony va à terme remplacer les bundles existants.\u003c/p\u003e\n\u003ch2 id=\"use-case\"\u003eUse case\u003c/h2\u003e\n\u003cp\u003eUn exemple couramment utilisé pour expliquer pourquoi c\u0026rsquo;est nécessaire d\u0026rsquo;utiliser ce genre de technique est le suivant:\u003c/p\u003e","title":"Symfony Messenger et rabbitmq"},{"content":"Dans cet article, nous allons parler Mojitos, machine learning et PHP, trois sujets que l\u0026rsquo;on mélange assez rarement, mais qui dans le cas du site Cocktailand sont rassemblés.\nUse case Je souhaite afficher la recette de cocktail qui ressemble le plus à celle que le visiteur est en train de lire. Comme je suis finalement quelqu\u0026rsquo;un d\u0026rsquo;assez fainéant, je n\u0026rsquo;ai pas envie de maintenir des listes de cocktails associés manuellement. Il faut donc trouver un moyen de calculer automatiquement cette liste pour les quelques 600 recettes et que cette liste soit mise à jour automatiquement pour intégrer les nouvelles recettes.\nDonnées à disposition:\nLes ingrédients de la recette, avec les volumes pour chacun Est-ce que le cocktail est alcoolisé ou non La catégorie du cocktail Le nombre de vues de la recette de cocktail KNearestNeighbors Afin de résoudre ce problème, je vais utiliser un algorithme de classification nommé KNearestNeighbors mis à disposition en PHP via la libraire php-ml avec une méthode de calcul de distance custom entre les cocktails.\nCet algo, aussi appelé le K-NN, permet de classifier des objets en fonction de la classe des autres objets déjà classifiés à proximité. La proximité est calculée par une méthode du type Euclidienne, Hamming, Manhattan ou encore selon des règles spécifiques au domaine. Il suffit que la méthode soit idempotente et qu\u0026rsquo;elle retourne une valeur numérique pour qu\u0026rsquo;elle soit utilisable.\nLe K de cet algorithme est la valeur de validation croisée qui va permettre de choisir la classe à associer à l\u0026rsquo;objet.\nPour déterminer la classe de l\u0026rsquo;objet vert, on va regarder la classe des objets à proximité, selon la valeur de K.\nPour K=1 on va choisir la classe de l\u0026rsquo;élément le plus proche.\nPour K=n on va choisir la classe la plus représentée dans les éléments sélectionnés.\nMéthodologie Plusieurs étapes sont nécessaires pour utiliser cet algorithme sur un jeu de données :\nNormaliser les données pour construire notre modèle Construire le modèle Ecrire ou Choisir la méthode de calcul de distance Choisir notre K Utiliser le modèle pour faire de la prédiction Normalisation des données Cette étape va nous permettre de supprimer tout ce qui n\u0026rsquo;apporte pas de sens et transformer toutes les données qui composent un cocktail par des entiers. Pour mon modèle j\u0026rsquo;ai choisi de prendre en compte seulement les informations suivantes :\nLes ingrédients, en les représentant par leur id en base Le fait de savoir si le cocktail est alcoolisé ou non (0 ou 1) Afin de limiter le bruit dans le modèle j\u0026rsquo;ai décidé de supprimer des ingrédients non discriminants comme l\u0026rsquo;eau, la glace et le sucre. L\u0026rsquo;idée est de ne pas laisser l\u0026rsquo;algorithme penser que deux cocktails sont similaires car on y met des glaçons. Une fois que j\u0026rsquo;ai ma liste d\u0026rsquo;ingrédients nettoyée, il faut normaliser les données afin de les transformer en tableau d\u0026rsquo;entier. C\u0026rsquo;est un prérequis de l\u0026rsquo;implémentation de php-ml.\nPour le moment, je vais mettre de côté la popularité du cocktail, mais je pourrais la segmenter en 3 groupes peu/ moyen/ très populaire. Pour ce classement, il faudrait simplement ramener le nombre de vues en un nombre de 1 à 3 (via les percentiles 25% et 75% par exemple) et de valoriser cette information au moment du calcul de distance.\nConstruire le modèle Pour cette étape, je vais créer une matrice qui aura en nombre de lignes le nombre de cocktails du site et en nombre de colonnes le nombre maximum d\u0026rsquo;ingrédients plus un d\u0026rsquo;un cocktail sur le site. Cette étape peut être particulièrement coûteuse en mémoire.\nUne ligne de la matrice contient donc en premier index 0 ou 1 selon si le cocktail contient de l\u0026rsquo;alcool et dans les colonnes suivantes les ids des ingrédients qui composent le cocktail. Les cellules vides de la matrice sont remplies par des 0 car il est nécessaire d\u0026rsquo;avoir des lignes de la même taille.\nSur l\u0026rsquo;implémentation proposée, il y a un second tableau qui doit contenir les labels (classes) associées aux différentes lignes. J\u0026rsquo;ai choisi d\u0026rsquo;y mettre l\u0026rsquo;id (casté en string) du cocktail.\nComme cette étape est un peu coûteuse, je serialize la matrice dans un fichier pour pouvoir m\u0026rsquo;en resservir au besoin.\nUne fois la matrice générée nous pouvons entrainer notre modèle (avec la méthode \u0026ldquo;train\u0026rdquo; ou \u0026ldquo;fit\u0026rdquo; selon vos librairies) sur notre jeu de données.\nChoisir notre K Dans notre cas, chaque élément est porteur de sa propre classe. C\u0026rsquo;est un cas un peu particulier, mais qui ne pose pas spécialement de problème pour cet algo. Mais au vu du fonctionnement de la valeur de validation croisée, il faut que nous utilisions un K à 1. Une valeur supérieure n\u0026rsquo;aurait pas de sens, car nous aurions autant d\u0026rsquo;ex aequo que la valeur de K.\nEcrire la méthode de calcul de distance Comme notre modèle est assez spécifique et que faire une ACP sur notre matrice n\u0026rsquo;aurait pas de sens, j\u0026rsquo;ai pris le parti d\u0026rsquo;écrire ma propre méthode de calcul de distance.\nLa méthode de calcul de distance prend en paramètre deux lignes de la matrice et doit retourner un float (la distance). Libre à nous de réfléchir à la meilleure façon de faire ce calcul ou d\u0026rsquo;utiliser une méthode disponible de base.\nVoici mon implémentation :\nhttps://gist.github.com/lahaxearnaud/46b42fb4c685226a9d5bf4b149ce7f9c\nOn remarque que j\u0026rsquo;utilise des nombres magiques dans mon algorithme (2, 3, 5, 10) . Les valeurs me permettent de donner plus ou moins d\u0026rsquo;importance à un type de différence. Une grande discrimination est donnée pour une différence au niveau de la présence ou non d\u0026rsquo;alcool.\nExemple sur un jeu de données [table id=2 /]\nVoici la matrice qui est générée pour ce jeu de données avec sur la droite le nom des cocktails associés à chaque ligne:\nDans les colonnes du premier tableau, nous avons dans la première colonne la présence ou non d\u0026rsquo;alcool et dans les autres les ids des ingrédients qui composent la recette.\nNous allons maintenant utiliser notre modèle pour trouver le cocktail le plus proche du Mojito.\nhttps://gist.github.com/lahaxearnaud/e4742c678474bf1d6a49d4f4d4f007c4\nLa sortie en console est la suivante:\nC\u0026rsquo;est bien le résultat que l\u0026rsquo;on aurait imaginé, mais pour comprendre pourquoi ce résultat, il faut s\u0026rsquo;intéresser aux distances que l\u0026rsquo;algo a calculé pour chaque cocktail. Voici ce que l\u0026rsquo;on obtient :\nOn remarque que la discrimination sur l\u0026rsquo;absence d\u0026rsquo;alcool est forte. C\u0026rsquo;est une volonté de ma part pour éviter, si possible, de proposer des recettes avec alcool pour un cocktail sans alcool.\nSur le site le volume de données à traiter est beaucoup plus gros évidement mais le principe reste le même.\nVoici le résultat en production sur la recette du mojito:\nPour arriver à ce résultat sur un grand jeu de données, je répète l\u0026rsquo;algorithme n fois en retirant du modèle les recettes déjà sélectionnées.\nAutomatisation La génération de la matrice est assez coûteuse, il faut quasiment dumper toute la base de données et travailler dessus. Il n\u0026rsquo;est donc pas possible de le faire \u0026ldquo;à la demande\u0026rdquo;. J\u0026rsquo;ai pris le parti de faire une commande Symfony qui est exécutée plusieurs fois par jour pour mettre à jour les données normalisées dans un fichier plat. Et pour la partie entraînement et prédiction, le résultat est mis en cache HTTP à l\u0026rsquo;aide d\u0026rsquo;un ESI pour 24h. Cela signifie qu\u0026rsquo;un nouveau cocktail ne remontera dans les suggestions que maximum 24h après son ajout à moins de flusher le cache varnish manuellement. Dans le cadre de Cocktailand cette latence est tout à fait acceptable.\n","permalink":"https://outweb.eu/2018/11/08/du-machine-learning-dans-mes-cocktails/","summary":"\u003cp\u003eDans cet article, nous allons parler Mojitos, machine learning et PHP, trois sujets que l\u0026rsquo;on mélange assez rarement, mais qui dans le cas du site \u003ca href=\"https://cocktailand.fr\"\u003eCocktailand\u003c/a\u003e sont rassemblés.\u003c/p\u003e\n\u003ch2 id=\"use-case\"\u003eUse case\u003c/h2\u003e\n\u003cp\u003eJe souhaite afficher la recette de cocktail qui ressemble le plus à celle que le visiteur est en train de lire. Comme je suis finalement quelqu\u0026rsquo;un d\u0026rsquo;assez fainéant, je n\u0026rsquo;ai pas envie de maintenir des listes de cocktails associés manuellement. Il faut donc trouver un moyen de calculer automatiquement cette liste pour les quelques 600 recettes et que cette liste soit mise à jour automatiquement pour intégrer les nouvelles recettes.\u003c/p\u003e","title":"Du machine learning dans mes cocktails"},{"content":"La page d\u0026rsquo;accueil de cocktailand affiche en moyenne 35 images. Dans sa première version, je n\u0026rsquo;avais pas pris la peine de soigner la gestion des images. J\u0026rsquo;avais pour objectif de sortir le produit minimum viable, je me suis donc attardé sur les fonctionnalités principales:\nL\u0026rsquo;ajout des recettes de cocktail L\u0026rsquo;affichage des recettes de cocktails La catégorisation Le moteur de recherche Cette méthodologie permet de sortir rapidement un site de base et de l\u0026rsquo;enrichir de façon successive.\nLe fait d\u0026rsquo;avoir mis en place varnish et les esis faisait que la page s\u0026rsquo;affichait très rapidement mais les images mettaient du temps à s\u0026rsquo;afficher.\nDans cet article je vais faire le point sur les différentes techniques à mettre en place pour réduire au maximum le temps de chargement des images sur votre site WEB.\nOptimiser les images La première chose à faire est de redimensionner votre image à une taille raisonnable.\nIl est rare d\u0026rsquo;avoir besoin d\u0026rsquo;une image avec une résolution plus grande que 1024x768 pixels.\nLa seconde étape est d\u0026rsquo;optimiser vos images à l\u0026rsquo;aide d\u0026rsquo;outils comme imageoptim, compressor.io ou tout autre outil du genre.\nVous pouvez régler l\u0026rsquo;outil pour avoir ou non de la perte de qualité au profit d\u0026rsquo;un gain de taille.\nIl n\u0026rsquo;est pas rare de gagner 70% de taille sur une image.\nSur 35 images de 1Mo, on gagnerait 25Mo.\nCache http Maintenant que nous avons optimisé la taille de nos images au maximum et que le visiteur les a téléchargées, nous allons dire à son navigateur de les conserver pour la prochaine fois.\nCôté varnish j\u0026rsquo;ai pour habitude d\u0026rsquo;avoir cette règle qui surcharge le retour de nginx pour ajouter une durée de cache de 24h.\nhttps://gist.github.com/lahaxearnaud/55a200fb22a4b3f54f4533fdf7ee07d1\nCette règle est géniale si chaque fichier est immuable et a une url unique. Cela implique que lors de votre build vous ajoutiez un hash unique dans le nom de vos JS et CSS. Si vous avez des fichiers qui changent au cours de la journée, cette solution n\u0026rsquo;est pas faite pour vous.\nHttp 2 Http 2 permet d\u0026rsquo;optimiser très largement le temps de téléchargement des assets, car il conserve la même connexion au serveur. HTTP 1 pour sa part initialise une connexion par fichier à télécharger. Cette démonstration http2 vs http1 va vous permettre de vous rendre compte du gain par rapport à http 1.\nLe site va télécharger une mosaïque qui est composée de 100 petites images en http 1 puis en http 2. Le gain est environ de 60% de temps de chargement sur mon macbook pro avec une connexion fibre.\nSi vous ne savez pas comment faire, ou que vous n\u0026rsquo;êtes pas techniquement sûr de comment gérer http2 sur votre serveur, vous pouvez utiliser cloudflare. Par défaut, cloudflare va gérer les connexions http 2 tout en continuant de faire des appels http 1 sur votre serveur. Il va s\u0026rsquo;occuper de multiplexer les requêtes et tout se passera de manière transparente pour vous. Ce n\u0026rsquo;est pas parfait, mais c\u0026rsquo;est mieux que rien\u0026hellip;\nPré-calculer les différentes tailles Pour la partie serveur, nous avons maintenant une stack idéale pour afficher rapidement nos images.\nIl ne reste que quelques détails à régler. Dans la première partie je vous ai dit de redimensionner vos images au format maximum que vous pourrez un jour utiliser.\nMais pour avoir de bonnes performances, il va falloir aller plus loin.\nC\u0026rsquo;est le moment de pré-calculer l\u0026rsquo;ensemble des tailles d\u0026rsquo;images que vous allez utiliser. L\u0026rsquo;idée est de ne faire télécharger que le strict nécessaire à l\u0026rsquo;utilisateur. Si nous avons besoin d\u0026rsquo;une image de 64x64 pixels il est préférable d\u0026rsquo;envoyer une image qui fait déjà la bonne taille plutôt que de télécharger une grosse image et de laisser le navigateur la redimensionner. Vous allez gagner en bande passante mais aussi en CPU.\nPar exemple, sur cocktailand, une image peut actuellement être utilisée avec les tailles suivantes:\n64x64 240x180 270x200 400x400 Pour un peu plus de 1000 images sur le site, le travail n\u0026rsquo;est pas faisable à la main. D\u0026rsquo;autant plus que je ne m\u0026rsquo;interdis pas d\u0026rsquo;ajouter de nouvelles tailles si je modifie le design ou les supports.\nSur Symfony, il existe un bundle liip/imagine-bundle qui permet cette automatisation. Le bundle va générer à la volée les miniatures lors de la première demande puis les stocker sur le serveur pour les prochaines demandes.\nUne fois le bundle installé dans votre projet, vous n\u0026rsquo;avez qu\u0026rsquo;à enregistrer vos formats dans la configuration et à utiliser le filtre twig.\nhttps://gist.github.com/lahaxearnaud/0785119988ba906e70e1112681581678\nOn pourra remarquer que plus l\u0026rsquo;image est petite, plus j\u0026rsquo;ai fait baisser la qualité.\nRésultat pour une image déclinée dans plusieurs des tailles:\nRespectivement les tailles sont de 2Ko, 12Ko et 39Ko. Il y a donc un facteur 20 entre la miniature et le plus grand format utilisé sur le site.\nLazy loading/ image set Le dernier point permet un énorme gain de performance, mais il peut aussi impacter votre SEO si vous le faites mal. L\u0026rsquo;idée est de ne faire télécharger au visiteur que les images qui seront immédiatement visible à l\u0026rsquo;écran. Si l\u0026rsquo;image n\u0026rsquo;est pas visible à l\u0026rsquo;écran, elle ne sera pas téléchargée au chargement, mais au scroll quand elle entrera dans le viewport. Le problème réside dans le fait de mettre en place cette technique et en laissant Google (ou autre) voir les images. Le paquet npm vanilla-lazyload est vraiment sympa car il répond aux deux points précédents et en plus il permet de mettre en place des \u0026ldquo;images responsives\u0026rdquo; via les srcset.\nUne fois le paquet installé vous n\u0026rsquo;avez quasiment rien à faire pour initialiser la librairie.\nhttps://gist.github.com/lahaxearnaud/f2bd38ff2347483ad48d57a161745b66\nUne fois la librairie mise en place et instanciée côté javascript, il ne reste plus qu\u0026rsquo;à utiliser les data attributes des images pour l\u0026rsquo;utiliser. Voici un exemple d\u0026rsquo;utilisation avec imagine.\nhttps://gist.github.com/lahaxearnaud/f25f4a83c77d2b78a814f4f415469852\nConclusion Une fois l\u0026rsquo;ensemble des techniques mises en place, le chargement de la home ne télécharge \u0026ldquo;que\u0026rdquo; 1.2 Mo d\u0026rsquo;images, publicités incluses. Voici des données issues de webPageTest concernant la home.\nLe premier chargement de la page pour un visiteur:\nLe second chargement de la page pour un visiteur:\nOn remarque que le nombre d\u0026rsquo;assets téléchargés lors du second chargement est plus faible. Si on regarde en détails la liste des fichiers téléchargés, on constate, avec chagrin, que plus rien ne provient de cocktailand. Il ne reste en effet que le tracking et la publicité.\n","permalink":"https://outweb.eu/2018/06/05/cocktailand-gerer-ses-images-sous-symfony/","summary":"\u003cp\u003eLa page d\u0026rsquo;accueil de \u003ca href=\"https://cocktailand.fr/\"\u003ecocktailand\u003c/a\u003e affiche en moyenne 35 images. Dans sa première version, je n\u0026rsquo;avais pas pris la peine de soigner la gestion des images. J\u0026rsquo;avais pour objectif de sortir le \u003ca href=\"https://fr.wikipedia.org/wiki/Produit_minimum_viable\"\u003eproduit minimum viable\u003c/a\u003e, je me suis donc attardé sur les fonctionnalités principales:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;ajout des recettes de cocktail\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;affichage des recettes de cocktails\u003c/li\u003e\n\u003cli\u003eLa catégorisation\u003c/li\u003e\n\u003cli\u003eLe moteur de recherche\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCette méthodologie permet de sortir rapidement un site de base et de l\u0026rsquo;enrichir de façon successive.\u003c/p\u003e","title":"Cocktailand - Gérer ses images sous symfony"},{"content":"C\u0026rsquo;est quoi un ESI ? Les ESI ou Edge Side Includes sont un balisage supporté par Varnish qui permet de gérer des temps de cache différents pour des blocs de la même page.\nDans le cadre de Cocktailand, certains blocs sont actualisés régulièrement comme le \u0026ldquo;Cocktail du jour\u0026rdquo; mais d\u0026rsquo;autres ne changent quasiment jamais comme la liste des catégories.\nVoici donc le découpage que j\u0026rsquo;ai fait sur la page principale. Pour la barre de menu, c\u0026rsquo;est bien évidemment le contenu du méga menu que j\u0026rsquo;ai voulu mettre en évidence.\nIl est donc intéressant de ne pas avoir à invalider toute la page lorsque le cocktail du jour est changé. Le second avantage en termes de performance est que les blocs peuvent être utilisés sur différentes pages. Cela signifie qu\u0026rsquo;un ESI présent sur toutes les pages du site ne sera généré qu\u0026rsquo;une seule fois. Lors des autres appels, Varnish utilisera son cache.\nConfiguration de varnish Pour Cocktailand, la configuration de varnish est assez simple car je ne fais pas de purge et parce qu\u0026rsquo;il n\u0026rsquo;y a pas d\u0026rsquo;espace connecté sur le site.\nVoici la configuration que j\u0026rsquo;ai:\nhttps://gist.github.com/lahaxearnaud/1da0854f312f21a156af18da3b8577a2\nLa mise en place dans Symfony 4 ESI Le support des ESI dans Symfony est intégré nativement dans le framework.\nDans le fichier config/packages/framework.yaml il faut activer les ESIs.\nhttps://gist.github.com/lahaxearnaud/57b1e8a4d69dec213cd5a367a935f076\nToutes vos routes qui servent des ESI devront commencer par _fragment.\nDans vos vues twig, vous avez des helpers à disposition pour poser vos tags.\nhttps://gist.github.com/lahaxearnaud/5495c7a0274755629b9360e9bb190ea4\nCache http En utilisant le package sensio/framework-extra-bundle on peut gérer le cache sur les controller avec des annotations.\nhttps://gist.github.com/lahaxearnaud/1db75dda7bc75800415c5766c9b5cc1b\nTemps de réponse Une fois les ESIs et le cache HTTP mis en place, on peut analyser les performances avec Webpagetest.\nL\u0026rsquo;outil va nous donner des informations sur le temps de réponse de l\u0026rsquo;application et surtout des indications sur ce qu\u0026rsquo;il faudrait améliorer.\nPar exemple, sur ce test, il me dit que je peux potentiellement améliorer la gestion des fonts et des images.\n// @todo activer gzip sur les fonts Ce que l\u0026rsquo;on peut remarquer, c\u0026rsquo;est que le site commence à envoyer le HTML après 231ms. Dans ce temps il y a en moyenne 40ms de DNS Lookup, 30ms de connexion et 80ms de négociation SSL. Malheureusement sur cette partie je n\u0026rsquo;ai pas la main, c\u0026rsquo;est donc l\u0026rsquo;overhead de base pour toute page du site. Mais comme j\u0026rsquo;utilise HTTP2 je vais mutualiser toute cette partie pour les images assets servies sur le même domaine.\nLes nouvelles problématiques Tout mettre en cache, c\u0026rsquo;est bien pour les performances, mais malheureusement certaines informations ont besoin de \u0026ldquo;temps réel\u0026rdquo;.\nQuand un visiteur ajoute une note sur une recette, il est nécessaire que cette note mise à jour si le visiteur rafraîchit la page.\nIl y a plusieurs solutions:\nFaire des bans de cache lors de l\u0026rsquo;ajout d\u0026rsquo;une note Afficher les données du cache et rafraîchir les données en AJAX Bien évidemment, la première solution est celle qui devrait être implémentée. Maintenant, c\u0026rsquo;est pas mal de code et de configuration sur varnish. C\u0026rsquo;est d\u0026rsquo;autant plus compliqué que, dans sa version gratuite, Varnish ne permet pas de faire un ban sur plusieurs instances.\nFaire les bans impliquerait de maintenir une liste des varnishs qui tournent (si jamais je fais scaller cette brique) et de faire n appels curl pour faire un ban partout.\nPour le moment, j\u0026rsquo;ai fait le choix de la requête AJAX non cachée. Si jamais le site gagne en popularité, il faudra retravailler sur ce point.\nConclusion Sur un blog ou un site dans lequel le visiteur ne peut quasiment pas interagir avec vos données, c\u0026rsquo;est très simple de mettre en place du cache varnish et le gain de performance est énorme. Maintenant, si vous avez des besoins plus complexes (site transactionnel, forum,\u0026hellip;) vous allez devoir mettre en place une mécanique d\u0026rsquo;invalidation de cache.\n","permalink":"https://outweb.eu/2018/06/01/cocktailand-ajoute-du-cache-http-dans-mon-symfony/","summary":"\u003ch2 id=\"cest-quoi-un-esi-\"\u003eC\u0026rsquo;est quoi un ESI ?\u003c/h2\u003e\n\u003cp\u003eLes ESI ou Edge Side Includes sont un balisage supporté par Varnish qui permet de gérer des temps de cache différents pour des blocs de la même page.\u003c/p\u003e\n\u003cp\u003eDans le cadre de \u003ca href=\"https://cocktailand.fr/\"\u003eCocktailand\u003c/a\u003e, certains blocs sont actualisés régulièrement comme le \u0026ldquo;Cocktail du jour\u0026rdquo; mais d\u0026rsquo;autres ne changent quasiment jamais comme la liste des catégories.\u003c/p\u003e\n\u003cp\u003eVoici donc le découpage que j\u0026rsquo;ai fait sur la page principale. Pour la barre de menu, c\u0026rsquo;est bien évidemment le contenu du méga menu que j\u0026rsquo;ai voulu mettre en évidence.\u003c/p\u003e","title":"Cocktailand - Ajouter du cache HTTP dans mon symfony"},{"content":"A la vue de cet article, on me dira surement que la stack technique du site Cocktailand est overkill.\nMa réponse est simple: \u0026quot; Ouaip carrément !\u0026quot;\nAu-delà du plaisir de travailler sur la thématique des cocktails, je travaille sur ce projet aussi pour me faire plaisir techniquement et pour tester des technologies ou des services en mode SAS.\nComme j\u0026rsquo;ai toujours la flemme de documenter mes sides projects, cet article fera office de documentation \u0026ldquo;technique\u0026rdquo;.\nJe vais donc découper cet article en trois parties:\nL\u0026rsquo;hébergement L\u0026rsquo;application Les services SAS utilisés L\u0026rsquo;hébergement Scaleway Depuis la beta de scaleway, filiale de Online, je prends tous mes serveurs persos chez eux. Ils sont à la fois fiables, efficaces et abordables. Il n\u0026rsquo;y a pas de frais d\u0026rsquo;installation et on peut libérer un serveur à tout moment. Pour Cocktailand, j\u0026rsquo;ai pris deux serveurs pour démarrer, un pour la prod et un pour les backups qui n\u0026rsquo;a pas d\u0026rsquo;accès à Internet (ni entrant ni sortant). Pour toute la partie métrique graphite/ grafana, j\u0026rsquo;ai pluggué le site sur mon infra existante.\nLe serveur qui héberge le site est un START1-S. Ce n\u0026rsquo;est pas une bête de course, mais au besoin je passerai à la gamme au-dessus.\nCloudflare Cloudflare est un gestionnaire de DNS en ligne qui a pour particularité d\u0026rsquo;avoir un temps de propagation proche de 0. Dans son offre de base, qui est gratuite, il permet de gérer plusieurs noms de domaine, il autorise les wildcards dans les sous-domaines, mais il propose aussi tout un tas d\u0026rsquo;autres fonctionnalités intéressantes. En effet, dans l\u0026rsquo;offre gratuite, il propose:\nUne protection DDOS Une optimisation des assets à la volée Une redirection http vers https automatique Une modification des urls des assets des pages de http vers https (un garde-fou sympa si on est full https) Une redirection automatique vers un site mobile (s\u0026rsquo;il est différent) La possibilité de bannir des ips (manuellement ou via une API) \u0026hellip; Pour ma part, je l\u0026rsquo;utilise depuis longtemps et je n\u0026rsquo;ai jamais eu à me plaindre du moindre dysfonctionnement.\nDocker compose La stack du site est entièrement gérée avec docker.\nChaque brique de la partie docker (varnish, nginx, phpfpm ) peut scaller horizontalement.\nPour le moment, le serveur MySQL ainsi que les images ne sont pas scallables. Je travaillerai sur les deux points si jamais le besoin s\u0026rsquo;en fait sentir. Normalement, avec l\u0026rsquo;utilisation intensive de varnish qui est faite, la base de données n\u0026rsquo;est pas énormément sollicitée.\nL\u0026rsquo;application Le site est développé avec le framework Symfony. J\u0026rsquo;ai choisi SF pour sa stabilité, sa fiabilité, mais aussi car j\u0026rsquo;ai l\u0026rsquo;habitude de travailler avec au quotidien. Je sais que, bien utilisé, il est capable de tenir la charge.\nLe site fait un usage assez intensif des ESI afin de permettre une gestion du cache http assez fine. Quasiment chaque bloc de la home est un ESI. Il est par exemple possible d\u0026rsquo;avoir un temps de cache de quelques heures pour le cocktail du jour et un cache d\u0026rsquo;une journée sur le top des cocktails les plus consultés.\nImages La problématique n\u0026rsquo;est pas de trouver des recettes de cocktails, mais de trouver des images libres de droits. Je n\u0026rsquo;ai malheureusement pas eu le temps de confectionner par moi-même l\u0026rsquo;ensemble des cocktails présents sur le site.\nVoici donc une liste non exhaustive des sites sur lesquels je vais chercher des images quand je n\u0026rsquo;en ai pas:\nPixabay Flickr Pexels Freeimages Les services SAS utilisés Comme je l\u0026rsquo;ai dit plus tôt, Cocktailand a aussi pour but de tester des technologies ou des services en SAS.\nAlgolia Surnommé le \u0026ldquo;Google des apps\u0026rdquo;, Algolia est un service externe de moteur de recherche. Il remplace le bon vieux cluster ElasticSearch que j\u0026rsquo;aurais pu mettre sur mon serveur.\nEn plus d\u0026rsquo;être extrêmement performant, algolia a un service client au top.\nL\u0026rsquo;offre gratuite me permet largement de faire tourner mon moteur de recherche sans restriction et avec des temps de réponse aux alentours de 50ms. La seule contrepartie demandée par algolia est de préciser que la recherche est fournie par eux en dessous des résultats.\nTrès franchement, je suis agréablement surpris par cette techno.\nLogz.io Logz est un agrégateur de logs en mode SAS. Comme je n\u0026rsquo;ai rien de critique dans les logs, je me suis permis de les externaliser. On retrouve une bonne vieille stack ELK.\nPour envoyer les logs, il m\u0026rsquo;a suffi d\u0026rsquo;ajouter leur container docker rsyslog dans ma stack docker-compose. Une fois les bonnes variables d\u0026rsquo;environnements mises en place les logs remontent chez eux en quasi temps réel.\nAu-delà de la simple consultation et recherche dans les logs, ils proposent un outil d\u0026rsquo;alerting. Il est par exemple possible d\u0026rsquo;envoyer un mail quand un grand nombre d\u0026rsquo;exceptions ou de fatales sont remontées.\nCoût de la plateforme Comme le site est encore récent et qu\u0026rsquo;il ne génère aucun revenu, j\u0026rsquo;ai fait le maximum pour réduire les coûts.\nVoici un état des lieux des dépenses engendrées par Cocktailand.\n[table id=1 /]\n","permalink":"https://outweb.eu/2018/05/25/cocktailand-la-stack-technique/","summary":"\u003cp\u003eA la vue de cet article, on me dira surement que la stack technique du site \u003ca href=\"https://cocktailand.fr/\"\u003eCocktailand\u003c/a\u003e est overkill.\u003c/p\u003e\n\u003cp\u003eMa réponse est simple: \u0026quot; \u003cstrong\u003eOuaip carrément !\u003c/strong\u003e\u0026quot;\u003c/p\u003e\n\u003cp\u003eAu-delà du plaisir de travailler sur la thématique des cocktails, je travaille sur ce projet aussi pour me faire plaisir techniquement et pour tester des technologies ou des services en mode SAS.\u003c/p\u003e\n\u003cp\u003eComme j\u0026rsquo;ai toujours la flemme de documenter mes sides projects, cet article fera office de documentation \u0026ldquo;technique\u0026rdquo;.\u003c/p\u003e","title":"Cocktailand - La stack technique"},{"content":"Les outils Monitorer les performances WEB d\u0026rsquo;un site web est vraiment indispensable, mais ce n\u0026rsquo;est pas simple de le faire gratuitement. Il existe des outils en ligne comme SpeedCurve mais c\u0026rsquo;est relativement cher.\nL\u0026rsquo;idée ici est d\u0026rsquo;avoir un suivi, certes plus simple, mais de façon gratuite. Il se trouve que j\u0026rsquo;ai déjà une stack graphite/grafana qui tourne en production. Si ce n\u0026rsquo;est pas votre cas et que vous avez un serveur avec docker qui tourne dessus vous pouvez toujours démarrer un container avec l\u0026rsquo;image docker-grafana-graphite pour tester la suite de cet article. Une fois que votre graphite est en ligne on va pouvoir commencer à pousser des metrics dedans. Un outil est très connu pour obtenir des metrics de performance sur un site web. Webpagetest, dont j\u0026rsquo;ai déjà parlé dans un billet précédent sur la mise en place de varnish et des ESIs. Il se trouve que webpagetest fournie une api.\nPour obtenir une clef d\u0026rsquo;api il faut en faire la demande sur le site de WebPageTest.\nVous recevrez votre clef par email automatiquement sous quelques minutes.\nLa mise en place Il ne reste plus qu\u0026rsquo;a faire le lien entre les retours de l\u0026rsquo;API de webpagetest et notre graphite. J\u0026rsquo;ai choisi de faire un petit script en node js, mais vous pouvez le faire avec ce que vous voulez.\nInstaller les dépendances https://gist.github.com/lahaxearnaud/7b8d6db87324d18bf0cd82b805fe38d4\nLe script Très claireiment c\u0026rsquo;est pas un script optimisé ni prévu pour monitorer plusieurs pages d\u0026rsquo;un site. Maintenant si vous avez besoin d\u0026rsquo;étendre son scope ce ne sera pas trop difficile.\nIl y a quelques placeholder dans le script à remplacer par vos valeurs:\nNOM_DU_SITE_OU_DE_LA_PAGE: Le nom de votre site en snake case (ex: cocktailand_fr) VOTRE_URL: L\u0026rsquo;url de la page à monitorer (ex https://cocktailand.fr) VOTRE_HOST_GRAPHITE: L\u0026rsquo;ip ou le hostname de votre graphite VOTRE_API_KEY: La clef d\u0026rsquo;api que WebPageTest vous a donnée https://gist.github.com/lahaxearnaud/92cd407f5b1be865ba529f80b0a1bb9a\nCronner le script Je fait tourner le script toutes les heures.\nhttps://gist.github.com/lahaxearnaud/16809f0c7b920fc4f5b8f3958f1301a3\nDe cette manière je peux analyser le comportement du site sur une journée complète et éliminer les fausses alertes.\nIl est en effet possible d\u0026rsquo;avoir des résultats qui varient en fonctions de plusieurs facteurs extérieur:\nLa saturation du réseau de webPageTest Un agent de webpagetest qui est plus lent qu\u0026rsquo;un autre Des publicités mal optimisées de la part d\u0026rsquo;un partenaire Il ne faut pas s\u0026rsquo;inquiéter si un résultat est moins bon qu\u0026rsquo;un autre.\nLe but ici est d\u0026rsquo;analyser une tendance.\nFaire un beau dashboard Maintenant que vous avez toutes vos informations dans votre graphite on peut commencer à grapher ce qui nous intéresse.\nVoici par exemple mon dashboard:\nPour ma part je surveille principalement les temps de réponse et le cache avec mon dashboard, mais en fonction des objectifs que l\u0026rsquo;on se donne on peut axer les graphiques sur d\u0026rsquo;autres KPIs.\nConclusion J\u0026rsquo;ai un suivi des performances. Si grafana est à jour (ce qui n\u0026rsquo;est pas mon cas) il est même possible d\u0026rsquo;envoyer des mails d\u0026rsquo;alertes quand on dépasse une limite fixée.\nAprès plusieurs semaines d\u0026rsquo;exploitation je me rends compte que le site en lui-même est stable et avec des performances prévisibles, mais que les grandes inconnues sont les publicités. Une mauvaise pub sur le site peut anéantir tout le travail fait en amont sur les performances.\n","permalink":"https://outweb.eu/2018/05/06/cocktailand-monitorer-les-performances-dun-site-web/","summary":"\u003ch2 id=\"les-outils\"\u003eLes outils\u003c/h2\u003e\n\u003cp\u003eMonitorer les performances WEB d\u0026rsquo;un site web est vraiment indispensable, mais ce n\u0026rsquo;est pas simple de le faire gratuitement. Il existe des outils en ligne comme \u003ca href=\"https://speedcurve.com/\"\u003eSpeedCurve\u003c/a\u003e mais c\u0026rsquo;est relativement cher.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;idée ici est d\u0026rsquo;avoir un suivi, certes plus simple, mais de façon gratuite. Il se trouve que j\u0026rsquo;ai déjà une stack graphite/grafana qui tourne en production. Si ce n\u0026rsquo;est pas votre cas et que vous avez un serveur avec docker qui tourne dessus vous pouvez toujours démarrer un container avec l\u0026rsquo;image \u003ca href=\"https://github.com/kamon-io/docker-grafana-graphite\"\u003edocker-grafana-graphite\u003c/a\u003e pour tester la suite de cet article. Une fois que votre graphite est en ligne on va pouvoir commencer à pousser des metrics dedans. Un outil est très connu pour obtenir des metrics de performance sur un site web. Webpagetest, dont j\u0026rsquo;ai déjà parlé dans un billet précédent sur la mise en place de \u003ca href=\"/cocktailand-ajoute-du-cache-http-dans-mon-symfony/\"\u003evarnish et des ESIs\u003c/a\u003e. Il se trouve que webpagetest fournie une api.\u003c/p\u003e","title":"Cocktailand - Monitorer les performances d'un site web"},{"content":"Augmenter les performance pour diminuer le temps de réponse de son site devrait être la préoccupation de tout webmaster, afin d\u0026rsquo;améliorer au maximum l\u0026rsquo;expérience utilisateur mais aussi pour être mieux référencé sur Google. Nous allons voir dans cet article comment optimiser Wordpress pour obtenir un temps de réponse minimal.\nIl existe une kyrielle de plugins Wordpress qui permettent de réduire le temps de réponse de Wordpress. Un des plus connus est w3 Total Cache car il possède énormément de fonctionnalités.\nMais après l\u0026rsquo;avoir installé, je me suis rendu compte que Wordpress consommait quasi 100% de tous les coeurs de mon serveur pour afficher une page. C\u0026rsquo;est un problème qui est assez fréquent avec ce plugin. C\u0026rsquo;est pourquoi j\u0026rsquo;ai cherché des solutions alternatives.\nCoté Wordpress WP Super Cache WP Super Cache est développé par Donncha O Caoimh, auteur de la branche Wp MU.\nLe plugin va générer des pages HTML statiques à partir des pages du sites. Les pages sont mises à jour régulièrement (réglable). Ce procédé permet de servir des pages sans avoir à la générer.\nLa seconde fonctionnalité intéressante du plugin est le pré-chargement des pages pour forcer la mise en cache. Il est possible par exemple de pré-générer ou mettre à jour les caches toutes les 30 minutes. Cette fonctionnalité est très intéressante car même le premier visiteur profitera du cache, contrairement à la plupart des plugins de cache ou c\u0026rsquo;est le premier visiteur qui va le générer.\nWP Minify Wp Minify est un plugin qui permet la compression et la concaténation des fichiers JS et CSS. Selon la qualité de vos fichiers (en terme de code) il n\u0026rsquo;est peut être pas possible de les compresser. Dans ce cas la il faut aller dans option avancé et désactiver la minification.\nLa concaténation des /assets, même non minifiés, permet de diminuer le nombre de requêtes et donc le temps de réponse.\nWP Optimize Wp Optimize est un plugin qui permet de nettoyer et optimiser la base de données de wordpress. Il va aussi défragmenter les tables. Il suffit de le lancer de temps en temps.\njQuery lazy load plugin jQuery lazy load plugin est un plugin qui pemet de charger les images des pages à la demande. le plugin est basé sur le plugin JQuery Lazy Load.\nCeci permet de diminuer grandement le temps de chargement initial d\u0026rsquo;une page. Et c\u0026rsquo;est quand l\u0026rsquo;utilisateur affichera l\u0026rsquo;image qu\u0026rsquo;elle sera chargée.\nSur une page d\u0026rsquo;accueil où il y a une dizaine d\u0026rsquo;articles (ou plus) cela peut faire gagner énormément de connexion HTTP.\nConseils de bon sens Eviter d\u0026rsquo;installer trop de plugins Limiter les JS et CSS externe (hors CDN) Utiliser des images compressées et découpées à la bonne taille Côté Serveur Si on veux que le site soit aussi performant que possible, il va falloir, si possible, aller configurer un peu le serveur. Pour cette partie vous allez avoir besoin des accès root sur le serveur.\nXCache XCache est un accélérateur de code PHP. Il va mettre en cache le code PHP compilé afin de ne pas avoir à le re-compiler une prochaine fois. Contrairement à PHP APC, XCache est stable et entièrement compatible avec PHP 5.4+.\nVoici un tutoriel qui date un peu, mais qui est toujours d\u0026rsquo;actualité, qui explique comment faire l\u0026rsquo;installation de XCache sur un serveur debian : Installer XCache sur Debian.\nConfigurer Apache Apache est très configurable, le tutoriel optimiser la configuration d’Apache est assez complet à ce sujet.\nMySQL Pour une installation basique de wordpress le SGBD est MySQL.\nIl existe des scripts comme MySQLTuner qui peuvent aider à configurer correctement le serveur MySQL.\nInstaller un Firewall Un firewall, par exemple Shorewall permet de faire le tri dans les demandes et de ne pas envoyer à Apache les requêtes de type DDOS. Contrairement au mod_evasive la requête va être ignorée au niveau de la carte réseau. On va donc limiter au maximum son impact sur le serveur en termes de ressources utilisées.\nRésultat Voici le résultat de Yslow sur la page d\u0026rsquo;accueil du blog une fois toutes les optimisations mises en place.\nEt voici le temps de chargement de la vue réseau de Firebug pour le premier et le second chargement de la page d\u0026rsquo;accueil:\nPremier chargement\nSecond chargement\n","permalink":"https://outweb.eu/2013/11/05/booster-wordpress/","summary":"\u003cp\u003eAugmenter les performance pour diminuer le temps de réponse de son site devrait être la préoccupation de tout webmaster, afin d\u0026rsquo;améliorer au maximum l\u0026rsquo;expérience utilisateur mais aussi pour être mieux référencé sur Google. Nous allons voir dans cet article comment optimiser Wordpress pour obtenir un temps de réponse minimal.\u003c/p\u003e\n\u003cp\u003eIl existe une kyrielle de plugins Wordpress qui permettent de réduire le temps de réponse de Wordpress. Un des plus connus est \u003ca href=\"http://wordpress.org/plugins/w3-total-cache/\"\u003ew3 Total Cache\u003c/a\u003e car il possède énormément de fonctionnalités.\u003c/p\u003e","title":"Booster votre wordpress"},{"content":"Le tuto fonctionne aussi sous Ubuntu 12.04 (oui c\u0026rsquo;est article qui date)\nLe pare-feu \u0026ldquo;Shoreline Firewall\u0026rdquo;, plus communément appelé \u0026ldquo;Shorewall\u0026rdquo;, est un outil qui permet de configurer plus facilement Netfilter (IpTable).\nShorewall est un outil qui permet de configurer Netfilter, son travail est fini.\nL\u0026rsquo;avantage de Shorewall est qu\u0026rsquo;il est très flexible, une fois que l\u0026rsquo;on a compris la syntaxe.\nSi vous avez d\u0026rsquo;autres firewalls il faut les désinstaller avant de commencer (ex: firestarter)\nInstallation de shorewall https://gist.github.com/lahaxearnaud/9fb238d492d0827caf1c30c9e71136b5\nMaintenant que les fichiers de configuration de base sont placés aux bons endroits nous allons pouvoir commencer à configurer Shorewall selon nos besoins.Par défaut les connexions entrantes sont refusées mais les connexions sortantes sont autorisées. Selon vos besoins vous pouvez changer la politique en éditant le fichier `/etc/shorewall/policy`. Dans la suite de l\u0026rsquo;article on partira du principe que la politique utilisée est la politique par défaut.\nMise en place des règles du firewall Ouvrir le fichier qui contient les règles:\nhttps://gist.github.com/lahaxearnaud/1bd7af0ba732ce0df168d217b44a6351\nOn a deux zones le \u0026ldquo;net\u0026rdquo; et le \u0026ldquo;$FW\u0026rdquo; (firewall).\nTrois actions:\nACCEPT = accepter REJECT = refuser DROP = ignorer (préferez-le à reject) Voici un exemple de fichier de configuration:\nhttps://gist.github.com/lahaxearnaud/b3cc8dff735712a66bd74ac99afb10d4\nAvant de continuer pensez à vérifier que vous avez bien ajouté une règle pour autoriser votre connexion SSH. Par défaut c\u0026rsquo;est le port 22 mais il a pu être changé. Vérifiez que Port est bien à 22 dans : `etc/ssh/sshd_config`. Si ce n\u0026rsquo;est pas le cas il faudra modifier la règle correspondant au SSH\nMaintenant que nous avons correctement configuré la bête reste à lui dire qu\u0026rsquo;elle peut être lancée.\nhttps://gist.github.com/lahaxearnaud/1bd7af0ba732ce0df168d217b44a6351\nMettre la variable startup à 1 au lieu de 0.\nLancement de Shorewall Allez il est temps de le lancer:\nhttps://gist.github.com/lahaxearnaud/fc21f0ac62886aa98732787faf843c0b\nLa sortie devrait plus ou moins ressembler à ça :\nhttps://gist.github.com/lahaxearnaud/403eed4150e5d0a2f81551f5d2128db6\nSi ce n\u0026rsquo;est pas le cas et qu\u0026rsquo;une erreur apparait c\u0026rsquo;est que vous avez un problème de configuration.\n","permalink":"https://outweb.eu/2012/11/06/configurer-shorewall-sous-debian/","summary":"\u003cp\u003e\u003cem\u003eLe tuto fonctionne aussi sous Ubuntu 12.04\u003c/em\u003e (oui c\u0026rsquo;est article qui date)\u003c/p\u003e\n\u003cp\u003eLe pare-feu \u0026ldquo;Shoreline Firewall\u0026rdquo;, plus communément appelé \u0026ldquo;\u003ca href=\"http://shorewall.net/\"\u003eShorewall\u003c/a\u003e\u0026rdquo;, est un outil qui permet de configurer plus facilement \u003ca href=\"http://www.netfilter.org/\"\u003eNetfilter\u003c/a\u003e (\u003ca href=\"http://fr.wikipedia.org/wiki/Iptables\"\u003eIpTable\u003c/a\u003e).\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://shorewall.net/\"\u003eShorewall\u003c/a\u003e est un outil qui permet de configurer \u003ca href=\"http://www.netfilter.org/\"\u003eNetfilter\u003c/a\u003e, son travail est fini.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;avantage de \u003ca href=\"http://shorewall.net/\"\u003eShorewall\u003c/a\u003e est qu\u0026rsquo;il est très flexible, une fois que l\u0026rsquo;on a compris la syntaxe.\u003c/p\u003e\n\u003cp\u003eSi vous avez d\u0026rsquo;autres firewalls il faut les désinstaller avant de commencer (ex: \u003ca href=\"http://www.fs-security.com/\"\u003efirestarter\u003c/a\u003e)\u003c/p\u003e","title":"Configurer shorewall sous debian"},{"content":"JQPlot est un plugin JQuery qui permet de dessiner des graphiques dans vos pages HTML. Si vous faites des pages de statistiques sur vos pages Internet vous comprendrez rapidement quelles sont les applications et surtout en quoi il vous simplifie les choses. En effet, il vous suffit de lui donner les données et de décider quel type de graphique vous voulez obtenir en sortie et le tour est joué ! On peut facilement imager une fonction PHP (ou autre) qui va générer les données qu\u0026rsquo;il faut mettre en entrée de JQPlot à partir de votre base de données.\nVoici quelques exemples de graphiques que l\u0026rsquo;on peut obtenir grâce à ce plugin:\n","permalink":"https://outweb.eu/2011/08/16/afficher-des-graphiques-avec-jqplot/","summary":"\u003cp\u003eJQPlot est un plugin JQuery qui permet de dessiner des graphiques dans vos pages HTML. Si vous faites des pages de statistiques sur vos pages Internet vous comprendrez rapidement quelles sont les applications et surtout en quoi il vous simplifie les choses. En effet, il vous suffit de lui donner les données et de décider quel type de graphique vous voulez obtenir en sortie et le tour est joué ! On peut facilement imager une fonction PHP (ou autre) qui va générer les données qu\u0026rsquo;il faut mettre en entrée de JQPlot à partir de votre base de données.\u003c/p\u003e","title":"Afficher des graphiques avec JQPlot"},{"content":"Tous ceux qui ont déjà utilisé le dernier né de JQuery, à savoir JQuery mobile vont vraiment apprécier J qmPhp. En effet J qmPhp permet de simplifier une syntaxe assez lourde et surtout de fournir un code optimisé.\nTravaillant actuellement sur une application web pour smartphone, je me suis fortement intéressé à ce framework pour rendre mon code plus clair.\nUne fois que vous avez téléchargé le framework vous devez le configurer. A savoir que la version actuelle de JQuery mobile est la Alpha 4 mais que Jqmphpest conçu pour la Alpha 3. C\u0026rsquo;est pourquoi il est possible que certaines des nouvelles fonctionnalités de JQuery Mobile ne soient pas encore prises en charge.\nPour la configuration rendez-vous dans le fichier /lib/jqmphp.php\nLes valeurs suivantes sont à changer par les liens vers les nouvelles versions de JQuery Mobile (en local ou sur un serveur distant).\n/** * Sets the jQuery path. * @var JQMPHP_JQ */ define(\u0026#39;JQMPHP_JQ\u0026#39;, \u0026#39;http://code.jquery.com/jquery-1.5.min.js\u0026#39;, true); /** * Sets the jQuery Mobile path. * @var JQMPHP_JQM */ define(\u0026#39;JQMPHP_JQM\u0026#39;, \u0026#39;http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.js\u0026#39;, true); /** * Sets the jQuery Mobile CSS path. * @var JQMPHP_CSS */ define(\u0026#39;JQMPHP_CSS\u0026#39;, \u0026#39;http://code.jquery.com/mobile/1.0a3/jquery.mobile-1.0a3.min.css\u0026#39;, true); Maintenant que le framework est configuré on va pouvoir créer notre première page.\n\u0026lt;?php // Creation de l\u0026#39;objet jqmphp $j = new jqmPhp(); // ajout du titre au header $j-\u0026gt;head()-\u0026gt;title(\u0026#39;Menu principal\u0026#39;); // Création d\u0026#39;une page ( il peu en avoir plusieurs par jqmphp ) $p = new jqmPage(\u0026#39;Menu Principal\u0026#39;); // choix du theme et ajout du titre à la page $p-\u0026gt;theme(\u0026#39;c\u0026#39;)-\u0026gt;title(\u0026#39;Menu Principal\u0026#39;); // choix du theme pour le header de la page $p-\u0026gt;header()-\u0026gt;theme(\u0026#39;c\u0026#39;); // ajout de text HTML dans la page $p-\u0026gt;addContent(\u0026#39;Bienvenue sur ma belle page\u0026#39;); // Exemple de création de liste ( courant dans JQuery mobile) $gm = new jqmListviem(); // création et ajout d\u0026#39;un item à la liste $ann = $gm-\u0026gt;addBasic(\u0026#39;Lien 1\u0026#39;, \u0026#39;page1.php\u0026#39;,\u0026#39;\u0026#39;,true); $cal = $gm-\u0026gt;addBasic(\u0026#39;Lien 2\u0026#39;, \u0026#39;index.php?action=3\u0026#39;); // ajout de la liste à la page $p-\u0026gt;addContent($gm); // ajout de la page à l\u0026#39;objet $j-\u0026gt;addPage($p); // affichage de la page echo $j; ?\u0026gt; Comme on peut le remarquer le code est assez simple, mais qu\u0026rsquo;en est-il du résultat ?\nCeci est un exemple très simple mais vous trouverez sur le site du projet des exemples complexes avec des formulaires, des listes à icônes\u0026hellip;\nEn conclusion : Bien que le framework soit très récent il promet d\u0026rsquo;être très utile aux développeurs web soucieux des utilisateurs de smartphone.\nNous sommes dans l\u0026rsquo;attente d\u0026rsquo;une version qui sera sûrement adaptée à la version beta de JQuery mobile qui sortira prochainement.\n","permalink":"https://outweb.eu/2011/08/16/framework-jquery-mobile/","summary":"Jqmphp, framework JQuery mobile","title":"Framework JQuery mobile"},{"content":"Hacker Target est un site Internet qui vous propose de tester les vulnérabilités de votre application web.\nLe site vous propose plusieurs types de tests selon votre site Internet.\nVoici la liste complète des tests proposés gratuitement par le site (limité à 4/jours) :\nles injections SQL les CMS Drupal, Joomla et WordPress les ports de votre serveur les vulnérabilités de vos services les problèmes de configuration ou de scripts faire du fingerprint (déterminer les versions de vos librairies et logiciels) en savoir plus sur votre domaine par le biais de whois par exemples obtenir des infos sur vos CMS, fameworks, serveur, emplacement géographique…Etc Nous allons ici détailler le test concernant WordPress car c\u0026rsquo;est celui que je viens de réaliser sur localhost:8080.\nVoici la liste des tests :\nWordPress Version Check Site Reputation from Google, Norton and MyWot Default admin account enabled Directory Indexing on plugins htaccess readable robots.txt present Sites Externally linked from main page (reputation checks) WordPress Plugins that are detected passively and versions against latest versions. Javascript linked iframes present internal site links Hosting Reputation and Geolocation information IP address sharing and reputation of sites sharing the IP address Voici par exemple le type de conseils que l\u0026rsquo;on peut recevoir :\nThe WordPress administration login page is at the default location http://YOUR-WEBSITE/wp-admin/\nThis is not a critical risk however it should be understood that brute force attacks against WordPress login accounts\nincluding the admin account are not difficult. A strong password on the admin accounts is vital. It is recommended to\nrename the default admin account to a non-generic name.\nSinon, le rapport contient aussi la liste des liens externes de votre site afin de vérifier que personne n\u0026rsquo;a réussi à insérer des URLs vers des sites sans rapport.\nVous aurez aussi en fin de rapport la liste des sites Internet qui sont hébergés sous la même IP, ainsi que leurs MyWOT Reputation et leur résultat au Google Safe Browse.\nVous l\u0026rsquo;aurez compris, cet outil peut vous donner de mauvaises surprises s\u0026rsquo;il tombe entre de mauvaises mains.\nSite Internet : Hacker Target\n","permalink":"https://outweb.eu/2011/08/12/faire-un-audit-de-securite/","summary":"\u003cp\u003e\u003ca href=\"http://hackertarget.com/free-security-vulnerability-scans/\"\u003eHacker Target\u003c/a\u003e est un site Internet qui vous propose de tester les vulnérabilités de votre application web.\u003cbr\u003e\nLe site vous propose plusieurs types de tests selon votre site Internet.\u003c/p\u003e\n\u003cp\u003eVoici la liste complète des tests proposés gratuitement par le site (limité à 4/jours) :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles injections SQL\u003c/li\u003e\n\u003cli\u003eles CMS Drupal, Joomla et WordPress\u003c/li\u003e\n\u003cli\u003eles ports de votre serveur\u003c/li\u003e\n\u003cli\u003eles vulnérabilités de vos services\u003c/li\u003e\n\u003cli\u003eles problèmes de configuration ou de scripts\u003c/li\u003e\n\u003cli\u003efaire du fingerprint (déterminer les versions de vos librairies et logiciels)\u003c/li\u003e\n\u003cli\u003een savoir plus sur votre domaine par le biais de whois par exemples\u003c/li\u003e\n\u003cli\u003eobtenir des infos sur vos CMS, fameworks, serveur, emplacement géographique…Etc\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNous allons ici détailler le test concernant WordPress car c\u0026rsquo;est celui que je viens de réaliser sur localhost:8080.\u003c/p\u003e","title":"Faire un audit de sécurité"},{"content":"Le chargement de vos fichiers Javascript ralentit le chargement de page. Ceci est logique car le navigateur doit télécharger les fichiers avant de faire l\u0026rsquo;affichage. Grâce à Require.js vous allez pouvoir charger vos JavaScript en asynchrone. C\u0026rsquo;est-à-dire charger le texte, les images, les styles puis seulement une fois que la page est affichée correctement, et que le lecteur peut commencer à lire le contenu, le JavaScript. Require.js permet aussi de détecter les fichiers qui ont déjà été chargés afin de ne pas les recharger.\nL\u0026rsquo;utilisation du script est très simple, dans un premier temps, il faut inclure le fichier contenant require.js :\nPuis à la fin du body il faut dire à require.js de charger les autres scripts :\nrequire([ \u0026#34;scripts/underscore.js\u0026#34;, \u0026#34;scripts/jquery.js\u0026#34;, \u0026#34;scripts/backbone.js\u0026#34; ], function(){ $(\u0026#39;#exemple\u0026#39;).html(\u0026#39;Jquery loaded!\u0026#39;) }) Le gain au chargement de la page est assez intéressant, surtout depuis la refonte complète de la librairie.\n","permalink":"https://outweb.eu/2011/08/10/charger-vos-scripts-en-asynchrone/","summary":"\u003cp\u003eLe chargement de vos fichiers Javascript ralentit le chargement de page. Ceci est logique car le navigateur doit télécharger les fichiers avant de faire l\u0026rsquo;affichage. Grâce à \u003ca href=\"https://requirejs.org/\"\u003eRequire.js\u003c/a\u003e vous allez pouvoir charger vos JavaScript en asynchrone. C\u0026rsquo;est-à-dire charger le texte, les images, les styles puis seulement une fois que la page est affichée correctement, et que le lecteur peut commencer à lire le contenu, le JavaScript. Require.js permet aussi de détecter les fichiers qui ont déjà été chargés afin de ne pas les recharger.\u003c/p\u003e","title":"Charger vos scripts en asynchrone"},{"content":"Le plugin JQuery contextMenu vous permet de faire des menus contextuels sur des images, du texte ou tout autre contenu. L’utilisation de contextMenu peut être utile pour permettre de partager un contenu sur les réseaux sociaux, pour gérer du contenu dynamique ou simplement pour afficher des informations à l\u0026rsquo;utilisateur.\nVoici un exemple de menu contextuel généré par le plugin :\nPour obtenir ce genre de résultat voici comment appeler le plugin :\n$.contextMenu({selector: \u0026#39;#id_de_votre_objet_html\u0026#39;, items: { edit: {name: \u0026#34;Edit\u0026#34;, icon: \u0026#34;edit\u0026#34;, callback: $.noop}, cut: {name: \u0026#34;Cut\u0026#34;, icon: \u0026#34;cut\u0026#34;, callback: $.noop}, copy: {name: \u0026#34;Copy\u0026#34;, icon: \u0026#34;copy\u0026#34;, callback: $.noop}, paste: {name: \u0026#34;Paste\u0026#34;, icon: \u0026#34;paste\u0026#34;, callback: $.noop}, \u0026#34;delete\u0026#34;: {name: \u0026#34;Delete\u0026#34;, icon: \u0026#34;delete\u0026#34;, callback: $.noop}, sep1: \u0026#34;---------\u0026#34;, quit: {name: \u0026#34;Quit\u0026#34;, icon: \u0026#34;quit\u0026#34;, callback: $.noop} }}); Comme vous pouvez le voir son utilisation est très simple.\n","permalink":"https://outweb.eu/2011/08/08/menu-contextuel-en-javascript/","summary":"\u003cp\u003eLe plugin JQuery \u003ca href=\"https://swisnl.github.io/jQuery-contextMenu/\"\u003econtextMenu\u003c/a\u003e vous permet de faire des menus contextuels sur des images, du texte ou tout autre contenu. L’utilisation de contextMenu peut être utile pour permettre de partager un contenu sur les réseaux sociaux, pour gérer du contenu dynamique ou simplement pour afficher des informations à l\u0026rsquo;utilisateur.\u003c/p\u003e\n\u003cp\u003eVoici un exemple de menu contextuel généré par le plugin :\u003c/p\u003e\n\u003cp\u003ePour obtenir ce genre de résultat voici comment appeler le plugin :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$.contextMenu({selector: \u0026#39;#id_de_votre_objet_html\u0026#39;, items: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tedit: {name: \u0026#34;Edit\u0026#34;, icon: \u0026#34;edit\u0026#34;, callback: $.noop},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcut: {name: \u0026#34;Cut\u0026#34;, icon: \u0026#34;cut\u0026#34;, callback: $.noop},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcopy: {name: \u0026#34;Copy\u0026#34;, icon: \u0026#34;copy\u0026#34;, callback: $.noop},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpaste: {name: \u0026#34;Paste\u0026#34;, icon: \u0026#34;paste\u0026#34;, callback: $.noop},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u0026#34;delete\u0026#34;: {name: \u0026#34;Delete\u0026#34;, icon: \u0026#34;delete\u0026#34;, callback: $.noop},\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tsep1: \u0026#34;---------\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tquit: {name: \u0026#34;Quit\u0026#34;, icon: \u0026#34;quit\u0026#34;, callback: $.noop}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}});\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme vous pouvez le voir son utilisation est très simple.\u003c/p\u003e","title":"Menu contextuel en JavaScript"},{"content":"Prefixr est un outil, en version alpha, qui vas vous aider dans le développement de vos designs. En effet, le site vous propose de prendre n\u0026rsquo;importe quel code CSS et de vous en ressortir un code CSS compatible sur tous les navigateurs.\nVoici un exemple d\u0026rsquo;utilisation :\nVous avez écrit :\n.example { border: 10px solid #000000; width: 500px; height: 500px; -moz-border-radius: 10px 200px 200px 10px; } Malheureusement -moz-border-radius ne fonctionne pas sur tous les navigateurs\u0026hellip; On vas donc passer le code dans Prefixr pour le rendre compatible.\nEt on vas obtenir le code suivant :\n.example { border: 10px solid #000000; width: 500px; height: 500px; -webkit-border-radius: 10px 200px 200px 10px; -moz-border-radius: 10px 200px 200px 10px; -o-border-radius: 10px 200px 200px 10px; -ms-border-radius: 10px 200px 200px 10px; -khtml-border-radius: 10px 200px 200px 10px; border-radius: 10px 200px 200px 10px; } Bien que ceci soit déjà pas mal, cela implique de faire des aller retours entre votre éditeur et votre navigateur pour tester et modifier votre CSS. C\u0026rsquo;est pourquoi les développeur ont mis en place une api accessible depuis les éditeurs de texte évolués afin d\u0026rsquo;utiliser le service sans aller sur le site.\nPour cela il faudra créer une nouvelle commande dans votre éditeur qui exécutera :\ncurl -sSd \u0026#34;css=$TM_SELECTED_TEXT\u0026#34; \u0026#34;http://prefixr.com/api/index.php\u0026#34; Il faudra installer curl si vous ne l\u0026rsquo;avez pas.\nEn conclusion Prefixr est un outil très intéressant et offrant un gain de temps considérable. Cependant il vas nécessiter des mise à jours régulières pour s\u0026rsquo;adapter au mieux à toutes les règles du CSS3.\n","permalink":"https://outweb.eu/2011/08/08/rendre-votre-css-compatible-sur-tous-les-navigateurs/","summary":"\u003cp\u003e\u003ca href=\"http://prefixr.com/\"\u003ePrefixr\u003c/a\u003e est un outil, en version alpha, qui vas vous aider dans le développement de vos designs. En effet, le site vous propose de prendre n\u0026rsquo;importe quel code CSS et de vous en ressortir un code CSS compatible sur tous les navigateurs.\u003c/p\u003e\n\u003cp\u003eVoici un exemple d\u0026rsquo;utilisation :\u003c/p\u003e\n\u003cp\u003eVous avez écrit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e.example {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  border: 10px solid #000000;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  width: 500px;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  height: 500px;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  -moz-border-radius: 10px 200px 200px 10px;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMalheureusement -moz-border-radius ne fonctionne pas sur tous les navigateurs\u0026hellip; On vas donc passer le code dans Prefixr pour le rendre compatible.\u003c/p\u003e","title":"Rendre votre CSS compatible sur tous les navigateurs"},{"content":"Wordpress est un des CMS les plus utilisés dans le monde. Il permet de créer rapidement et très simplement un blog, mais aussi des sites Internet en tous genres. Avec les bonnes extensions, vous pouvez même en faire un site de e-commerce. Son avantage est principalement son optimisation pour le référencement. En effet, si vous avez du contenu intéressant, il sera facilement et rapidement indexé sur les moteurs de recherche. Un des autres avantages de Wordpress est sa grande flexibilité. Vous pouvez réussir à faire énormément de choses juste en ajoutant des extensions. Voici donc une liste des extensions que vous pourrez directement installer depuis votre interface administrateur. Pour installer une extension, rendez-vous dans Extensions\u0026gt;Ajouter.\nExtensions orintées référencement Beaucoup d\u0026rsquo;extensions existent pour optimiser votre référencement, mais il faut faire un choix et éviter de trop alourdir votre Wordpress.\nSEO ALRP : permet de rajouter automatiquement à la fin de vos articles des liens vers d\u0026rsquo;autres articles de la même thématique Simple Tags : permet de trouver simplement les mots clés pour vos articles Tweet, Like, Google +1 and Share : permet l\u0026rsquo;ajout de liens de partages sur les réseaux sociaux SEO Ultimate : pour mettre en place des balises meta différentes pour chaque page Utilitaire Wordpress Backup : permet de faire une sauvegarde de vos images, plugins et thèmes Wordpress Broken Links Remover vérifie tous les intervalles de temps défini, les liens du site afin de trouver des liens ou des images morts. Mobile Smart : permet la détection des appareils mobiles et la sélection d\u0026rsquo;un thème Wordpress adapté. Exploit Scanner teste le code de votre Wordpress afin de tenter d\u0026rsquo;y trouver des failles de sécurité Post View permet de suivre le nombre de visites de vos articles, de les classer par fréquentation, de faire des graphiques avec les données\u0026hellip; Optimisation DB Cache Reloaded : Mise en cache des résultats des requêtes SQL WP Widget Cache permet une gestion pointue du cache de vos widgets ","permalink":"https://outweb.eu/2011/08/06/les-extensions-wordpress/","summary":"\u003cp\u003eWordpress est un des CMS les plus utilisés dans le monde. Il permet de créer rapidement et très simplement un blog, mais aussi des sites Internet en tous genres. Avec les bonnes extensions, vous pouvez même en faire un site de e-commerce. Son avantage est principalement son optimisation pour le référencement. En effet, si vous avez du contenu intéressant, il sera facilement et rapidement indexé sur les moteurs de recherche. Un des autres avantages de Wordpress est sa grande flexibilité. Vous pouvez réussir à faire énormément de choses juste en ajoutant des extensions. Voici donc une liste des extensions que vous pourrez directement installer depuis votre interface administrateur. Pour installer une extension, rendez-vous dans Extensions\u0026gt;Ajouter.\u003c/p\u003e","title":"Les extensions Wordpress"},{"content":"Vous souhaitez mettre en place un système de tag d\u0026rsquo;image comme sur Flickr ou Facebook, mais vous ne savez même pas par où commencer. jQuery Image Annotation Plugin, couplé à Jquery et JQuery UI, vous permet de faire ceci sans aucune difficulté.\nLe plugin permet d\u0026rsquo;ajouter, de modifier, et de supprimer des annotations sur l\u0026rsquo;image. J\u0026rsquo;ai fait le test avec la dernière version 3.2 et le résultat obtenu est plutôt soigné. Voici le code HTML / JavaScript nécessaire pour utiliser cette librairie.\n\u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;style type=\u0026#34;text/css\u0026#34; media=\u0026#34;all\u0026#34;\u0026gt;@import \u0026#34;./css/annotation.css\u0026#34;;\u0026lt;/style\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;./js/jquery-1.3.2.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;./js/jquery-ui-1.7.1.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;./js/jquery.annotate.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;script language=\u0026#34;javascript\u0026#34;\u0026gt; $(window).load(function() { $(\u0026#34;#toAnnotate\u0026#34;).annotateImage({ editable: true, useAjax: false, notes: [ { \u0026#34;top\u0026#34;: 286, \u0026#34;left\u0026#34;: 161, \u0026#34;width\u0026#34;: 70, \u0026#34;height\u0026#34;: 70, \u0026#34;text\u0026#34;: \u0026#34;Edites moi !\u0026#34;, \u0026#34;editable\u0026#34;: false }, { \u0026#34;top\u0026#34;: 134, \u0026#34;left\u0026#34;: 179, \u0026#34;width\u0026#34;: 100, \u0026#34;height\u0026#34;: 80, \u0026#34;text\u0026#34;: \u0026#34;Ne m\u0026#39;édites pas !\u0026#34;, \u0026#34;editable\u0026#34;: true } ] }); }); \u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div class=\u0026#34;main-content\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;./monImage.png\u0026#34; id=\u0026#34;toAnnotate\u0026#34; /\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; En conclusion il s\u0026rsquo;agit d\u0026rsquo;un plugin très intéressant, mais il est destiné à un nombre très restreint de projets, du fait de sa spécificité.\n","permalink":"https://outweb.eu/2011/08/05/systeme-de-tag-dimage-avec-jquery-image-anotate/","summary":"\u003cp\u003eVous souhaitez mettre en place un système de tag d\u0026rsquo;image comme sur Flickr ou Facebook, mais vous ne savez même pas par où commencer. \u003ca href=\"http://blog.flipbit.co.uk/2009/03/jquery-image-annotation-plugin.html\"\u003ejQuery Image Annotation Plugin\u003c/a\u003e, couplé à Jquery et JQuery UI, vous permet de faire ceci sans aucune difficulté.\u003c/p\u003e\n\u003cp\u003eLe plugin permet d\u0026rsquo;ajouter, de modifier, et de supprimer des annotations sur l\u0026rsquo;image. J\u0026rsquo;ai fait le test avec la dernière version 3.2 et le résultat obtenu est plutôt soigné. Voici le code HTML / JavaScript nécessaire pour utiliser cette librairie.\u003c/p\u003e","title":"Système de tag d'images avec JQuery image annotate"},{"content":"H5AI est un projet développé avec HTML5 qui a pour but de remplacer la page indexof par défaut de apache. C\u0026rsquo;est dans cette optique que H5AI propose plusieurs types de vue, un moteur de recherche interne ou encore un bandeau cliquable nous indiquant notre position dans l\u0026rsquo;arborescence de fichiers, depuis le root du dossier où H5AI est mis en place.\nVoici un exemple en images du type de rendu que vous pouvez avoir sur un dossier contenant plusieurs types de fichiers différents. Vous pouvez remarquer que le projet détecte le type de chacun des fichiers afin d\u0026rsquo;afficher la bonne icône.\n","permalink":"https://outweb.eu/2011/08/04/faire-un-indexof-travaille-avec-h5ai/","summary":"\u003cp\u003eH5AI est un projet développé avec HTML5 qui a pour but de remplacer la page indexof par défaut de apache. C\u0026rsquo;est dans cette optique que H5AI propose plusieurs types de vue, un moteur de recherche interne ou encore un bandeau cliquable nous indiquant notre position dans l\u0026rsquo;arborescence de fichiers, depuis le root du dossier où H5AI est mis en place.\u003c/p\u003e\n\u003cp\u003eVoici un exemple en images du type de rendu que vous pouvez avoir sur un dossier contenant plusieurs types de fichiers différents. Vous pouvez remarquer que le projet détecte le type de chacun des fichiers afin d\u0026rsquo;afficher la bonne icône.\u003c/p\u003e","title":"Faire un indexof travaillé avec H5AI"},{"content":" Les informations de cet article datent\nL\u0026rsquo;actualité étant chargée niveau hack, il est temps de sortir un petit article présentant différentes méthodes de sécurisation d\u0026rsquo;une application PHP.\nJe vais donc brièvement vous présenter différentes librairies ou classes PHP orientées sécurité.\nPHPIDS\nUn monitoring complet des actions de l\u0026rsquo;utilisateur avec évaluation de la dangerosité de chaque requête, et de la session. L\u0026rsquo;outil indispensable pour détecter les recherches de failles. Input filter\nCette librairie permet de filtrer les tableaux $_GET, $_POST, $_REQUEST pour y detecter le PHP, JavaScript et HTML. Anti csrf\nPermet d\u0026rsquo;ajouter un token dans ses formulaires afin de ne pas se les faire détourner. Le but étant que chaque formulaire ne soit soumis qu\u0026rsquo;une seule fois. L\u0026rsquo;utilisation des librairies précédentes est un complément mais elles ne constituent pas une sécurité optimale à elles seules.\nVoici donc une liste de bonnes pratiques niveau sécurité :\nNe jamais insérer des données dans une requête SQL sans un minimum de traitement. ( mysql_real_escape_string ou mieux PDO::prepare() et PDOStatment::bindValue() )\nNe jamais faire passer en paramètre une page à inclure\nexemple : include $_GET[\u0026ldquo;ma_page\u0026rdquo;]; préférez une solution du type : switch($_GET[\u0026ldquo;ma_page\u0026rdquo;]){ case \u0026ldquo;home\u0026rdquo; : include \u0026ldquo;home.php\u0026rdquo;; break; case \u0026ldquo;forum\u0026rdquo; : include \u0026ldquo;forum.php\u0026rdquo;; break; default : inclue \u0026ldquo;error.php\u0026rdquo; break; }\nAvoir un fichier index.html dans chaque dossier du projet, contenant\nAccés interdit Sécuriser ses session_start contre le vol de session.\n$ip = !empty( $_SERVER[\u0026lsquo;HTTP_X_FORWARDED_FOR\u0026rsquo;] ) ? $_SERVER[\u0026lsquo;HTTP_X_FORWARDED_FOR\u0026rsquo;] : $_SERVER[\u0026lsquo;REMOTE_ADDR\u0026rsquo;]; $securite = $ip.\u0026rsquo;_\u0026rsquo;.$_SERVER[\u0026lsquo;HTTP_USER_AGENT\u0026rsquo;]; if(empty($_SESSION)) { session_start(); $_SESSION[\u0026lsquo;securite\u0026rsquo;] = $securite; } elseif($_SESSION[\u0026lsquo;securite\u0026rsquo;] != $securite) { session_regenerate_id(); $_SESSION = array(); } Voici donc une technique qui permet simplement de tester si une session est bien utilisée par le même navigateur sur la même machine.\nCrypter les données sensibles de votre base (email,pseudo par exemple ).\nJ\u0026rsquo;ai mis au point cette classe : Crypage.\nElle n\u0026rsquo;est certes pas extrêmement puissante mais elle permet de se protéger contre une injection SQL. Pensez bien sûr à changer la clef :P .\nLe cryptage des mots de passe est une base de la sécurité. Pour cela utilisez une fonction comme celle-ci : protected function crypteMotPasse($mot){ $salt = \u0026ldquo;!123 GRAIN DE SEL#\u0026rdquo;; return sha1(strrev(ucfirst($mot).$salt)); } Ceci est une idée le but est d\u0026rsquo;éviter que les mots de passe soient facilement lisibles en cas de piratage de notre base de données. Tout en sachant que des rainbow table existent pour inverser un md5 ou un sha1.\nVous pouvez aussi définir un salt par user. Pour cela, au moment de la création du compte, vous générez une chaîne de caractères le plus aléatoirement possible, que vous stockez dans votre table user. Pour la connexion de l\u0026rsquo;utilisateur, il faudra dans un premier temps aller chercher le salt dans la base. Puis utilisez la fonction ci-dessus comme suit : protected function crypteMotPasse($mot,$saltuser){ $salt = \u0026ldquo;!123 SALT FIXE#\u0026rdquo;.$saltuser; return sha1(strrev(ucfirst($mot).$salt)); } Comme le rappelle Simon dans son commentaire : En effet, l’attaquant, pour obtenir l’ensemble des données de la base doit :\n- avec la fonction crypteMotPasse (salt à l’intérieur de la fonction) : regénérer une rainbow table\n- avec une fonction qui prend un salt différent par utilisateur : regénérer autant de rainbow table que d’utilisateurs\nEmpêcher un accès direct à vos fichiers PHP. Dans votre/vos fichier(s) d\u0026rsquo;entrée(s) (index.php par exemple) faites un : define(\u0026quot;_BASE_URL\u0026quot;,TRUE); Puis commencez tous vos autres fichiers PHP par :\n\u003c?php if(!defined('\\_BASE\\_URL')) die(\"Erreur, la page est indisponible\"); Ajoutez la ligne suivante dans votre/vos fichier(s) d\u0026rsquo;entrée(s) afin d\u0026rsquo;activer les logs d\u0026rsquo;erreur PHP. Ceci est très utile pour débugger votre application lors de la phase de développement. Il faut cepandant penser à enlever cette ligne au moment de la mise en production.\n\u003c?php error\\_reporting(E\\_ALL); ?\u003e Ne stockez que le minimum vital dans les cookies (voire rien si possible), réduisez la durée de vie de vos cookies, et cryptez les données qui sont dedans.\nPour les utilisateurs de CodeIgniter, activez le stockage de la session en base de données.\nDocumentation allez à \u0026ldquo;Saving Session Data to a Database\u0026rdquo;\n","permalink":"https://outweb.eu/2011/08/02/securite-php/","summary":"\u003cblockquote\u003e\n\u003cp\u003eLes informations de cet article datent\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003eL\u0026rsquo;actualité étant chargée niveau hack, il est temps de sortir un petit article présentant différentes méthodes de sécurisation d\u0026rsquo;une application PHP.\u003cbr\u003e\nJe vais donc brièvement vous présenter différentes librairies ou classes PHP orientées sécurité.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://phpids.org/\"\u003ePHPIDS\u003c/a\u003e\u003cbr\u003e\nUn monitoring complet des actions de l\u0026rsquo;utilisateur avec évaluation de la dangerosité de chaque requête, et de la session. L\u0026rsquo;outil indispensable pour détecter les recherches de failles.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://www.phpclasses.org/package/2189-PHP-Filter-out-unwanted-PHP-Javascript-HTML-tags-.html\"\u003eInput filter\u003c/a\u003e\u003cbr\u003e\nCette librairie permet de filtrer les tableaux $_GET, $_POST, $_REQUEST pour y detecter le PHP, JavaScript et HTML.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://code.google.com/p/anticsurf/\"\u003eAnti csrf\u003c/a\u003e\u003cbr\u003e\nPermet d\u0026rsquo;ajouter un token dans ses formulaires afin de ne pas se les faire détourner. Le but étant que chaque formulaire ne soit soumis qu\u0026rsquo;une seule fois.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eL\u0026rsquo;utilisation des librairies précédentes est un complément mais elles ne constituent pas une sécurité optimale à elles seules.\u003c/p\u003e","title":"Sécurité PHP"},{"content":"Vous êtes photographe, amateur ou professionnel et vous vous demandez comment mettre en valeur vos photos sur votre site web ?\n3D Wall Gallery vous permet de les mettre en page sous forme d\u0026rsquo;un slider plutôt attractif.\nVoici comment les images se présentent dans votre navigateur. La barre sur le dessus de la page vous permet de faire glisser la \u0026ldquo;pellicule\u0026rdquo; afin de voir d\u0026rsquo;autres images.\nSur le bas de la page, vous avez un widget qui vous permet de prévisualiser vos images et ainsi de choisir directement celle qui vous intéresse.\nVous l\u0026rsquo;aurez compris, ce projet basé sur JQuery UI est très intéressant, cependant, le seul bémol est la mise en place de cet outil.\nEn effet, pour ajouter une image il vous faudra :\nVotre image en taille normale Votre image en miniature Ajouter votre grande image à la liste des images Ajouter votre miniature à la liste des miniatures Ajouter un lien pour afficher votre grande image à partir du widget Il est bien dommage que le projet ne soit pas un fichier php qui listerait les images et qui générerait le fichier HTML automatiquement.\nCependant, la version téléchargeable contient un fichier index.html d\u0026rsquo;exemple, il vous suffira de remplacer les liens des images et de supprimer celles qui sont en trop.\n","permalink":"https://outweb.eu/2011/08/02/galerie-de-photos-elegante/","summary":"\u003cp\u003eVous êtes photographe, amateur ou professionnel et vous vous demandez comment mettre en valeur vos photos sur votre site web ?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://tympanus.net/codrops/2011/02/02/3d-wall-gallery/\"\u003e3D Wall Gallery\u003c/a\u003e vous permet de les mettre en page sous forme d\u0026rsquo;un slider plutôt attractif.\u003c/p\u003e\n\u003cp\u003eVoici comment les images se présentent dans votre navigateur. La barre sur le dessus de la page vous permet de faire glisser la \u0026ldquo;pellicule\u0026rdquo; afin de voir d\u0026rsquo;autres images.\u003c/p\u003e\n\u003cp\u003eSur le bas de la page, vous avez un widget qui vous permet de prévisualiser vos images et ainsi de choisir directement celle qui vous intéresse.\u003c/p\u003e","title":"Galerie de photos élégante"},{"content":"BlackBird est une librairie Javascript qui permet de générer un système de log visuel.\nGrâce à cet outil, plus besoin de faire des alertes toutes les 5 lignes de code pour trouver la source de vos bogues.\nLa librairie permet de chronométrer vos applications afin d\u0026rsquo;en trouver les parties lentes.\nVoici les principales fonctions de la librairie :\nlog.debug( \u0026#39;this is a debug message\u0026#39; ); log.info( \u0026#39;this is an info message\u0026#39; ); log.warn( \u0026#39;this is a warning message\u0026#39; ); log.error( \u0026#39;this is an error message\u0026#39; ); // pour le profilage log.profile( \u0026#39;generate test string\u0026#39; ); var testContent = \u0026#39;\u0026#39;; for ( var i = 0; i \u0026lt; 3000; i++ ) { testContent += \u0026#39;-\u0026#39;; } log.profile( \u0026#39;generate test string\u0026#39; ); Et voici le résultat obtenu dans la petite fenêtre de débogage :\nBref il s\u0026rsquo;agit ici vraiment d\u0026rsquo;un outil ergonomique et simple destiné à simplifier la vie des développeurs. L\u0026rsquo;essayer c\u0026rsquo;est l\u0026rsquo;adopter !\n","permalink":"https://outweb.eu/2011/07/30/une-aide-au-debogage-javascript-blackbird/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/pockata/blackbird-js\"\u003eBlackBird\u003c/a\u003e est une librairie Javascript qui permet de générer un système de log visuel.\u003cbr\u003e\nGrâce à cet outil, plus besoin de faire des alertes toutes les 5 lignes de code pour trouver la source de vos bogues.\u003cbr\u003e\nLa librairie permet de chronométrer vos applications afin d\u0026rsquo;en trouver les parties lentes.\u003c/p\u003e\n\u003cp\u003eVoici les principales fonctions de la librairie :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003edebug( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;this is a debug message\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003einfo( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;this is an info message\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ewarn( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;this is a warning message\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eerror( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;this is an error message\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e pour le profilage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eprofile( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;generate test string\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e testContent \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e ( \u003cspan style=\"color:#66d9ef\"\u003evar\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e; i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3000\u003c/span\u003e; i\u003cspan style=\"color:#f92672\"\u003e++\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  testContent \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eprofile( \u003cspan style=\"color:#e6db74\"\u003e\u0026#39;generate test string\u0026#39;\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt voici le résultat obtenu dans la petite fenêtre de débogage :\u003c/p\u003e","title":"Une aide au débogage javascript : blackbird"},{"content":"Aujourd\u0026rsquo;hui, je vais vous présenter un plugin JQuery très connu mais qui est un des meilleurs dans son style. Fancybox permet de faire des popups non-intrusives avec un design à la MAC OS. Vous l\u0026rsquo;aurez compris, le design est épuré et sans couleur.\nDu fait de sa simplicité apparente, on peut facilement l’intégrer sur nos sites Internet, elle ne choquera pas comme pourrait le faire lightbox avec ses bordures épaisses.\nJe serai relativement court sur cette présentation, car la documentation est très fournie sur le site suivant Fancybox. Vous y trouverez aussi une suite d\u0026rsquo;exemples qui pourront vous convaincre d\u0026rsquo;utiliser ce plugin plutôt qu\u0026rsquo;un autre.\nComme je vous l\u0026rsquo;ai dit précédemment, on peut voir que les bordures sont très fines et que seul le bouton \u0026ldquo;fermer\u0026rdquo; ressort. Cependant, pour fermer la fancybox, vous pouvez aussi cliquer à côté.\n","permalink":"https://outweb.eu/2011/07/30/faire-des-popups-non-intrusives-avec-fancybox/","summary":"\u003cp\u003eAujourd\u0026rsquo;hui, je vais vous présenter un plugin JQuery très connu mais qui est un des meilleurs dans son style. \u003ca href=\"http://fancybox.net/\"\u003eFancybox\u003c/a\u003e permet de faire des popups non-intrusives avec un design à la MAC OS. Vous l\u0026rsquo;aurez compris, le design est épuré et sans couleur.\u003cbr\u003e\nDu fait de sa simplicité apparente, on peut facilement l’intégrer sur nos sites Internet, elle ne choquera pas comme pourrait le faire lightbox avec ses bordures épaisses.\u003c/p\u003e\n\u003cp\u003eJe serai relativement court sur cette présentation, car la documentation est très fournie sur le site suivant \u003ca href=\"http://fancybox.net/\"\u003eFancybox\u003c/a\u003e. Vous y trouverez aussi une suite d\u0026rsquo;exemples qui pourront vous convaincre d\u0026rsquo;utiliser ce plugin plutôt qu\u0026rsquo;un autre.\u003c/p\u003e","title":"Faire des popups non intrusives avec Fancybox"},{"content":"La nouvelle mouture tant attendue de Symfony 2 est sortie hier matin en version stable. Après de nombreux mois de tests, de versions releases, beta et RC, la version stable et définitive est enfin accessible.\nAu programme, énormément de changements et une simplification apparente du framework. Les bundles font leur apparition, ils vont vous permettre d\u0026rsquo;insérer dans votre site Internet des modules que vous pouvez télécharger avec composer. Il existe déjà un grand nombre de bundles tout faits et prêts à l\u0026rsquo;emploi, comme un forum ou une gestion des membres par exemple. Le but est réellement à court terme de fournir tous les codes de base pour un site Internet, afin de se focaliser seulement sur le coeur de votre application.\nBien que ceci soit une différence notable par rapport aux précédentes versions, la sortie de différentes versions du framework en fonction des utilisations et du niveau des développeurs est une chose encore plus étonnante de la part du framework PHP5, qui a la réputation d\u0026rsquo;être le plus complexe à apprendre. Pour le moment, seule la version standard est téléchargeable, mais la rumeur parle de version Standard Edition, Sandbox, CMF\u0026hellip; Chacune présentera des caractéristiques de base différentes, mais en arrière-plan il s\u0026rsquo;agira toujours du même noyau Symfony 2.\nLes habitués de Propel vont être bien déçus d\u0026rsquo;apprendre qu\u0026rsquo;il a disparu du framework. En effet, seul Doctrine, en l\u0026rsquo;occurrence Doctrine 2, est maintenant disponible. C\u0026rsquo;est la fin de la cohabitation :p. Le grand plus de Doctrine 2 est la mise en cache des résultats de requêtes. Ceci vous permet de gagner du temps sur la génération de vos pages web.\nDans les nouveautés notables, on peut mentionner l\u0026rsquo;intégration du moteur de templates twig. Twig est aujourd\u0026rsquo;hui un des meilleurs moteurs de templates PHP disponibles, son intégration n\u0026rsquo;est pas une grande surprise.\n","permalink":"https://outweb.eu/2011/07/29/sortie-de-symphony-2/","summary":"\u003cp\u003eLa nouvelle mouture tant attendue de Symfony 2 est sortie hier matin en version stable. Après de nombreux mois de tests, de versions releases, beta et RC, la version stable et définitive est enfin accessible.\u003c/p\u003e\n\u003cp\u003eAu programme, énormément de changements et une simplification apparente du framework. Les bundles font leur apparition, ils vont vous permettre d\u0026rsquo;insérer dans votre site Internet des modules que vous pouvez télécharger avec composer. Il existe déjà un grand nombre de bundles tout faits et prêts à l\u0026rsquo;emploi, comme un forum ou une gestion des membres par exemple. Le but est réellement à court terme de fournir tous les codes de base pour un site Internet, afin de se focaliser seulement sur le coeur de votre application.\u003c/p\u003e","title":"Sortie de Symfony 2"},{"content":"Si votre site possède une partie un peu complexe, comme une zone membre avec des menus et des zones d\u0026rsquo;informations, vous souhaitez peut-être expliquer à vos utilisateurs la logique et le fonctionnement de tout cela. Habituellement, vous faites une vidéo ou un tutoriel expliquant à l\u0026rsquo;aide d\u0026rsquo;images votre projet.\nBootstro va vous permet de faire une suite d\u0026rsquo;infobulles, expliquant étape par étape, directement dans la page web, le fonctionnement de votre site. Ceci offre une multitude d\u0026rsquo;avantages. Le simple fait que l\u0026rsquo;utilisateur puisse à tout moment, sans quitter la page, accéder à l\u0026rsquo;aide, est déjà beaucoup.\nVoici un exemple en images :\nDe plus on pourrais utiliser ce système sur des sites à contenu payant pour faire \u0026ldquo;un tour gratuit\u0026rdquo; ou bien encore pour présenter des templates HTML. Bref vous l\u0026rsquo;aurez compris, les utilisations de cet outils sont multiples.\n","permalink":"https://outweb.eu/2011/07/28/presenter-votre-site-internet-a-vos-utilisateurs/","summary":"\u003cp\u003eSi votre site possède une partie un peu complexe, comme une zone membre avec des menus et des zones d\u0026rsquo;informations, vous souhaitez peut-être expliquer à vos utilisateurs la logique et le fonctionnement de tout cela. Habituellement, vous faites une vidéo ou un tutoriel expliquant à l\u0026rsquo;aide d\u0026rsquo;images votre projet.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://clu3.github.io/bootstro.js/\"\u003eBootstro\u003c/a\u003e va vous permet de faire une suite d\u0026rsquo;infobulles, expliquant étape par étape, directement dans la page web, le fonctionnement de votre site. Ceci offre une multitude d\u0026rsquo;avantages. Le simple fait que l\u0026rsquo;utilisateur puisse à tout moment, sans quitter la page, accéder à l\u0026rsquo;aide, est déjà beaucoup.\u003c/p\u003e","title":"Présenter votre site Internet à vos utilisateurs"},{"content":"Pour faire suite à l\u0026rsquo;article sur l\u0026rsquo;optimisation, voici comment gagner du temps sur le chargement des images de vos pages web.\nEn général, les développeurs débutants, ou peu soucieux du temps de chargement de la page, utilisent un nombre conséquent d\u0026rsquo;images différentes. Chaque image est donc téléchargée une à une lors de l\u0026rsquo;affichage de la page web. Donc s\u0026rsquo;il y a 100 images sur la page il faudra 100 requêtes HTTP pour toutes les afficher.\nMaintenant, il y a une solution alternative, le spriter, qui permet d\u0026rsquo;afficher les 100 images simultanément et en une seule requête. La page en question s\u0026rsquo;affiche donc très rapidement. Les grands sites Internet comme Google, Facebook, Amazon, \u0026hellip; utilisent cette technique.\nVoici par exemple le spriter de Google\noutweb-spriter\nLa solution, c\u0026rsquo;est de réunir toutes les images en une seule grande et de n\u0026rsquo;afficher que la portion dont nous avons besoin grâce au css.\nVoici un exemple simple de spriter\nNous allons utiliser cette image pour afficher seulement une icône à la fois.\nIci, je vous présente un exemple simple d\u0026rsquo;utilisation de spriter. Seulement les quatre icônes sélectionnées sont affichées, elles apparaissent toutes en même temps.\nDifférents sites Internet vous permettent de fusionner et de récupérer les coordonnées des icônes dans le spriter : Spritemapper , spritegen ou spritecow\n","permalink":"https://outweb.eu/2011/07/27/spriter/","summary":"\u003cp\u003ePour faire suite à l\u0026rsquo;article sur l\u0026rsquo;optimisation, voici comment gagner du temps sur le chargement des images de vos pages web.\u003c/p\u003e\n\u003cp\u003eEn général, les développeurs débutants, ou peu soucieux du temps de chargement de la page, utilisent un nombre conséquent d\u0026rsquo;images différentes. Chaque image est donc téléchargée une à une lors de l\u0026rsquo;affichage de la page web. Donc s\u0026rsquo;il y a 100 images sur la page il faudra 100 requêtes HTTP pour toutes les afficher.\u003c/p\u003e","title":"Spriter"},{"content":"Quand vous souhaitez donner des informations à la volée, vous utilisez sûrement l\u0026rsquo;attribut title sur vos liens. Cependant, le rendu ne sera pas le même d\u0026rsquo;un navigateur à l\u0026rsquo;autre. De plus, les infos bulles basiques du navigateur ou du système d\u0026rsquo;exploitation sont rarement belles. Mais grâce au plugin JQuery tipTip vous allez pouvoir mettre en place des tooltips élégants. TipTip est fourni avec un CSS par défaut noir, mais libre à vous de le changer car il n\u0026rsquo;est pas très complexe.\nPour l\u0026rsquo;utiliser c\u0026rsquo;est très simple, pour le mot où vous souhaitez ajouter un tooltip il faut faire :\n\u0026lt;a class=\u0026#34;tiptip\u0026#34; href=\u0026#34;#\u0026#34; title=\u0026#34;message tooltip\u0026#34;\u0026gt;mot\u0026lt;/a\u0026gt; Et côté JavaScript, vous avez juste à faire appel au plugin sur votre classe tipTip :\n$(function(){ $(\u0026#34;.tiptip\u0026#34;).tipTip(); }); Voici un exemple en images, avec un contenu assez long dans la tooltip :\n","permalink":"https://outweb.eu/2011/07/26/des-tooltips-elegantes-avec-tiptip/","summary":"\u003cp\u003eQuand vous souhaitez donner des informations à la volée, vous utilisez sûrement l\u0026rsquo;attribut title sur vos liens. Cependant, le rendu ne sera pas le même d\u0026rsquo;un navigateur à l\u0026rsquo;autre. De plus, les infos bulles basiques du navigateur ou du système d\u0026rsquo;exploitation sont rarement belles. Mais grâce au plugin JQuery \u003ca href=\"https://github.com/drewwilson/TipTip\"\u003etipTip\u003c/a\u003e vous allez pouvoir mettre en place des tooltips élégants. TipTip est fourni avec un CSS par défaut noir, mais libre à vous de le changer car il n\u0026rsquo;est pas très complexe.\u003c/p\u003e","title":"Des tooltips élégants avec tipTip"},{"content":"Vous souhaitez mettre en place un système d\u0026rsquo;avatar sur votre site Internet, et vous souhaitez que l\u0026rsquo;utilisateur puisse envoyer sa photo, puis puisse la recadrer selon son désir ? Le problème réside dans la détection du visage. Comment faire pour pré-cadrer le ou les visages ?\nFace Detection est un plugin JQuery qui vous permettra de récupérer les coordonnées des visages présents sur la photo, et ainsi permettre de recadrer celle-ci.\nVous trouverez à la page Face Detection un exemple, sur une image de bonne taille et contenant deux visages de face.\nEncore une fois, l\u0026rsquo;utilisation est très simple, il vous suffit, après avoir inclu les fichiers javascript, de faire un appel de cette manière :\nvar coords = $(\u0026#39;#myPicture\u0026#39;).faceDetection(); Après cet appel, la variable coords contient (comme son nom l\u0026rsquo;indique) les coordonnées des visages qui ont été détectés sous le format suivant :\nx: coordonnée X du visage y: coordonnée Y du visage width: largeur du visage height: hauteur du visage positionX: positon en x par rapport à document positionY: positon en y par rapport à document offsetX: positon en x par rapport à parent offsetY: positon en y par rapport à parent Voici le résultat obtenu sur une image après avoir fait appel au plugin, ici les coordonnées sont utilisées pour dessiner un rectangle autour de la tête :\nEn combinant ceci à Système de tag d’images avec JQuery image annotate on pourrait obtenir un tag d\u0026rsquo;images avancé, détectant les visages et vous proposant d\u0026rsquo;y mettre un nom.\n","permalink":"https://outweb.eu/2011/07/24/detecter-des-visages-avec-jquery/","summary":"\u003cp\u003eVous souhaitez mettre en place un système d\u0026rsquo;avatar sur votre site Internet, et vous souhaitez que l\u0026rsquo;utilisateur puisse envoyer sa photo, puis puisse la recadrer selon son désir ? Le problème réside dans la détection du visage. Comment faire pour pré-cadrer le ou les visages ?\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/jaysalvat/jquery.facedetection\"\u003eFace Detection\u003c/a\u003e est un plugin JQuery qui vous permettra de récupérer les coordonnées des visages présents sur la photo, et ainsi permettre de recadrer celle-ci.\u003c/p\u003e","title":"Détecter des visages avec JQuery"},{"content":"Si vous avez une mise à jour à faire qui risque de provoquer des erreurs, de type 404 ou autre, pendant le temps de la mise en place, il vaux mieux afficher une page d\u0026rsquo;avertissement expliquant brièvement la situation à l\u0026rsquo;utilisateur.\nGrâce au plugin JQuery lwtCountdown, vous pouvez très simplement ajouter un compte à rebours propre et animé, afin d\u0026rsquo;éviter la page toute simple et moche. Bien sûr, il vous faudra connaître au préalable la date de retour en ligne. Pensez à prévoir toujours un peu plus que nécessaire. :)\nVoici un exemple de page faite avec lwtCountdown :\nPour lancer le compte à rebours à partir d\u0026rsquo;une date, il vous suffit de faire appel au plugin de la manière suivante :\njQuery(document).ready(function() { $(\u0026#39;#countdown_dashboard\u0026#39;).countDown({ targetDate: { \u0026#39;day\u0026#39;: 21, \u0026#39;month\u0026#39;: 12, \u0026#39;year\u0026#39;: 2012, \u0026#39;hour\u0026#39;: 11, \u0026#39;min\u0026#39;: 0, \u0026#39;sec\u0026#39;: 0 } }); }); Quand la date butoir est atteinte, le compteur reste à 0, pas de chiffre négatif comme on peut parfois le voir.\n","permalink":"https://outweb.eu/2011/07/22/modele-de-page-en-maintenance/","summary":"\u003cp\u003eSi vous avez une mise à jour à faire qui risque de provoquer des erreurs, de type 404 ou autre, pendant le temps de la mise en place, il vaux mieux afficher une page d\u0026rsquo;avertissement expliquant brièvement la situation à l\u0026rsquo;utilisateur.\u003c/p\u003e\n\u003cp\u003eGrâce au plugin JQuery \u003ca href=\"https://github.com/winwinfantasy/jquery-lwtcountdown\"\u003elwtCountdown\u003c/a\u003e, vous pouvez très simplement ajouter un compte à rebours propre et animé, afin d\u0026rsquo;éviter la page toute simple et moche. Bien sûr, il vous faudra connaître au préalable la date de retour en ligne. Pensez à prévoir toujours un peu plus que nécessaire. :)\u003c/p\u003e","title":"Modèle de page \"en maintenance\""},{"content":"Comme vous le savez, le HTML5 est assez récent et donc pas encore pris en charge par tous les navigateurs. Cependant, il permet de faire des choses assez intéressantes sans y passer des heures, et le code est plus ordonné. Bref, je ne vais pas faire la présentation complète de HTML5, ce n\u0026rsquo;est pas le sujet de cet article. Mais voilà, même si le HTML5 a l\u0026rsquo;air génial, on ne peut pas l\u0026rsquo;utiliser tant que l\u0026rsquo;on n\u0026rsquo;est pas sûr que l\u0026rsquo;utilisateur pourra avoir le résultat voulu.\nC\u0026rsquo;est pourquoi beaucoup de développeurs attendent pour se lancer dans cette aventure.\nMais voilà HTML5Replace , qui est un script JQuery vous permet, par sa simple inclusion dans votre page, de détecter la prise en charge ou non du HTML5, et en cas de non prise en charge de remplacer les balises HTML5 par du HTML normal.\nAfin de pouvoir adapter simplement votre css, les balises \u0026lt;header\u0026gt;, par exemple, sont remplacées par \u0026lt;div class=\u0026ldquo;header\u0026rdquo;\u0026gt;. De même pour toutes les autres balises HTML5.\nVoilà de quoi encourager les réticents à se lancer dans l\u0026rsquo;aventure du HTML5, et enfin contribuer encore un peu plus à la fin du Flash :p\n","permalink":"https://outweb.eu/2011/07/20/rendre-votre-html5-compatible-sur-tous-les-navigateurs/","summary":"\u003cp\u003eComme vous le savez, le HTML5 est assez récent et donc pas encore pris en charge par tous les navigateurs. Cependant, il permet de faire des choses assez intéressantes sans y passer des heures, et le code est plus ordonné. Bref, je ne vais pas faire la présentation complète de HTML5, ce n\u0026rsquo;est pas le sujet de cet article. Mais voilà, même si le HTML5 a l\u0026rsquo;air génial, on ne peut pas l\u0026rsquo;utiliser tant que l\u0026rsquo;on n\u0026rsquo;est pas sûr que l\u0026rsquo;utilisateur pourra avoir le résultat voulu.\u003c/p\u003e","title":"Rendre votre HTML5 compatible sur tous les navigateurs"},{"content":"Vous trouvez que vos menus select sont trop simples ? Le plugin JQuery DropKick vous permet de faire des menus déroulants élégants sans perdre de temps à changer le css, et à travailler sur la compatibilité.\nSi les thèmes par défaut ne vous conviennent pas, vous avez la possibilité de vous faire le vôtre assez simplement.\nDe tels plugins rendent plus attirants des formulaires qui d\u0026rsquo;habitude rebutent un peu les utilisateurs.\nVoici un exemple de menu réalisé avec ce plugin :\nVous admettrez que le style de base est plus que correct, ce qui change des menus déroulants basiques présents sur beaucoup de sites Internet.\n","permalink":"https://outweb.eu/2011/07/18/personnaliser-vos-menu-deroulant-avec-dropkick/","summary":"\u003cp\u003eVous trouvez que vos menus select sont trop simples ? Le plugin JQuery \u003ca href=\"http://dropkickjs.com/\"\u003eDropKick\u003c/a\u003e vous permet de faire des menus déroulants élégants sans perdre de temps à changer le css, et à travailler sur la compatibilité.\u003c/p\u003e\n\u003cp\u003eSi les thèmes par défaut ne vous conviennent pas, vous avez la possibilité de vous faire le vôtre assez simplement.\u003c/p\u003e\n\u003cp\u003eDe tels plugins rendent plus attirants des formulaires qui d\u0026rsquo;habitude rebutent un peu les utilisateurs.\u003c/p\u003e","title":"Personnaliser vos menus déroulants avec DropKick"},{"content":" Sur Internet, faire un lien d\u0026rsquo;une page A vers une ressource B, c\u0026rsquo;est y faire référence et donc référencer la ressource B depuis la page A. Par vulgarisation, l\u0026rsquo;action générique d\u0026rsquo;inscription dans les moteurs de recherche s\u0026rsquo;est vue appelée référencement. Aujourd\u0026rsquo;hui sa pratique s\u0026rsquo;articule autour des outils de recherche, plus particulièrement des moteurs et des annuaires de recherche, en tentant d\u0026rsquo;améliorer le positionnement d\u0026rsquo;un site (et donc sa visibilité) dans leurs pages de résultats.\nWikipédia, Référencement\nLes moteurs de recherche Si vous venez de mettre en ligne un nouveau site Internet, il va falloir le soumettre aux moteurs de recherche afin qu\u0026rsquo;il sache que vous êtes là. Sinon, cela risque de prendre du temps.\nVoici comment faire :\nProposer votre site Internet aux principaux moteurs de recherche lors de sa mise en ligne : Google, Bing, Yahoo Mettre en place un sitemap à la racine de votre site, vous pouvez utiliser un générateur pour le créer Rendez-vous sur Google webmaster tool pour le soumettre, il permettra une indexation plus simple pour le bot et donc plus rapide. Au passage, cet outil est une mine d\u0026rsquo;informations, il vous indique toutes les pages où le bot à rencontré des erreurs d\u0026rsquo;exploration, votre positionnement dans les recherches Google selon les mots clés saisis\u0026hellip; Après le post d\u0026rsquo;un article ou d\u0026rsquo;une nouvelle page, envoyez un ping vers les moteurs de recherche afin qu\u0026rsquo;ils viennent faire un tour sur la nouvelle page. Des outils comme pingomatic permettent de le faire rapidement Le référencement naturel En théorie le référencement naturel est une chose simple, il suffit d\u0026rsquo;être patient. Cependant il existe un certain nombre de techniques permettant d\u0026rsquo;augmenter la rapidité du référencement naturel. Le référencement naturel se fait par l\u0026rsquo;exploration de votre site Internet par des bots. Les bots sont bêtes et méchants, ils suivent les liens pour trouver d\u0026rsquo;autres pages à explorer. Voici quelques points qui leurs permettent d\u0026rsquo;explorer rapidement tout votre site Internet.\nUn site qui bénéficiera d\u0026rsquo;un bon référencement est un site où pratiquement toutes les pages sont accessibles depuis la page d\u0026rsquo;accueil. Par conséquent, utilisez votre footer comme usine à liens internes. Si vous avez un blog, ajoutez un nuage de tags, et faites des liens entre vos articles. Les balises méta ne sont pas à négliger, elles sont encore très aimées des robots.\nVous pouvez utiliser un générateur si vous ne connaissez pas exactement quelles balises existent. A savoir que la balise meta description doit changer pour chaque page de votre site, elle décrit la page et non le site. Il y a quelques bonnes pratiques à respecter côté HTML pour aider à votre référencement : Un title différent par page, ni trop long, ni trop court Une balise h1 par page L\u0026rsquo;attribut ALT pour les images est indispensable Les 100 premiers mots de votre contenu doivent contenir les mots clefs importants de votre page, car c\u0026rsquo;est en moyenne la partie visible sans scroll. Les URLs sont un point central du référencement, c\u0026rsquo;est la fin des URLs du type http://domaine.com/index.php?page=1533, Il vaut mieux travailler avec des URIs segment, du type /category/optimisation/. Le référencement manuel Nous allons parler ici des techniques qui existent pour avoir des backlinks (le nerf de la guerre en référencement). Un backlink c\u0026rsquo;est un lien vers votre site depuis un autre site. Pour en obtenir il y a plusieurs méthodes ; la plus simple est d\u0026rsquo;attendre que notre contenu soit remarqué par d\u0026rsquo;autres personnes et qu\u0026rsquo;il partage le lien vers la page, ou de le faire par nous-mêmes :p.\nLes réseaux sociaux Les réseaux sociaux attirent énormément de monde et ce sont de très bons backlinkers. Il faut donc à chaque nouvelle publication (pour un blog) ou chaque mise à jour (pour les autres) poster sur un maximum de réseaux le lien vers la page en question. Les réseaux les plus simples à utiliser sont Twitter, Facebook, Digg, Delicious, Identi.ca\u0026hellip; L\u0026rsquo;idéal est de pouvoir poster partout en une seule fois, pour cela il faut regarder du côté de onlywire par exemple.\nLes forums Rendez-vous sur des forums traitant de la même thématique que la vôtre et trouvez, s\u0026rsquo;il y en a une, une partie présentation. Maintenant, rien de plus simple, vous allez créer un topic/ une discussion pour présenter votre site Internet, pensez à mettre 4 ou 5 liens vers différentes pages de celui-ci. (accueil, nouveautés, RSS, contact). En plus du référencement, vous allez attirer quelques visiteurs.\nPensez à mettre une bannière dans votre signature, comme cela à chaque post vous vous faites un peu de publicité.\nLes annuaires Contrairement à la croyance populaire, les annuaires ne sont plus à la joie. Google, par exemple, n\u0026rsquo;aime pas tomber sur ce type de page car il y a trop de liens pour peu de contenu. Evitez donc la plupart des annuaires de mauvaise qualité. Mieux vaux éviter les mauvais backlinks.\nLes commentaires Rendez-vous sur les sites ayant une bonne notoriété et traitant d\u0026rsquo;un thème proche du vôtre.\nRendez-vous section commentaire. Et là c\u0026rsquo;est un peu plus technique, il va falloir regarder dans le code source si les liens vers les sites persos des personnes qui ont commenté ont un attribut rel différent de nofollow. Si c\u0026rsquo;est le cas, à chaque post, vous obtiendrez un backlink de qualité. Le but n\u0026rsquo;est pas de spammer le site, mais juste de se faire quelques liens vers son site.\nLe partenariat Le partenariat, ou échange de liens, est un système gagnant-gagnant ou chacune des deux parties met sur son site, un lien ou une bannière vers l\u0026rsquo;autre site. L\u0026rsquo;idéal est dans une sidebarre, car elle est visible des utilisateurs. Le plus dur est de trouver des partenaires ayant un référencement au moins aussi bon que le vôtre.\nBien sûr si vous utilisez un CMS beaucoup de ces techniques seront déjà intégrées dedans ou des extensions sont disponibles pour le faire simplement.\n","permalink":"https://outweb.eu/2011/07/15/ameliorer-le-referencement-dun-site-internet/","summary":"\u003cblockquote\u003e\n\u003cp\u003eSur Internet, faire un lien d\u0026rsquo;une page A vers une ressource B, c\u0026rsquo;est y faire référence et donc référencer la ressource B depuis la page A. Par vulgarisation, l\u0026rsquo;action générique d\u0026rsquo;inscription dans les moteurs de recherche s\u0026rsquo;est vue appelée référencement. Aujourd\u0026rsquo;hui sa pratique s\u0026rsquo;articule autour des outils de recherche, plus particulièrement des moteurs et des annuaires de recherche, en tentant d\u0026rsquo;améliorer le positionnement d\u0026rsquo;un site (et donc sa visibilité) dans leurs pages de résultats.\u003c/p\u003e","title":"Améliorer le référencement d'un site Internet"},{"content":"AutoResize est un plugin JQuery qui permet de faire un textarea extensible en fonction du contenu, comme le fait actuellement Facebook pour les commentaires. Ceci évite les pages de formulaire où un textarea fait 15cm sur 8, le truc pas esthétique quoi\u0026hellip;\nVoici comment appliquer le plugin sur un textarea ayant pour id \u0026ldquo;comment\u0026rdquo;.\nAprès, libre à vous de changer le sélecteur pour l\u0026rsquo;appliquer à tous vos textareas, ou juste à ceux d\u0026rsquo;une classe précise.\n$().ready(function(){ $(\u0026#39;#comment\u0026#39;).autoResize({ // On resize: onResize : function() { $(this).css({opacity:0.8}); }, // After resize: animateCallback : function() { $(this).css({opacity:1}); }, // Quite slow animation: animateDuration : 300, // More extra space: extraSpace : 40 }); }); Vous l\u0026rsquo;aurez compris, ce plugin s\u0026rsquo;adresse aux développeurs soucieux de l\u0026rsquo;ergonomie de leur site Internet et qui en ont marre de voir des barres de scroll apparaître dans leurs textareas.\n","permalink":"https://outweb.eu/2011/07/14/ajuster-la-taille-de-vos-textarea-en-fonction-du-contenu/","summary":"\u003cp\u003e\u003ca href=\"https://amaury.carrade.eu/projects/jquery/autoResize\"\u003eAutoResize\u003c/a\u003e est un plugin JQuery qui permet de faire un textarea extensible en fonction du contenu, comme le fait actuellement Facebook pour les commentaires. Ceci évite les pages de formulaire où un textarea fait 15cm sur 8, le truc pas esthétique quoi\u0026hellip;\u003c/p\u003e\n\u003cp\u003eVoici comment appliquer le plugin sur un textarea ayant pour id \u0026ldquo;comment\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eAprès, libre à vous de changer le sélecteur pour l\u0026rsquo;appliquer à tous vos textareas, ou juste à ceux d\u0026rsquo;une classe précise.\u003c/p\u003e","title":"Ajuster la taille de vos textareas en fonction du contenu"},{"content":"Avez-vous déjà pensé à faire une application mobile, ou une version mobile de votre site Internet ?\nSi oui, vous avez dû vous confronter à des centaines de problèmes de compatibilité entre les navigateurs mobile.\nL\u0026rsquo;article va vous montrer comment faire des pages HTML compatibles sur tous les téléphones et tablettes.\nAfin de bien comprendre l\u0026rsquo;article, il vous faudra connaître les bases du HTML ainsi que JQuery.\nDans un premier temps, il va falloir télécharger la libraire JQuery mobile. Donc rendez-vous à la page suivante : Télécharger.\nCependant, pour la mise en production, je vous conseille d\u0026rsquo;utiliser le code suivant pour inclure JQuery mobile :\n\u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css\u0026#34; /\u0026gt; http://code.jquery.com/jquery-1.6.1.min.js http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js Pourquoi utiliser ceci plutôt qu\u0026rsquo;un version locale ?\nImaginons un utilisateur, qui passe de site en site. Fait à fait, il remplit son cache de scripts et pages en tous genres. S\u0026rsquo;il a déjà été sur un site avec le code précédent, il les a en cache et donc il ne les téléchargera pas. Vous gagnez ainsi de la bande passante et du temps de chargement. :p\nDécouverte Nous allons créer notre première page.\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Outweb\u0026lt;/title\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css\u0026#34; /\u0026gt; http://code.jquery.com/jquery-1.6.1.min.js http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Outweb\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt;Outweb c\u0026#39;est mon site internet.\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; Ceci est l\u0026rsquo;exemple le plus simple qui soit.\nVous remarquerez l\u0026rsquo;utilisation de data-role. C\u0026rsquo;est en effet le point important de JQuery mobile.\nIl permet de dire à JQM (JQuery Mobile) comment il doit traiter le div, et quelles classes il doit lui appliquer.\nUne page visible n\u0026rsquo;est pas, contrairement à une page HTML basique, l\u0026rsquo;ensemble du code HTML, mais seulement le . Cela permet de charger plusieurs pages en une seule fois et donc de naviguer de l\u0026rsquo;une à l\u0026rsquo;autre en toute fluidité.\nPage complexe Comment appliquer un thème à une page ?\nJuste une petite modification à faire.\n\u0026lt;div data-role=\u0026#34;page\u0026#34; data-theme=\u0026#34;b\u0026#34;\u0026gt; Et voila un beau thème bleu style IPhone.\nNous allons maintenant faire une liste. La liste est la structure HTML la plus simple à mettre en place dans JQM, car elle permet d\u0026rsquo;afficher des menus ou des informations même sur des petits écrans.\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Page Title\u0026lt;/title\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css\u0026#34; /\u0026gt; http://code.jquery.com/jquery-1.6.1.min.js http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34; data-theme=\u0026#34;b\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Mon header\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;!-- listview permet de mettre en forme toute la liste --\u0026gt; \u0026lt;ul data-role=\u0026#34;listview\u0026#34;\u0026gt; \u0026lt;!-- Met en place un séparateur dans la liste --\u0026gt; \u0026lt;li data-role=\u0026#39;list-divider\u0026#39; role=\u0026#39;heading\u0026#39; class=\u0026#39;ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top \u0026#39;\u0026gt;\u0026lt;b\u0026gt;Accueil\u0026lt;/b\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;Ma page d\u0026#39;acceuil\u0026#39;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li data-role=\u0026#39;list-divider\u0026#39; role=\u0026#39;heading\u0026#39; class=\u0026#39;ui-li ui-li-divider ui-btn ui-bar-b \u0026#39;\u0026gt;\u0026lt;b\u0026gt;Articles\u0026lt;/b\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/2011/08/08/menu-contextuel-en-javascript/\u0026#34;\u0026gt;Menu contextuel en JavaScript\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li class=\u0026#39; ui-corner-bottom \u0026#39;\u0026gt;\u0026lt;a href=\u0026#34;/index.xml\u0026#34;\u0026gt;Emuler un flux RSS\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34; data-position=\u0026#34;fixed\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; Lien entre les pages Comme je le disais précédemment, vous pouvez mettre plusieurs pages dans un fichier HTML. Voici comment faire le lien entre les pages. Et surtout, si vous le souhaitez, comment mettre des effets de transition entre vos pages.\nPensez à mettre des ids à vos pages, sinon vous ne pourrez pas naviguer entre elles.\n\u0026lt;!DOCTYPE html\u0026gt; \u0026lt;html\u0026gt; \u0026lt;head\u0026gt; \u0026lt;title\u0026gt;Page Title\u0026lt;/title\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.css\u0026#34; /\u0026gt; http://code.jquery.com/jquery-1.6.1.min.js http://code.jquery.com/mobile/1.0b1/jquery.mobile-1.0b1.min.js \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34; data-theme=\u0026#34;b\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Mon header\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt; \u0026lt;ul data-role=\u0026#34;listview\u0026#34;\u0026gt; \u0026lt;li data-role=\u0026#39;list-divider\u0026#39; role=\u0026#39;heading\u0026#39; class=\u0026#39;ui-li ui-li-divider ui-btn ui-bar-b ui-corner-top \u0026#39;\u0026gt;\u0026lt;b\u0026gt;Popup\u0026lt;/b\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;!-- data-transition permet de définir l\u0026#39;effet de transition. Les trois disponibles sont présenté ici --\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;#page2\u0026#34; data-transition=\u0026#34;pop\u0026#34;\u0026gt;Voire la page 2\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;#page3\u0026#34; data-transition=\u0026#34;slidedown\u0026#34;\u0026gt;Voire la page 3\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;#page4\u0026#34; data-transition=\u0026#34;flip\u0026#34;\u0026gt;Voire la page 4\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li data-role=\u0026#39;list-divider\u0026#39; role=\u0026#39;heading\u0026#39; class=\u0026#39;ui-li ui-li-divider ui-btn ui-bar-b \u0026#39;\u0026gt;\u0026lt;b\u0026gt;Accueil\u0026lt;/b\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/\u0026#34;\u0026gt;Ma page d\u0026#39;accueil\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li data-role=\u0026#39;list-divider\u0026#39; role=\u0026#39;heading\u0026#39; class=\u0026#39;ui-li ui-li-divider ui-btn ui-bar-b \u0026#39;\u0026gt;\u0026lt;b\u0026gt;Articles\u0026lt;/b\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li\u0026gt;\u0026lt;a href=\u0026#34;/2011/08/08/menu-contextuel-en-javascript/\u0026#34;\u0026gt;Menu contextuel en JavaScript\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li class=\u0026#39; ui-corner-bottom \u0026#39;\u0026gt;\u0026lt;a href=\u0026#34;/index.xml\u0026#34;\u0026gt;Emuler un flux RSS\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34; data-position=\u0026#34;fixed\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;!-- Les autres pages avec des autres thèmes (oui c\u0026#39;est horrible mais c\u0026#39;est une démo)--\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34; id=\u0026#34;page2\u0026#34; data-theme=\u0026#34;a\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Mon header\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt;Ceci est la page 2 (pop) \u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34; data-position=\u0026#34;fixed\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34; id=\u0026#34;page3\u0026#34; data-theme=\u0026#34;c\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Mon header\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt;Ceci est la page 3 (slide)\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34; data-position=\u0026#34;fixed\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;page\u0026#34; id=\u0026#34;page4\u0026#34; data-theme=\u0026#34;e\u0026#34;\u0026gt; \u0026lt;div data-role=\u0026#34;header\u0026#34;\u0026gt;Mon header\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;content\u0026#34;\u0026gt;Ceci est la page 4 (flip)\u0026lt;/div\u0026gt; \u0026lt;div data-role=\u0026#34;footer\u0026#34; data-position=\u0026#34;fixed\u0026#34;\u0026gt;Mon footer\u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; Voilà vous avez maintenant toutes les informations pour mettre en place une version mobile de votre site Internet. Si vous voulez plus de documentation, je vous recommande la documentation officielle qui vient d\u0026rsquo;être refaite, suite à la sortie de la version beta de JQM.\nComme vous avez pu le voir, JQuery Mobile est un outil performant, novateur et surtout libre. Alors profitez-en !\n","permalink":"https://outweb.eu/2011/07/12/creer-un-site-internet-pour-mobile-avec-jquery-mobile/","summary":"\u003cp\u003eAvez-vous déjà pensé à faire une application mobile, ou une version mobile de votre site Internet ?\u003cbr\u003e\nSi oui, vous avez dû vous confronter à des centaines de problèmes de compatibilité entre les navigateurs mobile.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;article va vous montrer comment faire des pages HTML compatibles sur tous les téléphones et tablettes.\u003c/p\u003e\n\u003cp\u003eAfin de bien comprendre l\u0026rsquo;article, il vous faudra connaître les bases du HTML ainsi que JQuery.\u003c/p\u003e\n\u003cp\u003eDans un premier temps, il va falloir télécharger la libraire JQuery mobile. Donc rendez-vous à la page suivante : \u003ca href=\"https://jquerymobile.com/download/\"\u003eTélécharger\u003c/a\u003e.\u003c/p\u003e","title":"Créer un site Internet pour mobile avec JQuery mobile"},{"content":"Instant Blueprint est un service en ligne qui vous permet en quelques clics de mettre en place une architecture de base pour votre nouveau projet de site Internet. En effet, après avoir renseigné quelques informations, il va vous générer automatiquement le squelette de votre site Internet.\nPour utiliser cet outil, il vous faut renseigner :\nTitre du projet Le doctype désiré Le framework javascript à inclure Comment inclure le framework (local ou distant, compressé ou normal) L\u0026rsquo;extension du fichier index (html, htm, php, asp) Que mettre dans le dossier include (config.php et/ou fonction.php) Centrer ou non le contenu du site Les principales div de la page Voici le squelette généré :\nA partir de ces quelques informations, Instant Blueprint génère le projet et vous propose de le télécharger. Bien entendu, tout reste à faire, mais la partie rébarbative est déjà faite.\nToutefois, il faudra penser à changer le charset par défaut, histoire de le passer en UTF-8 et ainsi se simplifier la vie niveau encodage.\nC\u0026rsquo;est l\u0026rsquo;outil idéal pour les petits projets.\n","permalink":"https://outweb.eu/2011/07/12/commencer-un-petit-site-internet-avec-instant-blueprint/","summary":"\u003cp\u003eInstant Blueprint est un service en ligne qui vous permet en quelques clics de mettre en place une architecture de base pour votre nouveau projet de site Internet. En effet, après avoir renseigné quelques informations, il va vous générer automatiquement le squelette de votre site Internet.\u003c/p\u003e\n\u003cp\u003ePour utiliser cet outil, il vous faut renseigner :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTitre du projet\u003c/li\u003e\n\u003cli\u003eLe doctype désiré\u003c/li\u003e\n\u003cli\u003eLe framework javascript à inclure\u003c/li\u003e\n\u003cli\u003eComment inclure le framework (local ou distant, compressé ou normal)\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;extension du fichier index (html, htm, php, asp)\u003c/li\u003e\n\u003cli\u003eQue mettre dans le dossier include (config.php et/ou fonction.php)\u003c/li\u003e\n\u003cli\u003eCentrer ou non le contenu du site\u003c/li\u003e\n\u003cli\u003eLes principales div de la page\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoici le squelette généré :\u003c/p\u003e","title":"Commencer un petit site Internet avec Instant Blueprint"},{"content":"Google vient de mettre en ligne la nouvelle mouture de son réseau social Google+.\nTrès peu de personnes ont eu des invitations, cependant, j\u0026rsquo;ai eu la chance d\u0026rsquo;en faire partie.\nJ\u0026rsquo;apprécie tout particulièrement la gestion de la confidentialité de nos informations et les cercles de confidentialité en un simple clic.\nEn effet, on peut décider de divulguer un statut, une image ou une information personnelle à un ou plusieurs cercles. Les autres ne le verront pas. L\u0026rsquo;avantage c\u0026rsquo;est que l\u0026rsquo;on peut choisir au cas par cas.\nComme l\u0026rsquo;indique très bien Google sur le réseau social :\nNote importante à propos de la version test de l\u0026rsquo;application -Vous faites partie d\u0026rsquo;un petit groupe de personnes qui testent Google+. Lorsque vous partagez un contenu avec des personnes qui ne sont pas encore en mesure d\u0026rsquo;utiliser Google+, ces dernières le reçoive par e-mail, mais ne peuvent pas le commenter ni l\u0026rsquo;utiliser comme les autres utilisateurs de Google+. Elles pourront rejoindre Google+ à mesure que nous accepterons davantage d\u0026rsquo;utilisateurs.\nPar conséquent une fois l\u0026rsquo;invitation envoyée il faudra attendre que Google décide d\u0026rsquo;accepter de nouveaux utilisateurs pour les utiliser. Mais étant donné la bonne avancée du projet et l\u0026rsquo;absence de bogues importants, je pense que les invitations seront validées dans les 48h maxi.\nComme je fais partie des privilégiés à avoir un compte, je peux inviter quelques personnes sur Google+.\n150 invitations à google plus disponible\n","permalink":"https://outweb.eu/2011/07/11/invitation-google/","summary":"\u003cp\u003eGoogle vient de mettre en ligne la nouvelle mouture de son réseau social Google+.\u003c/p\u003e\n\u003cp\u003eTrès peu de personnes ont eu des invitations, cependant, j\u0026rsquo;ai eu la chance d\u0026rsquo;en faire partie.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;apprécie tout particulièrement la gestion de la confidentialité de nos informations et les cercles de confidentialité en un simple clic.\u003c/p\u003e\n\u003cp\u003eEn effet, on peut décider de divulguer un statut, une image ou une information personnelle à un ou plusieurs cercles. Les autres ne le verront pas. L\u0026rsquo;avantage c\u0026rsquo;est que l\u0026rsquo;on peut choisir au cas par cas.\u003c/p\u003e","title":"Google plus invitation"},{"content":"Quicksand est un plugin JQuery qui peut être utile pour l\u0026rsquo;affichage un peu travaillé d\u0026rsquo;une liste d\u0026rsquo;images ou sur une boutique en ligne.\nLe plugin vous permet de trier et filtrer des listes (d\u0026rsquo;images par exemple) selon des critères, le tout avec des effets de transition à la JQuery. Le résultat est assez agréable pour l\u0026rsquo;utilisateur mais il ne faut pas en abuser car cela peut vite devenir lourd.\nPour l\u0026rsquo;appliquer à une liste vous pouvez utiliser le code suivant :\nCôté JavaScript :\n$(\u0026#39;.button\u0026#39;).click(function(e) { $(\u0026#39;.all\u0026#39;).quicksand( $(\u0026#39;.warm li\u0026#39;), { duration: 1000, attribute: \u0026#39;id\u0026#39; }); e.preventDefault(); }); Côté HTML\n\u0026lt;p\u0026gt;\u0026lt;a class=\u0026#34;button\u0026#34; href=\u0026#34;#\u0026#34;\u0026gt;Test\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;ul class=\u0026#34;colors all\u0026#34;\u0026gt; \u0026lt;li id=\u0026#34;c463033\u0026#34; style=\u0026#34;background: #463033\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c77343d\u0026#34; style=\u0026#34;background: #77343d\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;ce83f2f\u0026#34; style=\u0026#34;background: #e83f2f\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cffc223\u0026#34; style=\u0026#34;background: #ffc223\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cffdb59\u0026#34; style=\u0026#34;background: #ffdb59\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c788b6f\u0026#34; style=\u0026#34;background: #788b6f\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c486a5e\u0026#34; style=\u0026#34;background: #486a5e\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c289539\u0026#34; style=\u0026#34;background: #289539\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c174876\u0026#34; style=\u0026#34;background: #174876\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; \u0026lt;ul class=\u0026#34;colors warm\u0026#34;\u0026gt; \u0026lt;li id=\u0026#34;c62164e\u0026#34; style=\u0026#34;background: #62164e\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;c86286e\u0026#34; style=\u0026#34;background: #86286e\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cda79c2\u0026#34; style=\u0026#34;background: #da79c2\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;ce83f2f\u0026#34; style=\u0026#34;background: #e83f2f\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cf39079\u0026#34; style=\u0026#34;background: #f39079\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cffc223\u0026#34; style=\u0026#34;background: #ffc223\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cffdb59\u0026#34; style=\u0026#34;background: #ffdb59\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;li id=\u0026#34;cf2c478\u0026#34; style=\u0026#34;background: #f2c478\u0026#34;\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;/ul\u0026gt; Il ne faut pas oublier de \u0026ldquo;binder\u0026rdquo; un bouton pour lancer le tri.\n","permalink":"https://outweb.eu/2011/07/06/listes-triees-et-animees-avec-quicksand/","summary":"\u003cp\u003e\u003ca href=\"https://razorjack.net/quicksand/\"\u003eQuicksand\u003c/a\u003e est un plugin JQuery qui peut être utile pour l\u0026rsquo;affichage un peu travaillé d\u0026rsquo;une liste d\u0026rsquo;images ou sur une boutique en ligne.\u003cbr\u003e\nLe plugin vous permet de trier et filtrer des listes (d\u0026rsquo;images par exemple) selon des critères, le tout avec des effets de transition à la JQuery. Le résultat est assez agréable pour l\u0026rsquo;utilisateur mais il ne faut pas en abuser car cela peut vite devenir lourd.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;appliquer à une liste vous pouvez utiliser le code suivant :\u003c/p\u003e","title":"Listes triées et animées avec Quicksand"},{"content":"Vous en avez marre de devoir faire des designs pour des versions non mises à jour de navigateur ? Oui, moi aussi. Alors insérez le plugin UpgradeBrowsers dans votre site Internet, dans votre page d\u0026rsquo;accueil par exemple. Le plugin indiquera simplement à l\u0026rsquo;utilisateur que son navigateur n\u0026rsquo;est pas à jour en l\u0026rsquo;invitant à le mettre à jour. Les autres utilisateurs ne se douteront même pas de la présence du plugin sur votre site.\nVoici les quelques lignes de code à insérer dans votre page pour mettre en place le plugin, avant la fermeture du body.\nhttp://upgradebrowsers.com/upgradebrowsers_v01/jquery.upgradebrowsers.min.js En cas de navigateur non mis à jour voici le résultat affiché en haut de votre page :\nPensez-y, pour nous simplifier la vie.\n","permalink":"https://outweb.eu/2011/07/04/aider-les-webmasters-avec-upgradebrowsers/","summary":"\u003cp\u003eVous en avez marre de devoir faire des designs pour des versions non mises à jour de navigateur ? Oui, moi aussi. Alors insérez le plugin UpgradeBrowsers dans votre site Internet, dans votre page d\u0026rsquo;accueil par exemple. Le plugin indiquera simplement à l\u0026rsquo;utilisateur que son navigateur n\u0026rsquo;est pas à jour en l\u0026rsquo;invitant à le mettre à jour. Les autres utilisateurs ne se douteront même pas de la présence du plugin sur votre site.\u003cbr\u003e\nVoici les quelques lignes de code à insérer dans votre page pour mettre en place le plugin, avant la fermeture du body.\u003c/p\u003e","title":"Aider les webmasters avec UpgradeBrowsers"},{"content":"Cloud Zoom est un plugin JQuery qui permet de faire simplement des zooms sur des images. En plus de son style soigné, il propose plusieurs types de zooms, selon l\u0026rsquo;intégration que vous voulez faire de celui-ci.\nVoici l\u0026rsquo;exemple le plus basique, mais aussi le plus commun :\nEt pour metttre en place cet effet, il vous suffit d\u0026rsquo;inclure le fichier javascript cloud-zoom.1.0.2.js (dans le dossier images).\nPuis pour chacune des images où vous voulez ajouter un zoom, vous devez définir les paramètres pour le zoom :\n\u0026lt;div class=\u0026#34;zoom-small-image\u0026#34;\u0026gt; \u0026lt;a href=\u0026#39;grosseimage.jpg\u0026#39; class = \u0026#39;cloud-zoom\u0026#39; rel=\u0026#34;position: \u0026#39;inside\u0026#39; , showTitle: false, adjustX:-4, adjustY:-4\u0026#34;\u0026gt; \u0026lt;img src=\u0026#34;petiteimage.jpg\u0026#34; title=\u0026#34;Message\u0026#34; alt=\u0026#39;\u0026#39;/\u0026gt;\u0026lt;/a\u0026gt; \u0026lt;/div\u0026gt; ","permalink":"https://outweb.eu/2011/07/03/zoomer-sur-des-images-avec-cloud-zoom/","summary":"\u003cp\u003e\u003ca href=\"http://www.amazingthings.in/2011/07/cloud-zoom-jquery-image-zoom-plugin.html\"\u003eCloud Zoom\u003c/a\u003e est un plugin JQuery qui permet de faire simplement des zooms sur des images. En plus de son style soigné, il propose plusieurs types de zooms, selon l\u0026rsquo;intégration que vous voulez faire de celui-ci.\u003c/p\u003e\n\u003cp\u003eVoici l\u0026rsquo;exemple le plus basique, mais aussi le plus commun :\u003c/p\u003e\n\u003cp\u003eEt pour metttre en place cet effet, il vous suffit d\u0026rsquo;inclure le fichier javascript cloud-zoom.1.0.2.js (dans le dossier images).\u003c/p\u003e\n\u003cp\u003ePuis pour chacune des images où vous voulez ajouter un zoom, vous devez définir les paramètres pour le zoom :\u003c/p\u003e","title":"Zoomer sur des images avec Cloud Zoom"},{"content":"Le Latex est à mis chemin entre le langage de programmation et le traitement de texte. Il permet de rédiger des documents officiels sans avoir à mettre en forme manuellement le texte. En effet, avec de simples instructions, on peut ajouter des paragraphes, des titres ou des chapitres avec une mise en forme automatique.\nLe point fort de Latex est qu\u0026rsquo;il permet d’insérer des formules mathématiques complexes.\nC\u0026rsquo;est d\u0026rsquo;ailleurs pour cela que la plupart des mathématiciens l\u0026rsquo;utilisent régulièrement dans leurs articles ou leurs rapports.\nTout ceci est très intéressant, mais comment faire pour insérer une telle formule mathématique dans une page HTML ?\nEh bien, jusqu’à présent on écrivait nos formules en Latex puis on faisait une capture d\u0026rsquo;écran\u0026hellip;\nMais la librairie mathjax vous permet, à partir de votre code Latex, d\u0026rsquo;afficher en HTML votre formule comme vous l\u0026rsquo;auriez eue sur un document pdf.\nVous pourrez trouver une démonstration complète de cette librairie à l\u0026rsquo;adresse suivante http://www.mathjax.org/demos/tex-samples/.\nJe trouve le résultat assez impressionnant !\nVoici une image montrant la qualité du résultat obtenu.\n","permalink":"https://outweb.eu/2011/07/01/convertir-des-formules-latex-en-html/","summary":"\u003cp\u003eLe Latex est à mis chemin entre le langage de programmation et le traitement de texte. Il permet de rédiger des documents officiels sans avoir à mettre en forme manuellement le texte. En effet, avec de simples instructions, on peut ajouter des paragraphes, des titres ou des chapitres avec une mise en forme automatique.\u003c/p\u003e\n\u003cp\u003eLe point fort de Latex est qu\u0026rsquo;il permet d’insérer des formules mathématiques complexes.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est d\u0026rsquo;ailleurs pour cela que la plupart des mathématiciens l\u0026rsquo;utilisent régulièrement dans leurs articles ou leurs rapports.\u003c/p\u003e","title":"Convertir des formules Latex en HTML"},{"content":"Si vous avez déjà développé un chat, un livre d\u0026rsquo;or ou tout autre type de moyen de feedback, vous avez été confronté au problème de l\u0026rsquo;affichage de la date de publication du message. Comment faire pour qu\u0026rsquo;elle soit affichée sans avoir une date classique et barbante comme : 29/06/2011 15h26 mais plutôt quelque chose du style : \u0026ldquo;il y a moins d\u0026rsquo;une minute\u0026rdquo;, comme le font Twitter ou Facebook par exemple ?\nOn imagine déjà du parsage, des algos\u0026hellip;\nEh bien en fait oui, mais pas besoin de le faire vous-mêmes, timeago peut le faire à votre place.\nOn pourra apprécier la simplicité d\u0026rsquo;utilisation du plugin, pour un résultat assez simple mais correct.\nVoici l\u0026rsquo;utilisation la plus utile que l\u0026rsquo;on peut faire du plugin.\n\u0026lt;html\u0026gt; \u0026lt;head\u0026gt; http://jquery.min.js http://timeago.js \u0026lt;script\u0026gt; $(document).ready(function() { jQuery(\u0026#34;abbr.timeago\u0026#34;).timeago(); }); \u0026lt;/script\u0026gt; \u0026lt;/head\u0026gt; \u0026lt;body\u0026gt; \u0026lt;abbr class=\u0026#34;timeago\u0026#34; title=\u0026#34;July 17, 2008\u0026#34;\u0026gt;2 years ago\u0026lt;/abbr\u0026gt; \u0026lt;br/\u0026gt; \u0026lt;abbr class=\u0026#34;timeago\u0026#34; title=\u0026#34;2011-06-17\u0026#34;\u0026gt;2 years ago\u0026lt;/abbr\u0026gt; \u0026lt;br/\u0026gt; \u0026lt;abbr class=\u0026#34;timeago\u0026#34; title=\u0026#34;2011-01-17T09:24:17Z\u0026#34;\u0026gt;2 years ago\u0026lt;/abbr\u0026gt; \u0026lt;hr/\u0026gt; \u0026lt;/body\u0026gt; \u0026lt;/html\u0026gt; Le résultat obtenu (aujourd\u0026rsquo;hui) est le suivant :\nIl y a 2 ans Il y a 12 jours Il y a 5 mois Vous remarquerez au passage l\u0026rsquo;utilisation de différents types de format de date.\nAfin d\u0026rsquo;avoir le résultat en français j\u0026rsquo;ai traduit les quelques mots clés contenu dans la librairie. L\u0026rsquo;archive que je propose contient donc la version française.\nLa petite particularité est l\u0026rsquo;option :\njQuery.timeago.settings.allowFuture = true; Qui permet de faire une sorte de décompte pour un évènement. Je n\u0026rsquo;ai pas encore trouvé d\u0026rsquo;application pertinente mais il y a de l\u0026rsquo;idée :P\n","permalink":"https://outweb.eu/2011/06/30/calcul-de-temps-a-la-facebook-ou-twitter/","summary":"\u003cp\u003eSi vous avez déjà développé un chat, un livre d\u0026rsquo;or ou tout autre type de moyen de feedback, vous avez été confronté au problème de l\u0026rsquo;affichage de la date de publication du message. Comment faire pour qu\u0026rsquo;elle soit affichée sans avoir une date classique et barbante comme : 29/06/2011 15h26 mais plutôt quelque chose du style : \u0026ldquo;il y a moins d\u0026rsquo;une minute\u0026rdquo;, comme le font Twitter ou Facebook par exemple ?\u003c/p\u003e","title":"Calcul de temps à la Facebook ou Twitter"},{"content":"Si d\u0026rsquo;une manière ou d\u0026rsquo;une autre vous êtes amené à partager un espace d\u0026rsquo;échange de fichiers avec plusieurs personnes via une interface web, mais que vous n\u0026rsquo;avez pas envie d\u0026rsquo;avoir la simple vue \u0026ldquo;Index of\u0026rdquo; par défaut, voici un projet très complet de gestion de documents en ligne.\nElFinder permet de parcourir les dossiers à partir d\u0026rsquo;un racine bien définie (coté PHP ou Python), de télécharger, de visualiser et de modifier des fichiers distants sans avoir à les télécharger pour la plupart.\nPlusieurs modes sont disponibles : dans une \u0026ldquo;fenêtre\u0026rdquo; simulée à l\u0026rsquo;aide de JQuery UI par le biais d\u0026rsquo;un widget, ou le mode classique. Par conséquent, vous l\u0026rsquo;aurez compris, le plugin nécessite d\u0026rsquo;utiliser JQuery UI en plus de JQuery.\nElFinder permet une gestion des droits que l\u0026rsquo;on attribue aux utilisateurs anonymes par le biais d\u0026rsquo;un fichier de configuration PHP ou Python ( connector.php ou connector.py). Vous trouverez toutes les informations relatives aux options sur le site de elFinder. Pour ce type de plugin mieux vaux être sûr de sa config, à mon avis même si les risques se limitent aux fichiers présents dans le dossier file/ (qui peut être positionné n\u0026rsquo;importe où).\nExemple Démo\nJ\u0026rsquo;ai volontairement retiré les droits d\u0026rsquo;écriture et de suppression à tout le monde pour éviter les mauvaises surprises. Si vous ne voulez plus avoir cette limitation il vous suffit de télécharger l\u0026rsquo;archive et de la décompresser dans votre serveur web.\nVoici un aperçu rapide de l\u0026rsquo;interface de l\u0026rsquo;application une fois qu\u0026rsquo;il y a quelques fichiers dedans :\n","permalink":"https://outweb.eu/2011/06/28/gestionnaire-de-fichiers-en-ligne-elfinder/","summary":"\u003cp\u003eSi d\u0026rsquo;une manière ou d\u0026rsquo;une autre vous êtes amené à partager un espace d\u0026rsquo;échange de fichiers avec plusieurs personnes via une interface web, mais que vous n\u0026rsquo;avez pas envie d\u0026rsquo;avoir la simple vue \u0026ldquo;Index of\u0026rdquo; par défaut, voici un projet très complet de gestion de documents en ligne.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Studio-42/elFinder\"\u003eElFinder\u003c/a\u003e permet de parcourir les dossiers à partir d\u0026rsquo;un racine bien définie (coté PHP ou Python), de télécharger, de visualiser et de modifier des fichiers distants sans avoir à les télécharger pour la plupart.\u003c/p\u003e","title":"Gestionnaire de fichiers en ligne : elFinder"},{"content":"Modialog est un plugin JQuery qui permet de faire des popups \u0026ldquo;à la twitter\u0026rdquo; (la transparence en moins) très simplement.\nN\u0026rsquo;importe quel évènement peut être le déclencheur (click ou mouseover par exemple). La popup peut contenir tous types de contenus images, boutons, formulaire\u0026hellip;\nOn pourrait très bien imaginer y mettre un formulaire de contact par exemple.\nLe style de base de la popup est soigné et très sobre à la fois, il peut donc s\u0026rsquo;adapter à beaucoup de designs, mais s\u0026rsquo;il ne vous convient pas, vous avez la liberté de le changer et/ou de l\u0026rsquo;améliorer simplement.\nVoici un exemple basique d\u0026rsquo;utilisation de la librairie :\n\u0026lt;p\u0026gt; \u0026lt;a id=\u0026#34;open0\u0026#34; href=\u0026#34;#\u0026#34;\u0026gt;Hello world \u0026lt;/a\u0026gt; \u0026lt;div id=\u0026#34;dialog0\u0026#34; class=\u0026#34;dialog\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;content\u0026#34;\u0026gt;Hello world! \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/p\u0026gt; \u0026lt;script\u0026gt; var $dlg0 = $(\u0026#39;#dialog0\u0026#39;); $dlg0.modialog(); $(\u0026#39;#open0\u0026#39;).click(function() { $dlg0.modialog(\u0026#39;open\u0026#39;); return false; }); \u0026lt;/script\u0026gt; Si vous souhaitez un exemple un peu plus complet : Demo\nVoici des exemples en images du rendu de base. Tout en sachant que je n\u0026rsquo;ai pas du tout personnalisé le CSS. Imaginez-les avec le CSS de votre site Internet :P\nIl s\u0026rsquo;agit donc ici d\u0026rsquo;un plugin qui va très vite s\u0026rsquo;imposer dans mes applications web.\n","permalink":"https://outweb.eu/2011/06/27/fenetres-de-dialogue-javascript-avec-modialog/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/claudioc/modialog\"\u003eModialog\u003c/a\u003e est un plugin JQuery qui permet de faire des popups \u0026ldquo;à la twitter\u0026rdquo; (la transparence en moins) très simplement.\u003cbr\u003e\nN\u0026rsquo;importe quel évènement peut être le déclencheur (click ou mouseover par exemple). La popup peut contenir tous types de contenus images, boutons, formulaire\u0026hellip;\u003cbr\u003e\nOn pourrait très bien imaginer y mettre un formulaire de contact par exemple.\u003c/p\u003e\n\u003cp\u003eLe style de base de la popup est soigné et très sobre à la fois, il peut donc s\u0026rsquo;adapter à beaucoup de designs, mais s\u0026rsquo;il ne vous convient pas, vous avez la liberté de le changer et/ou de l\u0026rsquo;améliorer simplement.\u003c/p\u003e","title":"Fenêtres de dialogue JavaScript avec Modialog"},{"content":"Le code QR est un code-barres à deux dimensions.\nDestiné à être lu par un lecteur de code-barres QR ou un smartphone, il a l\u0026rsquo;avantage de pouvoir stocker plus d\u0026rsquo;informations qu\u0026rsquo;un code à barres simple , et surtout des données directement reconnues par des applications. Ainsi le QR permet par exemple d\u0026rsquo;ouvrir un navigateur à une page prédéfinie, de lancer une application ou encore décoder un message. JQuery Qrcode est un plugin JQuery qui permet de générer des code QR simplement.\n\u0026lt;div id=\u0026#39;monQrCode\u0026#39;\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;script\u0026gt;$(\u0026#39;#monQrCode\u0026#39;).qrcode(\u0026#34;http://www.blog.lahaxe.fr\u0026#34;);\u0026lt;/script\u0026gt; Et voici le résultat obtenu :\nVous pouvez consulter la démo en ligne.\n","permalink":"https://outweb.eu/2011/06/24/generer-qrcode-avec-jquery/","summary":"\u003cp\u003eLe code QR est un code-barres à deux dimensions.\u003cbr\u003e\nDestiné à être lu par un lecteur de code-barres QR ou un smartphone, il a l\u0026rsquo;avantage de pouvoir stocker plus d\u0026rsquo;informations qu\u0026rsquo;un code à barres simple , et surtout des données directement reconnues par des applications. Ainsi le QR permet par exemple d\u0026rsquo;ouvrir un navigateur à une page prédéfinie, de lancer une application ou encore décoder un message. \u003ca href=\"http://jeromeetienne.github.com/jquery-qrcode/\"\u003eJQuery Qrcode\u003c/a\u003e est un plugin JQuery qui permet de générer des code QR simplement.\u003c/p\u003e","title":"Générer QRCODE avec JQuery"},{"content":"Tous les développeurs qui ont déjà travaillé sur des sites Internet qui doivent être visibles depuis plusieurs types de supports (comme une tablette ou un smartphone) ont déjà eu le problème des lignes de textes qui se superposent quand la résolution devient trop petite. fitText est justement pensé pour ne plus avoir ce type de problème.\nIl sait adapter la taille de la police en fonction de la résolution de l\u0026rsquo;écran. Un peu comme le fait JQuery mobile.\nPour l\u0026rsquo;utiliser, après avoir inclus le plugin dans votre code il vous suffit de faire un simple appel javascript.\n$(\u0026#34;#monElement\u0026#34;).fitText(0.8); monElement doit avoir une largeur extensible : exprimé en % afin que le plugin fonctionne. Ici 0,8 est le taux d\u0026rsquo;agressivité de la police.\nfitText va très vite devenir un plugin indispensable à tout site Internet.\nEt voila, adieu les problèmes de superposition de texte !\n","permalink":"https://outweb.eu/2011/06/24/adapter-sa-taille-de-police-a-la-resolution-avec-fittext/","summary":"\u003cp\u003eTous les développeurs qui ont déjà travaillé sur des sites Internet qui doivent être visibles depuis plusieurs types de supports (comme une tablette ou un smartphone) ont déjà eu le problème des lignes de textes qui se superposent quand la résolution devient trop petite. \u003ca href=\"http://fittextjs.com/\"\u003efitText\u003c/a\u003e est justement pensé pour ne plus avoir ce type de problème.\u003c/p\u003e\n\u003cp\u003eIl sait adapter la taille de la police en fonction de la résolution de l\u0026rsquo;écran. Un peu comme le fait JQuery mobile.\u003c/p\u003e","title":"Adapter sa taille de police à la résolution avec fitText"},{"content":"Google tient maintenant compte de la vitesse de chargement des pages pour leur moteur de recherche. Les pages rapides ont tendances remonter dans la liste des résultats, tandis que les autres se perdent dans les fins fonds des listes de résultats\u0026hellip; :P\nTout d\u0026rsquo;abord, revenons aux fondamentaux. Une page web c\u0026rsquo;est un texte structuré qui est compris et afficher d\u0026rsquo;une certaine manière par notre navigateur. Le visiteur demande une page, par le biais de requête HTTP et le serveur construit la page et l\u0026rsquo;envoie au client.\nOn remarque que nous pouvons agir sur la construction de la page, en optimisant nos codes PHP, JSP ou autre et sur le temps de transfert de la page au client.\nEn effet le temps de transfert de la page et dépend entre autre taille de celle-ci, donc au nombre de caractères qu\u0026rsquo;elle contient. Nous allons donc mener une chasse aux caractères :P\nMinification de code Pour réduire la taille de nos pages nous pouvons minifier nos codes CSS et JavaScript ( faites une sauvegarde avant). Pour cela nous pouvons utiliser le minifieur de css suivant. Celui-ci enlèvera tous les commentaires et les retours la ligne. Ceux-ci ne sont utiles qu\u0026rsquo;aux développeurs. De mme pour le JavaScript grâce au compresseur JavaScript/ (cocher Shrink variables, mais pas base62 encode).\nEn moyenne, nous avons gagner 40 50% sur la taille de nos fichiers tout en ayant le mme comportement.\nRegroupement du code Afin de limiter le nombre d\u0026rsquo;accès des fichiers différents pour afficher une page, il est préférable, dans la limite du possible de limiter le nombre de fichier JavaScript et CSS quitte avoir de plus gros fichiers.\nLes images Tout d\u0026rsquo;abord, il ne faut jamais redimensionner une image lors de son affichage. Ceci ralentit le temps d\u0026rsquo;affichage et peu nuire la qualité de celle-ci. Il vaut mieux stocker l\u0026rsquo;image sous la taille voulue, quitte la stocker plusieurs fois sous plusieurs tailles différentes.\nPour toutes les images que vous utilisez plusieurs fois par pages, le mieux est de créer une classe CSS du type :\n.icone-nomimage{ background:url(images/monimage.png) center right no-repeat; padding:0 16px 0 0; white-space:nowrap; } Pour appliquer l\u0026rsquo;icone votre span, div ,a il suffit de lui ajouter la classe css icone-nomimage.\nContrairement la balise img le css ne chargera qu\u0026rsquo;une seule fois l\u0026rsquo;image depuis le fichier, par conséquent tous les éléments de la classe icone-nomimage verront leur image s\u0026rsquo;afficher au mme moment et non les un aprs les autres.\nAu niveau de l\u0026rsquo;interface graphique, de plus en plus d\u0026rsquo;images sont utilises. Le rendu est beau mais plus lent charger. Le logiciel suivant : caesium/ (uniquement pour windows pour le moment) permet de les compresser jusqu\u0026rsquo;à 80% sans perte visible de qualité. Méfiance toutefois sur la gestion de la transparence.\nVoici un exemple sur une photographie :\nLe gain sur une interface complète peut être assez intéressant.\nEt enfin voici une des nouvelles librairies donc nous avons parlé en début d\u0026rsquo;article.\njQuery image Preloader Plus Callbacks est un plugin JQuery qui permet de faire du pres-caching des images de l\u0026rsquo;application. Son fonctionnement est simple comprendre; Une fois que le visiteur a entièrement chargé la page qu\u0026rsquo;il visite on va commencer charger les images présentes sur les autres pages du site sans les afficher. Cette action permet de mettre les images dans le cache du navigateur et de les afficher instantanément quand le visiteur en aura besoin. Pour les images hors css il faut préciser lesquelles on veux charger, pour celle du css une fonction permet de toutes les charger.\nChargement différé du JavaScript Lors du chargement d\u0026rsquo;une page web les fichiers javascript sont chargés en mme temps que le code HTML, dans l\u0026rsquo;ordre d\u0026rsquo;apparition. Par conséquent si vous avez énormément de code JavaScript dans votre header la page va rester blanche pendant un petit moment. La librairie Head js permet de pallier au problème en chargeant le JavaScript en différé, comme une image. Cela permet d\u0026rsquo;afficher la page avec le style css, et donc de faire croire l\u0026rsquo;utilisateur que le site est prêt, alors qu\u0026rsquo;il ne le sera réellement que quelques secondes aprs. (mentir c\u0026rsquo;est mal :P)\nVous pourrez la tester par vous mme l\u0026rsquo;adresse suivante http://headjs.com/test/script.html. Pour avoir des résultats concluant actualisez en faisant ctrl+F5 (vide le cache avant d\u0026rsquo;actualiser).\nCompression des pages la volée Afin de gagner encore un peu sur la taille de vos pages web, si vous utilisez PHP vous pouvez ajouter au début de votre/vos point(s) d\u0026rsquo;entre la ligne suivante :\nob_start(\u0026#34;ob_gzhandler\u0026#34;); Ceci permet de compresser entre 15 et 30% votre page web. Malheureusement IE 6 sous windows XP SP1 ne comprendra rien, mais bon comme le support est fini on peut imaginer qu\u0026rsquo;il tend disparaitre\n","permalink":"https://outweb.eu/2011/06/10/optimisation-de-pages-web/","summary":"\u003cp\u003eGoogle tient maintenant compte de la vitesse de chargement des pages pour leur moteur de recherche. Les pages rapides ont tendances remonter dans la liste des résultats, tandis que les autres se perdent dans les fins fonds des listes de résultats\u0026hellip; :P\u003c/p\u003e\n\u003cp\u003eTout d\u0026rsquo;abord, revenons aux fondamentaux. Une page web c\u0026rsquo;est un texte structuré qui est compris et afficher d\u0026rsquo;une certaine manière par notre navigateur. Le visiteur demande une page, par le biais de requête HTTP et le serveur construit la page et l\u0026rsquo;envoie au client.\u003cbr\u003e\nOn remarque que nous pouvons agir sur la construction de la page, en optimisant nos codes PHP, JSP ou autre et sur le temps de transfert de la page au client.\u003cbr\u003e\nEn effet le temps de transfert de la page et dépend entre autre taille de celle-ci, donc au nombre de caractères qu\u0026rsquo;elle contient. Nous allons donc mener une chasse aux caractères :P\u003c/p\u003e","title":"Optimisation de pages web"},{"content":"Avec Codigniter vous pouvez mettre en place simplement un système de pagination pour afficher vos informations par paquets. Tout cela sans se prendre la tête et se noyer dans des dizaines de lignes de code.\nNous allons créer la base de donnée de l\u0026rsquo;article : Installation et Configuration de CodeIgniter .\nDans un premier temps il créer le model. Pour cela nous allons utiliser la classe active record de CodeIgniter.\nclass model extends CI_Model { function __construct() { // Call the Model constructor parent::__construct(); } public function getAll($debut=0) { return $this-\u0026gt;db-\u0026gt;select(\u0026#39;*\u0026#39;)-\u0026gt;from(\u0026#39;message\u0026#39;)-\u0026gt;order_by(\u0026#34;id\u0026#34;, \u0026#34;desc\u0026#34;)-\u0026gt;limit(30, $debut)-\u0026gt;get()-\u0026gt;result(); } public function count($where = array()) { return (int) $this-\u0026gt;db-\u0026gt;where($where)-\u0026gt;count_all_results(\u0026#39;message\u0026#39;); } } Puis nous allons créer notre contrôleur.\ndefined(\u0026#39;BASEPATH\u0026#39;) OR exit(\u0026#39;No direct script access allowed\u0026#39;); class controleur extends MY_Controller { function liste($nb=0) { $messages = array(); $this-\u0026gt;load-\u0026gt;model(\u0026#39;model\u0026#39;); $this-\u0026gt;load-\u0026gt;library(\u0026#39;pagination\u0026#39;); $config[\u0026#39;base_url\u0026#39;] = base_url() . \u0026#34;/index.php/controleur/liste/\u0026#34;; $config[\u0026#39;total_rows\u0026#39;] = $this-\u0026gt;model-\u0026gt;count(); $config[\u0026#39;per_page\u0026#39;] = \u0026#39;30\u0026#39;; $config[\u0026#39;uri_segment\u0026#39;] = 3; $config[\u0026#39;num_links\u0026#39;] = 5; $config[\u0026#39;full_tag_open\u0026#39;] = \u0026#39;\u0026lt;div class=\u0026#34;pagination\u0026#34;\u0026gt;\u0026#39;; $config[\u0026#39;full_tag_close\u0026#39;] = \u0026#34;\u0026lt;/div\u0026gt;\u0026#34;; $config[\u0026#39;cur_tag_open\u0026#39;] = \u0026#39;\u0026lt;span class=\u0026#34;current\u0026#34;\u0026gt;\u0026#39;; $config[\u0026#39;cur_tag_close\u0026#39;] = \u0026#39;\u0026lt;/span\u0026gt;\u0026#39;; $config[\u0026#39;next_tag_open\u0026#39;] = $config[\u0026#39;prev_tag_open\u0026#39;] = \u0026#39;\u0026lt;span class=\u0026#34;disabled\u0026#34;\u0026gt;\u0026#39;; $config[\u0026#39;next_tag_close\u0026#39;] = $config[\u0026#39;prev_tag_close\u0026#39;] = \u0026#34;\u0026lt;/span\u0026gt;\u0026#34;; $this-\u0026gt;pagination-\u0026gt;initialize($config); $data[\u0026#39;pages\u0026#39;] = $this-\u0026gt;pagination-\u0026gt;create_links(); $data[\u0026#39;messages\u0026#39;] = $this-\u0026gt;model-\u0026gt;getAll($nb); $this-\u0026gt;load-\u0026gt;view(\u0026#34;liste_message\u0026#34;,$data); } } Dans le fichier de vue :\n// A vous de mettre en page vos messages var_dump($messages); // pour afficher vos lien de paginations echo $pages; Vous aurez un beau système de pagination. Si jamais vous devez toujours passer des paramètres en plus à votre contrôleur vous devez changer quelques lignes :\nfunction liste($param1,$param2,$nb=0) { ... $config[\u0026#39;base_url\u0026#39;] = base_url() . \u0026#34;/index.php/controlleur/liste/$param1/$param2/\u0026#34;; // ajout des params ... $config[\u0026#39;uri_segment\u0026#39;] = 5; // 3+ le nombre de param ... } ","permalink":"https://outweb.eu/2011/06/08/systeme-de-pagination-sous-codeigniter/","summary":"\u003cp\u003eAvec Codigniter vous pouvez mettre en place simplement un système de pagination pour afficher vos informations par paquets. Tout cela sans se prendre la tête et se noyer dans des dizaines de lignes de code.\u003c/p\u003e\n\u003cp\u003eNous allons créer la base de donnée de l\u0026rsquo;article : \u003ca href=\"/2011/06/04/installation-et-configuration-de-codeigniter/\"\u003eInstallation et Configuration de CodeIgniter\u003c/a\u003e .\u003c/p\u003e\n\u003cp\u003eDans un premier temps il créer le model. Pour cela nous allons utiliser la classe active record de CodeIgniter.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e model \u003cspan style=\"color:#66d9ef\"\u003eextends\u003c/span\u003e CI_Model {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    function __construct()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e Call the Model constructor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        parent::__construct();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     public function getAll(\u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003edebut\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003ethis\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003edb\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eselect(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003efrom(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;message\u0026#39;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eorder_by(\u003cspan style=\"color:#e6db74\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;desc\u0026#34;\u003c/span\u003e)\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003elimit(\u003cspan style=\"color:#ae81ff\"\u003e30\u003c/span\u003e, \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003edebut)\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eget()\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003eresult();\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tpublic function count(\u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003ewhere \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e array()) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e (\u003cspan style=\"color:#a6e22e\"\u003eint\u003c/span\u003e) \u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003ethis\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003edb\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ewhere(\u003cspan style=\"color:#f92672\"\u003e$\u003c/span\u003ewhere)\u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003ecount_all_results(\u003cspan style=\"color:#e6db74\"\u003e\u0026#39;message\u0026#39;\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis nous allons créer notre contrôleur.\u003c/p\u003e","title":"Système de pagination sous CodeIgniter"},{"content":"Pré requis Un serveur Apache ( lamp, wamp, easy php, mamp, \u0026hellip; ) Un SGBD mysql La Base de données Dans un premier temps voici un exemple de petite base de données. Par exemple la base de données suivante\nCREATE DATABASE `tuto` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; USE `tuto`; CREATE TABLE IF NOT EXISTS `message` ( `id` int(8) NOT NULL AUTO_INCREMENT, `sujet` varchar(255) NOT NULL, `message` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; Maintenant que la base est prête nous alors configurer CodeIgniter pour qu\u0026rsquo;il puisse s\u0026rsquo;y connecter.\nRendez-vous dans le fichier : application/config/database.php\n$db[\u0026#39;default\u0026#39;][\u0026#39;hostname\u0026#39;] = \u0026#39;localhost\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;username\u0026#39;] = \u0026#39;VOTRE LOGIN MYSQL\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;password\u0026#39;] = \u0026#39;VOTRE MOT DE PASSE MYSQL\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;database\u0026#39;] = \u0026#39;tuto\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;dbdriver\u0026#39;] = \u0026#39;mysql\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;dbprefix\u0026#39;] = \u0026#39;\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;pconnect\u0026#39;] = TRUE; $db[\u0026#39;default\u0026#39;][\u0026#39;db_debug\u0026#39;] = TRUE; // à passer à FALSE une fois le dev fini $db[\u0026#39;default\u0026#39;][\u0026#39;cache_on\u0026#39;] = FALSE; $db[\u0026#39;default\u0026#39;][\u0026#39;cachedir\u0026#39;] = \u0026#39;\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;char_set\u0026#39;] = \u0026#39;utf8\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;dbcollat\u0026#39;] = \u0026#39;utf8_general_ci\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;swap_pre\u0026#39;] = \u0026#39;\u0026#39;; $db[\u0026#39;default\u0026#39;][\u0026#39;autoinit\u0026#39;] = TRUE; $db[\u0026#39;default\u0026#39;][\u0026#39;stricton\u0026#39;] = FALSE; Maintenant le framework peut en théorie se connecter à votre base.\nLes configurations systèmes Pour un fonctionnement optimal de CodeIgniter il y a plusieurs configurations à faire. Pour les config suivantes rendez-vous dans le fichier /application/config/config.php. Et là beaucoup de choses à changer.\n//ligne 17 $config[\u0026#39;base_url\u0026#39;]\t= \u0026#39;http://localhost/outweb/\u0026#39;; //ligne 60 $config[\u0026#39;url_suffix\u0026#39;] = \u0026#39;.html\u0026#39;; //ligne 72 $config[\u0026#39;language\u0026#39;]\t= \u0026#39;french\u0026#39;; // si vous changez cette valeur il faudra aller chercher les traduction, si vous avez la flemmes ne faites rien ici //ligne 227 $config[\u0026#39;encryption_key\u0026#39;] = \u0026#39;UN TRUC BIEN COMPLIQUE AVEC DES 1233 ET des !#?$_-éà@\u0026#39;; //ligne 282 $config[\u0026#39;global_xss_filtering\u0026#39;] = TRUE; D\u0026rsquo;autres paramètres de sécurité sont disponibles mais je les expliquerai dans un autre post.\nLes autoloads Codeigniter permet l\u0026rsquo;utilisation de librairies, helpers, et de fichiers de config perso. On peut charger dans le code directement chacun des fichiers de configuration de l\u0026rsquo;application mais certains d\u0026rsquo;entre eux sont indispensables sur chacunes de nos pages. Autant dire à CodeIgniter de les charger automatiquement. Voici selon moi le minimum indipensable.\n$autoload[\u0026#39;libraries\u0026#39;] = array(\u0026#34;session\u0026#34;); $autoload[\u0026#39;helper\u0026#39;] = array(\u0026#34;url\u0026#34;,\u0026#34;database\u0026#34;); Téléchargement Dans un premier temps il va falloir télécharger le fameux framework. Le mieux étant de prendre la dernière mouture. Téléchargement du framework. Dezipper l\u0026rsquo;archive et copier le dossier qui est dedans à la racine de votre répertoire www. Pour plus de simplicité nous allons le renommer outweb. Supprimer le dossier user_guide qui contient une copie de la documentation en ligne de CodeIgniter.\nConfiguration Il y a trois grandes parties à configurer dans CodeIgniter :\nUne fois les quelques configs précédentes effectuées votre CodeIgniter est prêt. Si vous vous rendez à l\u0026rsquo;adresse http://localhost/outweb/ vous aurez le message de bienvenue de CodeIgniter\nNous allons donc pouvoir commencer notre application.\nComme vous le savez surement CodeIgniter est basé sur un model MVC. Par conséquent il est préfèrable de garder cette approche tout au long du développement.\n","permalink":"https://outweb.eu/2011/06/04/installation-et-configuration-de-codeigniter/","summary":"\u003ch2 id=\"pré-requis\"\u003ePré requis\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUn serveur Apache ( lamp, wamp, easy php, mamp, \u0026hellip; )\u003c/li\u003e\n\u003cli\u003eUn SGBD mysql\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"la-base-de-données\"\u003eLa Base de données\u003c/h2\u003e\n\u003cp\u003eDans un premier temps voici un exemple de petite base de données. Par exemple la base de données suivante\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eDATABASE\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003etuto\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eCHARACTER\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eSET\u003c/span\u003e latin1 \u003cspan style=\"color:#66d9ef\"\u003eCOLLATE\u003c/span\u003e latin1_swedish_ci;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eUSE\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003etuto\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eCREATE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eTABLE\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eIF\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eEXISTS\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003emessage\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eid\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eint\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e8\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNULL\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eAUTO_INCREMENT\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003esujet\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003evarchar\u003c/span\u003e(\u003cspan style=\"color:#ae81ff\"\u003e255\u003c/span\u003e) \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003emessage\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003etext\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNOT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eNULL\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003ePRIMARY\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eKEY\u003c/span\u003e (\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003eid\u003cspan style=\"color:#f92672\"\u003e`\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e) \u003cspan style=\"color:#66d9ef\"\u003eENGINE\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003eMyISAM \u003cspan style=\"color:#66d9ef\"\u003eDEFAULT\u003c/span\u003e \u003cspan style=\"color:#66d9ef\"\u003eCHARSET\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003elatin1 \u003cspan style=\"color:#66d9ef\"\u003eAUTO_INCREMENT\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e ;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMaintenant que la base est prête nous alors configurer CodeIgniter pour qu\u0026rsquo;il puisse s\u0026rsquo;y connecter.\u003c/p\u003e\n\u003cp\u003eRendez-vous dans le fichier : application/config/database.php\u003c/p\u003e","title":"Installation et Configuration de CodeIgniter"},{"content":"Peity est un petit plugin JQuery ( 2ko ) qui permet de réaliser des graphiques sous forme de fromages, de lignes, ou de simplement barres .\nAprès avoir inclus votre fichier javascript dans votre page après JQuery, vous pouvez générer vos graphiques.\nPour un graphique en barre :\nDans votre code HTML : 5,3,9,6,5,9,7,3,5,2 Dans le span vous avez toutes les valeurs de votre graphique Dans votre code Javascript : $(\u0026quot;.bar\u0026quot;).peity(\u0026ldquo;bar\u0026rdquo;); Voici le type de graphique obtenu :\nA savoir que pour chaque type de graphique des options comme width, height ou radius permettent d\u0026rsquo;ajuster la taille des graphiques à vos attentes.\nSi vous êtes un habitué à JQuery cette syntaxe ne vous choquera pas sinon reportez-vous à la page suivante pour voir les sélecteurs possibles en JQuery : Liste des selecteurs\n","permalink":"https://outweb.eu/2011/06/02/peity/","summary":"Faites vos graphiques avec JQuery","title":"Peity"}]