John Osher : les startup qui coulent : 17 erreurs classiques

John Osher a développé des centaines de produits consommateurs.

Parmi ceux-ci on y trouve une brosse à dent électrique qui est devenue la plus grosse vente de brosse à dents de toute l’Amérique en quinze mois. Il a aussi crée quelques compagnies qui ont bien réussi, par exemple les jouets Cap. Le total des ventes annuelles s’élevait à 125 millions de dollars par an. C’est à ce moment qu’il a vendu la compagnie à Hasbro Inc. en 1997. Mais sa contribution la plus durable a sûrement été les quelques mots qu’il a jeté sur un bout de papier.

Je voulais faire une compagnie qui ne ferait aucune de ces erreurs

« Après avoir vendu l’entreprise à Hasbro, j’ai décidé de faire une liste de tout ce que j’avais mal fait – et d’autres entrepreneurs étaient eux aussi en train de faire ce genre d’erreurs », explique l’homme de 57 ans. « Je voulais faire une compagnie qui ne ferait aucune de ces erreurs. Je voulais voir si j’arrivais à monter la compagnie parfaite ».

475 millions de dollars

Il en ressortit une liste informelle des 16 erreurs que les Start-Up font, qui a été étendue à 17. Cette liste est actuellement utilisée dans les écoles de commerce de Harvard Business School pour les études de cas, et a été citée dans beaucoup de publications. Elle est devenue une partie de ce qu’explique notre homme lors de ses nombreuses conférences destinées aux nouveaux entrepreneurs. Il a utilisé cette liste lorsqu’il a sorti la brosse à dent électrique en 1999, pour 5 dollars la brosse, qui est rapidement devenue la brosse la plus vendue. En 2001, Procter & Gamble ont racheté sa compagnie pour la modique somme de 475 millions de dollars.

Nous avons fait le business parfait

« Je ne pensais pas que ça allait se passer comme ça », confie Osher. « Cela ne se reproduira certainement jamais. Mais nous avons fait le business parfait, du début jusqu’à la revente à une autre compagnie. ». Depuis, Osher a tout de même crée un autre produit, un nettoyeur électrique de brosse à dent qu’il a aussi revendu à Procter & Gamble. Et aujourd’hui il développe un produit cosmétique dont il parle peu, mais toujours en suivant ces fameuses directives. Voici les 17 erreurs à éviter.

  1. Échouer parce qu’on ne passe pas assez de temps pour voir si l’idée de business qu’on a est vraiment viable. « C’est vraiment l’erreur la plus importante de toutes. Il disent tous que 9 entrepreneurs sur 10 échouent parce qu’ils ont manqué de capitaux ou embauché les mauvaises personnes. Je dirai que 9 personnes sur 10 échouent parce que leur concept d’origine n’est pas bon. Ils veulent tellement faire du business qu’ils ne font jamais le travail qu’il faut pour prendre de l’avance, et tout est voué à l’échec dès le début. Ils ont beau être très talentueux, et faire tout ce qu’il faudrait comme il faut, ils échouent quand même pour la simple raison que les idées qu’ils ont ne sont pas viables ».
  2. Mauvais calcul de la taille du marché visé, du temps nécessaire, de la facilité d’entrée dans ce marché et de son partage potentiel. « Beaucoup d’entrepreneurs sont très excités par leurs idées, et ne cherchent pas la réalité du marché ni combien de clients leurs idées vont générer. Ils intègrent des projections financières dans leur présentation pour convaincre des investisseurs. Ils disent, par exemple, que « la taille du marché est de 50 millions de gens qui pourraient utiliser ce produit, et si ils en vendent seulement 2% à ces gens, ils en vendront un million ». Seulement 2% c’est gigantesque. La plupart des produits se vendent à bien moins que 1%.
  3. Sous estimer les besoins financiers et le timing. « Ils basent leurs besoins financiers en fonction de l’erreur (1), et ils font l’engagement de tant de place pour le bureau, de tant d’ordinateurs ici, d’embaucher un directeur marketing là, un vice président ici, etc. Avant même qu’ils ne le sachent, en étant basé sur des suppositions de ventes mal estimées, ils ont crée des coûts qui vont nécessiter d’atteindre les objectifs même de ces estimations. Au final, ils n’ont plus d’argent. »
  4. Sur-projeter le volume de ventes et le timing. « Au départ ils ont déjà mal calculé la taille du marché. Maintenant ils surdimensionnent la part de marché qu’ils vont occuper. Ils disent souvent, par exemple : « Il y a 200 millions de maisons, et je dois vendre [nombre] x nombre d’entre elles. ». Si vous regardez de plus près et que vous faites une découpe correcte, il y a en réalité un nombre bien moins important de prospects potentiels. Cela rend leur projections de ventes complètement irréalisables. »
  5. Faire des projections de coût trop basses. « Leurs projections des coûts sont toujours trop basses. En partie parce qu’ils supposent qu’ils vont vendre beaucoup plus que ce qu’il arrivera en réalité. Il y a aussi énormément d’impondérables qui surgissent et rendent les coûts plus élevés que ceux prévus. Par là même, chose encore plus ennuyeuse, leur marge s’en retrouvera réduite d’autant. »
  6. Embaucher trop de gens et passer trop de temps dans les bureaux, et trop de laisser-aller. « Maintenant vous vendez moins, ça vous coûte plus cher que prévu, et il y a bien trop de gens qui n’ont plus rien à faire. Ce sont les choses que vous voyez tous les jours dans les compagnies qui coulent. Et elles sont toutes nées de la même façon : l’erreur (1) : ne pas avoir correctement cherché la viabilité et la faisabilité de la chose. »
  7. Ne pas avoir de plan d’urgence si vous n’atteignez pas vos objectifs. « Même si vous ne vous êtes pas trompé dans vos estimations de départ, il y a toujours des choses inattendues qui arrivent lorsque vous commencez un nouveau business. Vos idées de vente ne seront peut-être pas bonnes ; il peut y avoir des grèves soudaines, etc. Ce ne sont pas les résultats d’une mauvaise planification, mais cela arrive. La plupart du temps, les entrepreneurs pensent que parce qu’ils ont vraiment besoin d’une chose, eh bien elle va arriver. Ils n’ont jamais de plan d’urgence au cas où ces choses n’arriveraient pas dans les délais ou les quantités prévus. »
  8. Amener des partenaires inutiles, ou, tout du moins, pas nécessaires. « Vous avez besoin de certains partenaires, c’est évident. Par exemple, vous avez souvent besoin d’argent, vous aurez donc besoin de partenaires financiers. Mais beaucoup trop souvent, le type qui a la bonne idée se ramène avec tous ses amis, et collègues, et essaie d’en faire des partenaires. Ces gens là n’amènent aucun avantage stratégique et ne garantissent pas, de plus, la pleine possession du produit. A l’inverse, ils vont tous coûter 0,25 € par produit à la compagnie. C’est le genre de chose qu’il faut absolument éviter : c’est une erreur. Le titre de partenaire, c’est toujours quelque chose qui se gagne, et qui se prouve. »
  9. Embaucher plus pour le côté pratique que pour les compétences. « Dans mes deux premières tentatives de business, j’ai embauché de la famille proche. C’était facile, mais c’était une erreur. Ne faites pas ça. Dans la plupart des cas vous verrez que ce ne sont pas les personnes réellement adaptées [pour le boulot donné]. Et c’est très difficile de licencier des gens, d’autant plus s’ils vous sont proches. Il ne faut pas hésiter à passer du temps à chercher les personnes qui ont réellement les compétences requises. Vous avez bien plus besoin d’une personne ultra-compétente, qui peut même réussir à porter différentes casquettes dans son travail. Il n’y a rien de plus déplaisant et déprimant que de licencier des personnes qui n’arrivent pas à s’en sortir avec le travail que vous donnez. »
  10. Négliger de gérer la compagnie comme étant un « tout ». « Cela arrive tout le temps. Ils passent la moitié de leur temps sur ce qui représente 5% de leur business. Vous devez avoir une vue globale de l’intégralité de votre compagnie. Mais bien trop souvent, ils perdent cette vue. Ils s’impliquent dans une partie de l’entreprise, et ne gèrent plus cette dernière dans son intégralité. Si je fais ce produit ou si j’en fais un autre, si j’embauche quelqu’un, ou encore autre chose, j’essaie de m’imaginer ce que tout ça va donner sur du court et du long terme dans mon entreprise. Il faut tout le temps essayer d’avoir cette image. »
  11. Accepter l’idée que « ce n’est pas possible » trop facilement, au lieu de chercher une solution. « J’avais un ingénieur qui était très bon, mais pour chaque jouet que nous développions, il aurait dit « :on ne peut pas le faire ainsi ». Il fallait vraiment que je fasse attention à ne pas accepter ce genre de réponse immédiatement. Il fallait que je voie plus loin. Si vous êtes un entrepreneur, vous allez arriver sur un terrain inconnu. Plein de personnes vont vous dire que « ce n’est pas possible ». Vous ne devez pas accepter une telle réponse aussi facilement. Un bon entrepreneur cherchera une solution. »
  12. Se fixer uniquement sur le volume des ventes et la taille de la compagnie au lieu du profit lui-même. « Une part trop grande de votre gestion est basée sur le volume et la taille. Donc plein d’entrepreneurs veulent pouvoir dire « J’ai une compagnie qui a telle taille, avec tant de personnes, avec une superficie de tant et je fais tant de ventes ». C’est toujours plus facile de mettre en valeur à quelle vitesse vous avez grandi, et le reste, plutôt que de mettre en valeur le profit de la compagnie. Les banquiers et le investisseurs n’aiment pas du tout ça. Les entrepreneurs sont tellement dans leurs idées de création et de construction qu’ils oublient d’apprendre à être un bon gestionnaire (businesspeople). »
  13. Rechercher la confirmation de vos actions plutôt que de chercher la vérité. « Cela arrive souvent : vous voulez faire quelque chose, alors vous en parlez aux gens qui travaillent pour vous. A votre famille et à vos amis. En fait vous recherchez uniquement une confirmation ; vous ne cherchez pas la réalité. Vous recherchez quelqu’un qui va vous dire que vous avez raison. Mais la réalité arrive tôt ou tard. Donc on teste nos produits, et on écoute ce que les testeurs ont à dire. Il faut donner plus de valeur à la vérité qu’aux gens qui disent que ce qu’on fait est bien. »
  14. Manque de clarté/simplicité dans la vision. « Plein d’entrepreneurs vont dans beaucoup trop de directions à la fois et finissent par ne jamais rien faire de bien. Plutôt que de se concentrer à faire quelque chose de correct pour vendre un maximum sur la portion de marché qui rapporte le plus, ils divisent l’attention des employés et leur temps en essayant de faire trop de choses à la fois. Leur produit principal s’en retrouve affecté : il n’est plus correctement produit, parce qu’ils ont trop de choses différentes à faire. Ils ont une idée et ils disent qu’ils vont la vendre à Wal-Mart. Puis une autre idée. Qu’ils vont vendre à Home Shopping Network. Etc. etc. »
  15. Manquer de clairvoyance sur les objectifs à long terme et commerciaux. « Vous devriez avoir une idée de ce qu’est votre objectif à long terme. Cela ne signifie pas que cela ne changera pas, mais lorsque vous encochez une flèche, il vous faut avoir une cible précise. Ce principe ressort souvent lorsque les gens demandent : ‘Comment puis-je choisir un produit ?’ La réponse dépend de ce que vous essayez de faire. Si vous essayez de créer une société d’un milliard de dollars avec ce produit, il risque de ne pas avoir la moindre chance. Mais si vous essayez de faire une entreprise à 5 millions, cela peut fonctionner. Ou si vous essayez de créer une société [où] les membres de la famille peuvent être utilisés, cela peut fonctionner. La clarté de votre objectif de business est très important mais ne fait souvent pas vraiment partie du processus de pensée. »
  16. Manque de mise au point et d’identité. « Cela a été écrit du point de vue de la construction de l’entreprise comme étant une entité précieuse. La société elle-même est aussi un produit. Trop d’entreprises essaient d’aller après trop d’objectifs à la fois et se retrouvent avec un pot-pourri plutôt que d’une entité commerciale ciblée, avec une identité. Lorsque vous essayez de faire des affaires, il est très important de maintenir une orientation et une identité. Ne la laissez pas devenir un pot-pourri, ou elle perd son pouvoir.

    Par exemple, vous pourriez penser ‘Nous vendons déjà à Kmart, nous pourrions tout aussi bien faire un jouet parce Kmart achète des jouets.’. Si vous faites cela, vous affaiblissez votre entreprise. Une entreprise a besoin de se concentrer sur ce qu’elle est. Sa puissance est construite à partir de cela. »

  17. Oubli d’une stratégie de sortie. « Ayez un plan de sortie, et créez votre business pour réussir ce plan. Par exemple, je pense que je pourrais développer ma nouvelle entreprise pendant deux ans, puis en sortir. Je pense qu’il y a une opportunité pour faire une énorme somme d’argent sur deux ans, mais je ne suis pas sûr que ce soit suffisamment protégé pour empêcher la compétition de s’installer. Je suis ainsi dans une stratégie de sortie dans les deux ans, puis on tire le rideau. Je ne vais pas signer des baux à long terme, et après la première année, nous allons commencer à regarder de très près le marché et les stocks. En parallèle, je vais garder l’option de revente au cas où je ne peux pas obtenir quelque chose de plus exclusif. Cela signifie que je ne vais pas signer des accords internationaux qui tueraient toute possibilité de le vendre à une multinationale. Je ferai en sorte que le travail de brevet soit fait correctement. Et je vais essayer de faire en sorte que la fabrication soit aux normes de la multinationale à laquelle que je pourrais essayer de revendre.
    Une autre stratégie de sortie est de donner votre compagnie à vos enfants. La chose la plus importante à faire est de construire une compagnie qui a prend de la valeur et génère du profit de manière à avoir toutes les options qui s’offrent à vous : la garder, la vendre, lever des fonds publiques, lever des fonds privés, etc. Un business peut n’être qu’un seul produit. »

Loi Renseignement : un jour funeste pour la démocratie

« Un peuple prêt à sacrifier un peu de liberté pour un peu de sécurité ne mérite ni l’une ni l’autre, et finit par perdre les deux. »
Benjamin Franklin

Copier coller de zdnet. Que dire de plus ?

Nous sommes le soir du mardi 5 mai, et c’est un jour funeste pour la démocratie. La France s’était autoproclamée « pays des Lumières » parce qu’il y a 250 ans notre pays  éclairait l’Europe et le monde grâce aux travaux philosophiques et politiques de Montesquieu, qui prônait la séparation des pouvoirs, et de Voltaire et Rousseau.

À dater d’aujourd’hui, jour du vote en première lecture du projet de loi sur le renseignement, à cause d’une classe politicienne d’une grande médiocrité, s’enclenche un processus au terme duquel le peuple français va probablement devoir subir une loi dangereuse, qui pourrait s’avérer extrêmement liberticide si elle tombait entre de mauvaises mains, ce qui est sûrement déjà le cas.

Dès lors, à titre préventif et sans préjuger de l’avenir, il me semble important d’apprendre à protéger sa vie privée. Ceci passe par le chiffrement de ses communications, qu’il s’agisse d’échanges sur Internet ou via SMS, et cela peut se faire au moyen de différents outils à la fois efficaces et légaux.

Pour protéger votre identité sur Internet et notamment sur le web, vous pouvez combiner l’utilisation d’un réseau privé virtuel, ou VPN, et de TOR, un système d’anonymisation qui nécessite l’installation d’un logiciel spécifique, TOR
Browser
. Je ne vous donne pas de référence particulière en matière de VPN, car l’offre est pléthorique.

Si vous n’êtes pas geek et ne vous sentez pas capable de maîtriser ces outils sans un minimum d’accompagnement, alors le concept des « cafés Vie Privée » est pour vous : il s’agit tout simplement de se réunir pour apprendre, de la bouche ceux qui savent le faire, comment mettre en œuvre les outils dont je vous ai parlé plus haut afin de protéger sa vie privée de toute intrusion, gouvernementale ou
non.

Tout simplement, il s’agit de passer un après-midi à échanger et à pratiquer la cryptographie. Pour cela sont proposés des ateliers d’une durée minimum de 1 heure, axés autour de la sécurité informatique et de la protection de la vie privée.

Et comme le disent avec humour les organisateurs, « les ateliers sont accessibles à tout type de public, geek et non-geek, chatons, poneys, loutres ou licornes. ». Bref, le « café Vie Privée » est à la protection de la vie privée ce que la réunion Tupperware était à la cuisine 🙂

Il n’y en a pas actuellement dans les Bouches du Rhône, mais une initiative de ce genre serait la bienvenue, n’hésitez pas à laisser un message dans les commentaires si vous avez des informations ou autres.

lua : avantages et inconvénients

Résumé

Je viens de créer ma première application Web en lua.

Pour ceux qui ne savent pas ce que c’est : google est votre ami, mais pour résumer :

Je commence par les inconvénients parce qu’ils sont tellement particuliers qu’il faut les avoir en tête avant d’aller plus loin. Si jamais ça ne vous rebute pas trop, lisez les avantages et ce sera à vous de juger, si, en mettant le tout sur votre balance, ça penche plus vers le positif ou vers le négatif.

En résumé, tous les avantages qui suivent font que, même s’il faut pas mal se débrouiller au début parce qu’il manque beaucoup d’outils « déjà faits », au final le langage est tellement lisible qu’on arrive assez rapidement à se faire ses outils, et en allant un peu plus loin, la maintenance (qui est la chose la plus coûteuse sur les grosses applications) se retrouve améliorée au lieu d’être dégradée. Après, c’est un constat qui n’engage que moi, mais de très grosses applications, notamment nmap tournent d’ores et déjà avec une liste faramineuse de plugins, tous écrits en lua, et facilement compréhensibles.

Inconvénients

Voici les inconvénients de base, qui ne sont pas propres au langage :

  • il faut tout faire soi-même :
    • aucune gestion avancée des fichiers (de base, sans aucun module complémentaire, il ne sait même pas dire si un fichier existe ou pas)
    • côté Web, aucune gestion des sessions
    • côté Web, rien de base en ce qui concerne le json (j’ai plus d’une demi journée à chercher une implémentation entièrement potable de json)

Voici les inconvénients du langage même :

  • Il ne connait pas les classes d’origine, il faut faire un hack pour « simuler » des classes
  • Par conséquence, il n’y a aucune notion d’héritage, à moins de hacker là aussi.
  • Tous les entiers sont des flottants par défaut
  • Aucune possibilité de trace simple. Si on veut remonter dans la pile d’appels, on ne peut sortir qu’une seule ligne (on précise le niveau de la pile)
  • Toutes les variables sont globales par défaut, sauf si on précise systématiquement local
  • La syntaxe permet des horreurs innommables : si jamais on ne passe qu’un seul paramètre, les parenthèses ne sont pas obligatoires, ce qui donne quelque chose de possible comme : mafonction{a=12,b=13}
  • Les séparateurs ne sont pas clairement définis – et c’est volontaire pour permettre plus de liberté, donc on peut écrire ceci : local a = { b=15; c=23 } ou ceci : local a = { b=15, c=23 }. Imaginez le problème… On voit déjà qu’en Php, en laissant un peu de liberté, on arrive à un bazar gigantesque à l’échelle planétaire, je vous raconte même pas ce qu’il est possible de faire ici
  • Les packages en tant que tel n’existent pas, et il faut là aussi faire des bidouilles pour « simuler » des packages
  • Il y a ici aussi, comme en JavaScript, la notion de « closure » afin de pouvoir faire sortir des variables hors d’un contexte d’où elles ne sont pas censées sortir. Certains voient les closures comme un avantage, moi qui ait programmé en C – et un peu en C++ – je vois les closures comme une solution pour pallier à un défaut du langage, en bidouillant.
  • Le signe différent n’existe pas sous la forme classique <> ou encore != mais il s’écrit ainsi : ~=
  • Pour supprimer une variable (unset() en Php), il faut la mettre à nil. Bizarre. Supprimer l’indice 12 : a[12] = nil
  • Attention tenez vous bien j’ai gardé le pire pour la fin : les indices des tableaux commencent à 1. Ce n’est pas une blague. En C, C++, Java, JavaScript, Python, bref, dans tous les langages que je connais, les indices de tableau commencent à 0, et là non, ils commencent à 1. C’est à la limite la seule et unique chose qui me rebute énormément tellement c’est problématique, car, de plus, une des grosses forces mises en avant du lua, c’est le fait qu’il gère extrêmement bien les tables. Oui, mais les indices des tableaux commencent à 1.

Avantages

Je ne sais pas pourquoi, mais lua me plaît. Et je pense que tous les développeurs qui aiment bien ce langage sont un peu comme moi. Il a énormément d’inconvénients, pourtant il des côtés tellement pratiques qu’au final, on l’aime bien. Un peu comme moi (…).

Parmi les avantages que j’apprécie particulièrement :

  • Pas d’accolades ouvrantes / fermantes, mais juste le début d’une déclaration (function, if, ou for), et la fin avec un end. C’est juste plus lisible qu’ouvrir des accolades et fermer des accolades (et croyez moi, je m’y connais bien dans ce domaine !)
  • Les assignations multiples : il est possible d’assigner plusieurs choses en une seule ligne, et ça reste lisible (j’insiste sur ce dernier point : ça reste lisible). Exemple concret : a, b = b, a;. Ce code va inverser les deux valeurs.
  • Même chose que précédemment mais pour les fonctions : elles peuvent renvoyer plusieurs valeurs, et par là même, on peut faire plusieurs assignations et ça reste lisible. Exemple simple : x, y = getCoordonneesJoueur(); ou plus classique handle, error = ouvrirFichier(nomfichier). Avec ce dernier code, si handle vaut nil alors on affiche error qui est rempli.
  • Machine virtuelle : il tourne systématiquement dans une machine virtuelle, ce qui implique par là même une impossibilité technique de défaillance, et c’est vous-même qui précisez, pour les modules qui tourneront, quelles sont les fonctions sont accessibles – ou pas. Si la NASA se sert activement de LUA ce n’est pas pour rien. Ce qui me permet d’enchaîner sur le point suivant.
  • Un des gros intérêts est de pouvoir créer des plugins, les lire et les interpréter, un peu comme en Php, eval(). Comme ces plugins sont dans une machine virtuelle très stable et éprouvée, vous pouvez mettre en place un système de plugins très performant, efficace et stable. Rien que le fait de pouvoir faire cela peut être une motivation pour apprendre le lua, car il y a très peu de langages qui tournent de manière aussi sécurisée, et aussi rapidement que lua (voire aucun).

IUT : TP jQuery / jQuery Mobile

La note sera décomposée ainsi :

(1) Sur 4 points – Le site HTML (bootstrap / design) et le code source du site HTML (HTML5, indentation + sortie à l’imprimante correcte)
(2) Sur 10 points : Les appels AJAX, ainsi que des effets avec jQuery + de la construction dynamique d’éléments avec jQuery (indentation Php et jQuery / JavaScript + sortie à l’imprimante correcte)
(3) Sur 6 points : le site HTML mobile avec du jQuery Mobile et des appels AJAX (indentation + sortie à l’imprimante correcte, sachant que, encore une fois, j’en attends moins du site mobile que du site principal).

Prenez en compte ces avertissements :
– interdiction d’utiliser une librairie JavaScript qui ne vienne pas des sites officiels jQuery, jQueryUI, jQuery Mobile ou Bootstrap
– dernier délai : fin de semaine de notre dernier cours, soit dimanche à minuit. Passé ce délai ce sera 1 pt par 2 heures de retard (je prendrai en compte la date de réception du mail) ;
– copie sur une autre personne (« je se savais pas comment implémenter telle ou telle fonctionnalité dont j’avais besoin pour aller plus loin, je l’ai copiée sur un autre »), deux cas se distinguent :
– si la personne est clairement nommée, cette fonctionnalité ne sera pas prise en compte dans la notation (= 0 pour cette fonctionnalité) ;
– si la personne est clairement nommée, et qu’il y a une amélioration de la fonctionnalité : note pour la fonctionnalité divisée par 2 (uniquement la moitié du travail a été faite) ;
– 0 aux deux personnes sinon ;
– si je m’aperçois que vous avez bêtement copié collé des sources Internet, je vous convoquerai pour vous demander de m’expliquer la fonctionnalité, et deux cas se distinguent :
– si vous ne savez pas m’expliquer le code alors 0 ;
– si vous savez m’expliquer tout le code alors votre note totale sera divisée par vous + le nombre de contributeurs à ce projet, ce qui se rapprochera certainement de 0 aussi.
– rendu du TP possible : vous ne m’envoyez que le code HTML et JavaScript, et un lien vers un site sur lequel vous avez tout réalisé. Ainsi, je n’aurais pas à installer / regarder ce qui a été fait en Php (ou Python pour ceux qui sont allés plus loin que les cours Php (oui, il y en a !)), et je regarderai ce que j’ai cité plus haut.

ISEN Institut Supérieur de l’Électronique et du Numérique : cours e-Commerce


Cliquez ici pour télécharger le cours.

Rappel pour les vhosts :

  • Rajouter la correspondance dans le fichier Hosts
  • Créer le vhost (exemple dans le PDF ci dessus) dans sites-avalaible puis lien symbolique dans sites-enabled via l’ordre ln -s ../site-avalaible/nomdelaconf nomdelaconf.conf
  • Redémarrer Apache : sudo service apache2 restart

Une vulnérabilité critique affectant Windows Server 2003 ne sera pas corrigée

C’est bien, je vais enfin avoir l’argument massue pour tous ceux qui critiquent Linux : une faille critique sur Windows Server 2003 qui permet de devenir maître du système à distance ne sera jamais corrigée.

Je vous rappelle qu’on paie pour une license, et que la sécurité fait partie des choses pour lesquelles on paie (on paie en partie pour les mises à jour et ces dernières corrigent les bogues et problèmes de sécurité).

Il suffira donc juste d’avoir le programme qui permet d’exploiter cette faille et si on veut être méchant, on le pourra !

Tout est expliqué ici : sur developpez.com

Le tag <blink> : il est né à partir d’une bonne cuite. Histoire vraie.

Vous ne me croiriez pas si j’étais le seul à le dire, mais le tag blink qui fait clignoter le texte de manière affreuse et agressive, est né d’une grosse fête entre ingénieurs, qui, bien échaudés par quelques verres, se sont marrés en pensant à une idée stupide.

L’histoire tout en langue de Shakespeare ici.

NodeJS et MongoDB : requête « JOIN » fonctionnelle

// Exemple copié collé et adapté sur stackoverflow :              
// http://stackoverflow.com/questions/15630770/node-js-check-if-path-is-file-or-directory
// http://stackoverflow.com/questions/7268033/basic-static-file-server-in-nodejs 
//                                                                               
var http = require('http'),                                            
    url = require('url'),                          
    fs = require('fs'),                            
    mongoose = require('mongoose'),                
    fileSystem = require('fs'),                    
    path = require('path');                        
var mimeTypes = {                                                                
    "html": "text/html",                 
    "jpeg": "image/jpeg",                
    "jpg": "image/jpeg",                 
    "png": "image/png",                  
    "js": "text/javascript",             
    "css": "text/css"};                  
                                                                                 
var server;                                                                      
var Schema = mongoose.Schema;                                                    
                                                                                 
mongoose.connect('mongodb://localhost/test');                          
var db = mongoose.connection;                                                    
                                                                                 
var creneauSchema = new Schema({                                                 
    libelle:    String,                                      
    date_debut: { type: Date, default: Date.now },           
    date_fin:   { type: Date, default: Date.now },           
    heure_debut: Number,                                     
    duree: Number,                                           
    creneauxJours_id: { type: Schema.Types.ObjectId, ref: 'CreneauJours' }
});                                                                              
var Creneau = db.model('Creneau', creneauSchema);                      
                                                                                 
var creneauJoursSchema = new Schema({                                            
    jours_semaine: [Number]                                  
});                                                                              
var CreneauJours = db.model('CreneauJours', creneauJoursSchema);       
                                                                                 
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function () {                                          
    console.log('DB connexion reussie');           
    //var cj = new CreneauJours({                            
    //    jours_semaine: [1,2,3,4,5]                         
    //});                                                    
    //cj.save(function (err) {                               
    //    if (err) { return console.log(err); }              
    //    console.log('Écriture réussie');
    //    var c = new Creneau({                              
    //        libelle: "Après midi à 16 heures",
    //        date_debut: new Date(2010, 1, 1),              
    //        date_fin:   new Date(2020, 1, 1),              
    //        heure_debut: 16,                               
    //        duree: 120,                                    
    //        creneauxJours_id: cj._id                       
    //    });                                                
    //    c.save(function (err) {                            
    //        if (err) { return console.log(err); }          
    //        console.log('Écriture 2 réussie');
    //    });                                                
    //});                                                    
    //return;                                                
                                                                                 
    server = http.createServer(function (request, response) {
        if (request.url=='/creneaux') {
            console.log("> JSON");
            Creneau  
            .find({})
            .select('_id libelle date_debut date_fin heure_debut duree creneauxJours_id')
            .populate('creneauxJours_id')
            .exec(function (err, c) {
                if (err) {
                    return console.log(err);
                }
                console.log(c);
                var retour='[';
                for (var i = 0; i < c.length; i++) {
                    retour += '{'
                        + 'id:' + JSON.stringify(c[i]._id)+', '
                        + 'libelle:' + JSON.stringify(c[i].libelle)+', '
                        + 'date_debut:' + c[i].date_debut+', '
                        + 'date_fin:' + c[i].date_fin+', '
                        + 'heure_debut:' + c[i].heure_debut+', '
                        + 'duree:' + c[i].duree+', '
                        + 'jours:[' + c[i].creneauxJours_id.jours_semaine + ']'
                        + '},';
                };
                /* Enlever la dernière virgule : */
                retour=retour.substr(0, retour.length-1)+']';
                response.writeHead(200, {
                    'Cache-Control': 'no-cache, must-revalidate',
                    'Expires': 'Mon, 26 Jul 1997 05:00:00 GMT',
                    'Content-type': 'application/json'
                });
                response.end(retour);
            });      
            // Stopper tout traitement :
            return;  
        }                                
        var uri = url.parse(request.url).pathname;
        var filename = path.join(process.cwd(), uri);
        console.log("> " + filename);
        fs.exists(filename, function(exists) {
            if ((!exists) || (fs.lstatSync(filename).isDirectory())) {
                console.log(">> fichier inexistant : " + filename);
                response.writeHead(200, {'Content-Type': 'text/plain'});
                response.write('404 Not Found\n');
                response.end();
                // Stopper tout traitement :
                return;
            }        
            var mimeType = mimeTypes[path.extname(filename).split(".")[1]];
            response.writeHead(200, {'Content-Type':mimeType});
                                                                                 
            var fileStream = fs.createReadStream(filename);
            fileStream.pipe(response);
        });                              
                                                                                 
    });                                                      
    // Listen on port 8000, IP defaults to 127.0.0.1         
    server.listen(8000);                                     
    // Put a friendly message on the terminal                
    console.log("Server running at http://127.0.0.1:8000/");
});