Blog

Best and Worst from the Internet.
  • Réflexions - le 30 Mars 2014 par

    Lors de notre visite du parc naturel de Yosemite en Californie, notre guide nous expliquait que les rangers laissaient volontairement bruler la forêt en cas d'incendie sans chercher à stopper la propagation.

    ...

  • Réflexions - le 26 Mars 2014 par

    Je suis d'accord (avec moi-même ?)

    Je me suis toujours demandé pourquoi beaucoup de Français faisaient cette faute. Je viens enfin de comprendre que c'était uniquement une mauvaise traduction

  • Développement - le 25 Mars 2014 par

    J'ai rien à dire, mais je vais le dire à tout le monde !

    Je me suis remis un peu au référencement. J'ai créé mon compte Google Analytics et j'ai ajouté un Sitemap automatique à mon code.

    En fait le sitemap.xml redirige vers une page PHP qui va générer les urls automatiquement en fonction du menu. C'est certes un peu léger comme crawling mais c'est ce que je peux faire de mieux via le générateur de code source.

    En customisant un peu, je pourrais rajouter dynamiquement les catégories de produits ou les catégories de blog. Je pense que mettre tout le site n'a pas vraiment d'intérêt, surtout que ça fait perdre en priorité au liens référencés.

    Tuto Sitemap

    Pour référencer votre sitemap sur Google (90% de part de marché en France) il faut se rendre sur le Webmaster Tools

    J'ai choisit de vérifier ma propriété du site via une entrée DNS de type TXT sur ovh, c'est plus propre et assez facile à mettre en place quand on connait, mais d'autres solutions existent.

    Ensuite il suffit de communiquer à google le lien du sitemap dans Exploration > Sitemap.

    A noter que le sitemap doit se trouver à la racine du site, sinon il ne pourra pas référencer les pages contenues dans un autre répertoire.

    Ex: si le sitemap est www.monsite.fr/public/sitemap.xml, alors il ne pourra référencer que les urls au delà de www.monsite.fr/public, ce qui est assez fâcheux.

    Ca m'avait posé pas mal de problème chez manolo à cause du multilingue. L'astuce avait été de créer un sitemap à la racine qui redirige vers 2 autres sitemaps, un sur /fr/sitemap.xml et l'autre sur /en/sitemap.xml.

  • Développement - le 24 Mars 2014 par
    Gen2sis - Code Generator

    la genèse

    Back in the time, avant manolosanctis j'avais entrepris un projet générateur de code dénommé Genesis.

    L'idée m'était venue de ma mission à la Sogé où nous utilisions un générateur pour toutes les tâches récurentes. Cela permettait de s'assurer du respect des Best Practices, des conventions de nommage et d'éviter les erreurs de typo.

    Principes

    Framework VS Générateur de code

    Vous me direz, et à juste titre, qu'un framwork comme Hibernate peut très bien répondre au besoin. Je suis personnellement assez mal à l'aise avec les frameworks de persistance objet. En effet, l'utilisateur de ce type de framwork fait aveuglément confiance à la gestion automatisée des recherches/sauvegardes en base de données et cela peut conduire à de gros problèmes de performances.

    Je suis assez partisan du Lazy loading et, en règle générale, de la maîtrise de l'accès à la base de données. En particulier, je trouve dangereux de faire appel à la bdd dans une vue (c'est peut-être un traumatisme d'un bug de ce type rencontré sur un de mes projets)

    De plus, et je pense que c'est l'argument clé, les frameworks couvrent un large champ d'action et nécessitent de parcourir tous les cas de figure à chaque exécution d'un script. En terme de performance on a vu mieux. Je préfère traiter les différents cas dans un générateur de code et sauvegarder la configuration optimale qui tournera donc plus vite.

    Pour finir, la génération de code permet de modifier aisément le résultat si jamais il ne correspond pas exactement au besoin. On gagne en souplesse pour la résolution des cas complexes.

    Approche multiple

    Ceci étant dit, je ne suis pas un fanatique du générateur de code source. Je pense qu'il faut avoir plusieurs outils dans sa boîte de développeur.

    • Framwork: Un framwork peut être très intéressant, du moment qu'il concerne des traitements génériques. J'utilise principalement mon framework pour gérer la couche MVC + Formulaires.
    • Code Generator: Lorsque intervient de la logique métier, je préfère utiliser un générateur de code car ce sont des données propres à l'application.
    • Bootstrap: Si le problème à traiter est trop complexe, il peut être utile tout de même d'avoir un fichier de bootstrap qui va jetter les grand principes sur le papier. Une simple copie de fichier modèle suffit dans le cas présent. On se met ensuite à coder intégralement, mais on a gagné du temps sur les bases.

    Le Projet

    Je me suis mis récemment à travailler sur de multiples projets. Genesis v1 ne me permettait pas de switcher facilement d'un projet à l'autre.

    Par ailleurs, les configurations étaient enregistrées dans un fichier XML par objet à traiter. La sélection du fichier source étant pénible sur le long terme.

    Genesis ayant été avant tout développé pour m'aider à avancer rapidement sur mon code, je n'avais pas pris le soin de correctement l'architecturer et il devenait difficile de le faire évoluer. En particulier

    • impossibilité de générer une partie du code uniquement
    • ajout de nouveaux cas de figures assez complexes à gérer.
    • pas d'updates automatique de la bdd
    • pas de possibilité de synchroniser des fichiers 'types' sur plusieurs projets.

    Je m'explique. En travaillant sur plusieurs projets, j'ai commencé à faire évoluer l'architecture des layouts des pages afin de systématiser la gestion du menu et des feuilles de style. En parallèle, j'ai implémenté Bootstrap sur mon projet Track et je n'avais pas envi de faire du CTR+C/CTRL+V sur les autres projets. Il me fallait donc trouver un moyen de pouvoir coder dans un environnement 'type', puis de synchroniser les fichiers avec le projet cible en question.

    Tout ceci m'a finalement conduit à me lancer dans Gen2sis, générateur de code et gestion d'application PHP.

    Fonctionnalités

    Gen2sis permet actuellement de gérer plusieurs composants

    Application

    Une application est le point central de Gen2sis. Elle permet de

    • gérer la bdd attenante
    • gérer plusieurs fichiers de configuration (LOCAL, DEV, PROD)
    • bootstraper l'application pour commencer avec une base
      • index: page d'accueil
      • error: gestion des erreurs 500 et 404 - Not found
      • user: création d'utilisateurs et module d'authentification
    • gérer le menu de l'application
    • gérer le theme de l'application (couleurs des liens, du menu, police des titres, etc...)

    Entité

    C'est le nom que je donne à un objet métier. Une entié peut être par exemple:

    • un post de blog
    • une produit d'un site d'e-commerce
    • un commentaire
    • ...

    Une entité peut avoir:

    Attributs

    Des Attributs de plusieurs type:

    • texte
    • date
    • booléen
    • numérique
    • date
    • image
    • email/url

    Références

    Des Références à d'autres entités.

    Exemple: une entité Album possède une référence à l'entité Utilisateur en tant qu'auteur de l'album.

    Dictionnaires

    Des Dictionnaires d'Entités ou "listes" d'entités.

    Exemple: un Post de blog peut avoir plusieurs Commentaires

    Pour chacun de ces 3 types, Gen2sis génère

    • le modèle objet associé
    • le controller en mode CRUD
    • les vues nécessaires
    • le formulaire de création
    • la couche d'accès aux données
    • la couche de logique métier
    • le SQL permettant de mettre à jour la base de donée en fonction de son état préalable.

    La suite

    Pour l'instant Gen2sis n'est utilisable qu'en LOCAL. Il y a encore trop de configuration en 'dur' et le développement depuis un serveur distant n'est pas vraiment aisé. Mais il faut avouer que je suis parfois frustré de ne pas pouvoir coder parce que je n'ai pas mon PC sur moi. Mon idéal serait d'avoir Gen2sis sur le web et de pouvoir enfin coder depuis mon iPhone !

    Until my dreams comes true ...

  • Développement - le 23 Mars 2014 par
    Une image vaut mille mots

    -- Confucius

    Nouvelle version du blog avec possiblitié d'uploader une image. Ca n'a pas l'air très compliqué dit comme ça, mais je voulais absolument que cette évolution soit gérée par mon générateur de code source. C'était donc un poil plus compliqué.

  • Réflexions - le 18 Mars 2014 par

    Dans ma jeunesse en allemagne, j'avais l'habitude d'aller dans une boîte de nuit qui s'appelle die N8 (die Nacht = la nuit)

    Ce qui est frappant c'est de constater que ce jeu de mot fonctionne également dans d'autres langues:

    Langue N8 nuit
    Français N-huit nuit
    Anglais N-eight night
    Italien N-otto notte

    Certains étudient la signification des chiffres. Bien que je trouve cela assez absurde, je ne peux m'empêcher de croire que le chiffre 8 puise son origine au plus profond de la nuit.

  • Développement - le 18 Mars 2014 par

    J'étais sur le point de laisser tomber mon vieux parser de texte qui me sert à mettre en forme les posts de ce blog pour migrer vers un tinymce aux possibilités plus grandes, quand je suis allé faire un tour sur Coding Horror

    Ce site c'est un peu une référence pour moi. Startuper et Philosophe du web, Jeff Atwood est le créateur de Stackoverflow et il a souvent des réflexions très pertinentes sur l'informatique et le développement.

    A ma grande surprise, il n'a pas développé son blog mais il utilise Ghost Blogging. J'ai farfouillé un peu pour voir quelle type de mise en forme ce site proposait car les posts m'ont toujours paru très sobres et clairs.

    Je vous le donne dans le mille, leur key feature c'est le MARKDOW ! C'est à dire la possibilité de taper du texte avec des * et des _ qui seront ensuite mis en forme automatiquement.

    Un peu d'histoire

    En creusant un peu, le Markdown (je suppose en référence au Hyper Text Markup Language aka HTML) est un langage de balisage léger créé par John Gruber. Il a été initialement développé en Perl, mais on trouve facilement des projets de portage en PHP.

    La syntaxe est prévue pour être compréhensible, même si elle n'est pas interprétée. Par exemple:

    # Header
    
    - list item
    - list item
    - list item
    
    **strong** ou _italic_ ou [lien web](http://example.com)
    

    Mais surtout le gros avantage pour moi est que la syntaxe permet de faire facilement du formating directement au clavier. De façon plus efficace donc, surtout pour la prise de note. Ceci a aussi le gros avantage de laisser le soin de la mise en page au css et de donner un rendu propre et cohérent.

    Il faut croire que le markdown a eu beaucoup de succès, car des sites comme Github l'utilisent. A tel point que c'est devenu une sorte de norme.

    Et nous dans tout ça ?

    A partir de là je n'avais pas beaucoup d'options. Comme j'ai la volonté un jour de releaser mon code source, ça ne servait à rien de réinventer mon propre language. J'ai donc opté pour la lib Parsedown que j'ai intégrée à mon framework. Bon j'ai pas pu m'empêcher de modifier un peu le code pour passer les classes en static histoire de gagner un peu en perf Ma seule déception, c'est que le language ne gère pas le underline :( Mais au final je gagne pas mal de possibilités par rapport à mon parser, surtout celle de formater du code source.

    -- Mathdown

  • Développement - le 20 Février 2014 par

    Je viens de développer une nouvelle fonction qui m’a bien amusée.

    J’étais un peu navré à chaque fois que mon parser HTML ne trouvait pas d’image et que le site affichait mon image grise toute moche par défaut. Souvent je passais du temps à refaire des vignettes pour les re-uploader sur le site et le rendre plus joli. Mais pour les sites de dev, c’est pas toujours évident car il n’y a souvent que du texte.

    Du coup je me suis inspiré du graphisme de YOU CAN’T DO SIMPLE MATHS UNDER PRESSURE pour générer une image à base de texte. L’idée c’est de faire matcher les mots dans le carré de façon à ce qu’ils occupent le plus d’espace possible. Les textes sont donc rendus dans différentes taille en fonction de la longueur des mots. Le résultat ressemble un peu au Manifesto, où du moins c’était le but recherché.

    J’ai un peu tweaké le code pour ne pas faire qu’un seul mot par ligne, mais agglomérer les mots si ils étaient courts. Le résultat a été plus probant lorsque je suis parti du principe que les mots de la langue anglaise font 4.5 caractères en moyenne, ce qui m’aide à déterminer une longueur de ligne maximale en dessous de laquelle j’agglomère les mots.

    Bon il me reste un problème de typo. PHP me donne la taille du texte avec les coordonnées x et y, mais les lettres ne comment pas toutes au 0,0. Le M par exemple est en retrait par rapport au A. Ce qui fait que les mots ne sont pas très bien centrés en fonction de la première lettre du mot. Idem en hauteur pour les accents qui biaisent mes calculs.

    Petite démo ici

    Je ne sais pas si je passerais encore du temps à améliorer l’algo, car il a déjà un bon rendu pour ce que je veux en faire et je suis un peu à court d’idée il faut dire.

    LOVE WHAT YOU DO, DO WHAT YOU LOVE

  • Développement - le 19 Février 2014 par

    Je viens de découvrir les nouveaux éléments de formulaire HTML 5.

    J'ai implémenté les nouveaux champs email et url qui possèdent un validateur intégré. Par contre, leur validateur n'est pas terrible, il faut continuer à garder un validateur côté PHP pour s'assurer que l'url ou le mail est bien valide, mais ça évite déjà certaines erreurs de saisie.

    J'ai ajouté également à mon Framework PHP la gestion de l'attribut required qui empêche la validation du formulaire si le champ n'est pas saisi. Idem que précédemment, cela n'affranchit pas de faire le test côté PHP. Surtout qu'un individu mal intentionné peut toujours essayer de contourner le problème en appelant directement la page de sauvegarde en "POST". Néanmoins ça fait toujours du traitement en moins côté serveur pour des cas simples. A noté que le champ n'est pas compatible avec tous les navigateurs, ce qui rend d'autant plus nécessaire la validation PHP.

    Je trouve dommage cependant que l'on ne puisse pas saisir son propre commentaire en cas de saisie non valide.

    Dans la liste des déceptions, l'élément qui permet de faire du suggest field. Encore une fois, la méthode permet de pré-remplir un champ texte, alors que le comportement qui m'intéresse c'est l'affichage du mot, mais la récupération de l'id côté serveur. Il va falloir continuer de faire ça en js.

    Pour finir, j'ai mis en place l'attribut placeHolder sur certains champs qui donne une indication de saisie à l'intérieur du champ de formulaire. Ca ne marche pas non plus avec tous les navigateurs, mais ça rend l'utilisation plus agréable sur navigateurs récents, et ça évite d'encombrer la page avec du Javascript pour simuler le comportement.

    En tout cas je suis heureux de constater que ça évolue au niveau du support HTML en natif. Ça allège le code, ça prend moins de ressource côté serveur et ça améliore l'expérience utilisateur.

    Vivement la suite.

  • Développement - le 17 Février 2014 par

    Ce WE je me suis lancé un nouveau challenge : rendre le site responsive !

    En effet ça commençais à devenir pénible d'utilisation sur iPhone.

    La partie la plus compliquée c'est surement le menu qui se regroupe en un seul bouton quand la taille devient trop petite. J'avais envie d'une solution "100% CSS". C'est possible, mais il faut se rendre à l'évidence, ce n'est pas très pratique. Le problème principal vient d'utilisation de la pseudo class css hover pour afficher le menu au survol du bouton. Mais sur smartphone, le comportement est hasardeux et le menu reste affiché une fois qu'on l'a activé.

    Au final, j'ai choisit d'implémenter **Bootstrap C'était pas évident parce que le framework redéfinit beaucoup de classe que j'avais déjà moi-même implémenter (comme les listes, le breadcrumb, la pagination). Il redéfinit aussi la taille de base des polices, ce qui m'a mit tout mon design en vrac. Gros boulot en somme, mais finalement le résultat en valait la peine.

    J'ai tout de même réécrit une classe pour la sidebar. La gestion par colonne est intéressante, mais je voulais garder une largeur fixe pour ma sidebar.

    .main,.sidebar{
        position:relative;
        min-height:1px;
        padding-right:15px;
        padding-left:15px;
    }
    @media(min-width:768px){
        .main,.sidebar{ float:left; }
        .main{ border-right:1px solid #d2d2d2; }
    }
    @media(min-width:768px){.main{ width:67%; }.sidebar{ width:33%; }}
    @media(min-width:992px){.main{ width:74%; }.sidebar{ width:26%; }}
    @media(min-width:1200px){.main{ width:80%; }.sidebar{ width:20%; }}
    

    En règle générale, cela manque encore aujourd'hui au framework. Je ne sais pas si c'est juste une philosophie à adopter pour être full responsive, mais j'ai du mal à m'habituer aux largeurs flottantes. Je préfère avoir une colonne fixe, et le main qui prend la place restante.

    En conclusion, Bootstrap règle qq problèmes (certes assez pénible à implémenter), mais il faut continuer à coder un peu par soi-même pour l'adapter à son besoin.

    Bonne trouvaille tout de même.

    En espérant que le framework continuera d'évoluer et que je puisse en bénéficier à long terme.

    A vos iPhones !!!

  • Développement - le 9 Octobre 2013 par

    V0.1.5

    J'ai bossé ces derniers jours sur le parser de lien (le formulaire dans la barre de menu) afin d'améliorer la reconnaissance des sites. En plus des tags facebook, je regarde toutes les images du site. J'ai adapté un code que j'ai trouvé là http://github.com/maparrar/linkparser en suivant un lien du post d'origine ici http://redsunsoft.com/2011/01/parse-link-like-facebook-with-jquery-and-php/

    L'idée intéressante du code est de filtrer toutes les images dont le ratio ne respecte pas au moins 1/3 entre hauteur et largeur, ou qui n'ont pas au moins 200px de large. En fait ça filtre toutes les bannières de pub avec un format adhoc et toutes les images qui ne sont pas dignes d'être partagées. Pour l'instant mes tests sont assez satisfaisants, le résultat est assez probant.

    J'ai du me remettre au javascript également pour faire le mini slideshow qui permet de faire défiler la liste des images et qui met à jour le formulaire avec la bonne url d'image.

    Vous pouvez essayer avec cette url : http://www.tripadvisor.fr/LocationPhotos-g187497-Barcelona_Catalonia.html

    Je suis assez satisfait du résultat. Et vous, vous en pensez quoi ?

    Bon ceci étant dit il faudrait que je trouve un moyen de déterminer automatiquement une catégorie pour enlever de la friction. Et je dois aussi mettre en place un système de reconnaissance qui évite de créer deux fois un produit à partir d'une même url ou d'un url ressemblante

    PS: bon forcément faut pas retourner le site, il y a toujours des cas qui plantent.

  • Développement - le 23 Septembre 2013 par

    Le démon du code m'a rattrappé. On a beau lutter, quand on est staruper, on a ça dans le sang.

    Loin de moi l'idée de me lancer dans la création d'une nouvelle entreprise. Mais j'avais une petite idée dans la tête depuis un certain temps et le php commençait à me démanger.

    J'ai donc ressorti Notepad ++ et me voici. Je commence le dev par ce blog pour pouvoir partager avec vous mes réflexions et pourquoi pas les enrichir avec vos idées.

    Bonnec lecture, bonne visite

  • Réflexions - le 2 Avril 2008 par

    Il y a 5 maisons alignées de couleurs différentes. Dans chaque maison, vit une personne de nationalité différente. Chaque personne boit une boisson, fume un type de cigarette et élève un animal différent. Pouvez-vous dire qui élève les poissons, sachant que :

    1. L’anglais habite la maison rouge.
    2. Le Suédois possède un chien.
    3. Le Danois boit du thé.
    4. La maison verte est située `a gauche de la maison blanche.
    5. Dans la maison verte, on boit du café.
    6. Le fumeur de Pall Mall possède un oiseau.
    7. Dans la maison du milieu, on boit du lait.
    8. Dans la maison jaune, on fume des Dunhill.
    9. Le Norvégien habite la première maison.
    10. Le fumeur de Rothmann a un voisin qui possède un chat.
    11. Celui qui possède un cheval a un voisin fume des Dunhill.
    12. Le fumeur de Philip Morris boit de la bière.
    13. Le Norvégien est voisin de la maison bleue.
    14. L’Allemand fume des Marlboro.
    15. Le fumeur de Rothmann a un voisin qui boit de l’eau.

    Cette énigme a été posée par A. Einstein au début du siècle dernier. Selon lui 98% des gens sont incapables de la résoudre.

  • Réflexions - le 4 Janvier 2008 par

    On peut construire l'ensemble des nombres entiers N à partir de l'ensemble vide { }.

    Considérons { }

    Dénombrons le nombre d'ensemble que l'on peut construire à partir de { }:

    • soit nous prenons l'ensemble vide { { } }
    • soit nous ne le prenons pas { }

    Nous obtenons donc un ensemble à deux éléments { { }, }.

    Par extentions, nous obtenons un ensemble à N éléments. Par bijection, nous obtenons N lui-même.

    d'après Gaby, prof de Maths.

    J'aime bien cette démonstration, parce qu'on crée un ensemble infini à partir d'un ensemble vide

  • Réflexions - le 4 Janvier 2008 par

    1 fois rien, c'est rien

    2 fois rien, c'est rien

    3 fois rien, c'est déjà quelque chose

    -- Coluche

    Cf dénombrement

  • Réflexions - le 12 Septembre 2007 par

    Un conseil si tu veux citer un roi Français sans te souvenir de son nom, cite Henry VI, ça passe toujours Gildas Baron

  • Réflexions - le 22 Août 2007 par

    Définition des normes et des standards de conception en architecture.

    C'est grâce à lui que votre lave lingue fait 60cm de large.

  • Réflexions - le 21 Août 2007 par

    John Wilkins, inventeur du système métrique a basé l'invention d'un nouveau langage sur le même principe. Il a découpé l'univers en 40 parties et il leur a attribué un trigramme à chacune. Chaque autre mot est définit par les autres lettres qui le compose.

    Exemple :

    • si meg est attribué au feu,
    • alors mega voudra dire flamme
    • et megai veut dire petite flamme

    -- d'après Jorge Luis Borges

    Mais si les chiffres sont compréhensibles en eux-même, combien n'ont pas la mémoire des chiffres ?

    EDIT 17 MARS 2014

    Avec le recul, je trouve ça finalement assez réducteur de réduire la composition d'un mot à la juxtaposition linéaire d'une lettre. En effet, chaque syllabe de notre langue a son origine, son sens propre qui est exhausté par son usage au sein d'un mot.

    John Wilkins imagine ainsi un système d’écriture basé non sur un alphabet, mais sur un système idéographique compréhensible internationalement.

    Il travaille six ans à ce projet qu’il présente dans An Essay towards a Real Character and a Philosophical Language. Dans cet ouvrage, Wilkins propose également l'adoption d'une mesure universelle (universal measure), d'unités décimales, basée sur le principe d'un pendule battant une seconde, et dont la longueur fondamentale est de 38 pouces de Prussie (1 prussian inch = 26,15 mm), soit de 993,7 mm.

    Le savant Italien Tito Livio Burattini redéfinira quelques années plus tard cette unité et la renommera le mètre (metro cattolico).

    -- Wikipédia