123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777 |
- <!doctype html>
- <html lang=fr>
- <head>
- <!-- Always define the charset before the title -->
- <meta charset=utf-8>
- <title>★ Conférences Django pour PyCon fr — Biologeek — David Larlet</title>
- <!-- Define a viewport to mobile devices to use - telling the browser to assume that the page is as wide as the device (width=device-width) and setting the initial page zoom level to be 1 (initial-scale=1.0) -->
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <!-- Fake favicon, to avoid extra request to the server -->
- <link rel="icon" href="data:;base64,iVBORw0KGgo=">
- <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
- <link rel="manifest" href="/manifest.json">
-
- <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
-
- <noscript>
- <style type="text/css">
- /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
- body {
- font-family: 'EquityTextB', serif;
- }
- h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
- font-family: 'EquityCapsB', sans-serif;
- font-variant: normal;
- }
- </style>
- </noscript>
-
- <!-- Canonical URL for SEO purposes -->
- <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20080521-conferences-django-pour-pycon-fr">
-
- </head>
- <body>
- <div>
-
- <header>
- <nav>
- <p>
- <small>
- Je suis <a href="/david/" title="Profil public">David Larlet</a>, <a href="/david/pro/" title="Activité professionnelle">artisan</a> du web qui vous <a href="/david/pro/accompagnement/" title="Activité d’accompagnement">accompagne</a><span class="more-infos"> dans l’acquisition de savoirs pour concevoir des <a href="/david/pro/produits-essentiels/" title="Qu’est-ce qu’un produit essentiel ?">produits essentiels</a></span>. <span class="more-more-infos">Discutons ensemble d’une <a href="/david/pro/devis/" title="En savoir plus">non-demande de devis</a>.</span> Je partage ici mes <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et <a href="/david/correspondances/2017/" title="Lettres hebdomadaires">correspondances</a>.
- </small>
- </p>
- </nav>
- </header>
-
-
- <section>
- <h1 property="schema:name">★ Conférences Django pour PyCon fr</h1>
- <article typeof="schema:BlogPosting">
- <div property="schema:articleBody">
- <img src="/static/david/biologeek/images/logos/django.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
- <p>J'ai eu le privilège de présenter Django lors des <a href="http://fr.pycon.org">journées</a> organisées par l'<a href="http://www.afpy.org">afpy</a>. C'était vraiment un weekend exceptionnel, une organisation exemplaire, des conférences de qualité, des discussions de geek, que du bon. Je me suis enfin décidé à mettre les slides en ligne, en attendant les vidéos.</p>
- <h2>Historique</h2>
- <p>J'avais déjà <a href="http://media.larlet.fr/david/conferences/django/">présenté Django l'année dernière</a> et j'avais vraiment eu l'impression de passer à côté de ma conf. Outre le fait que j'étais bien crevé <a href="https://larlet.fr/david/biologeek/archives/200763-django-fr-enfin-en-ligne/">d'avoir mis en ligne django-fr</a>, j'ai relevé 3 gros défauts :</p>
- <ul>
- <li>je voulais que la présentation serve aussi pour les personnes souhaitant la consulter en ligne, au final c'est beaucoup trop verbeux et le code distrait à mon avis l'auditoire qui vient à une conférence pour s'enrichir d'une expérience et non pour une lecture de code ;</li>
- <li>je voulais faire plaisir à tout le monde en partant de la base pour aller vers des techniques plus avancées et au final personne n'y trouve vraiment son compte ;</li>
- <li>je voulais garder le public connecté et j'ai le sentiment d'avoir été plutôt ennuyeux : c'était long et ça manquait tout simplement de vitalité (sans compter quelques soucis avec S5).</li>
- </ul>
- <p>Partant de ce constat, j'ai essayé cette année de :</p>
- <ul>
- <li>faire des slides minimaliste, l'objectif était qu'ils soient tout simplement inutiles sans moi (d'où le besoin de les enrichir pour vous les présenter maintenant, pas sûr que ce soit bon pour moi ça :p), c'est à mon avis le seul moyen de se focaliser sur l'expérience du présentateur et donc sur le message à faire passer ;</li>
- <li>scinder en deux sessions débutant/avancé pour laisser le choix au visiteur de n'assister qu'à la conférence qui l'intéresse ;</li>
- <li>trouver un moyen de rendre les confs plus vivantes (et utiliser Keynote).</li>
- </ul>
- <p>Alors pari réussi ? Mon retour personnel après chaque conférence ci-dessous. J'essaye de retrouver ce que j'ai dit de tête, ça sera forcément différent des vidéos qui devraient arriver plus tard : moins de stress, davantage de temps pour étoffer et des liens en bonus.</p>
- <h2>Pourquoi Django ?</h2>
- <p>Je n'ai jamais eu de cours de marketing et je hais les commerciaux donc c'est vraiment une épreuve pour moi de « vendre mon produit ». J'ai surtout voulu aller à l'essentiel pour pouvoir ensuite en débattre pendant les questions/réponses.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.001.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Avant de parler de Django, il est bon de rappeler les <a href="https://larlet.fr/david/biologeek/archives/20070117-definition-et-avantages-d-un-framework-web/">intérêts d'un framework web</a> face à l'approche plus traditionnelle par applications fonctionnelles toutes prêtes. Qu'est-ce qui a pu suscité un tel engouement ?</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.002.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>On connaît tous des projets qui commencent avec un projet tout simple (je prends souvent l'exemple du blog car il est assez parlant). Il existe des trillions de moteurs de blog et il est donc aisé d'en prendre un tout fait :</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.003.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Mais bien (trop) souvent, un projet évolue en cours de route et l'ajout de fonctionnalités (galerie de photos, paiement en ligne, inclusion de vidéos) aboutit finalement à un cahier des charges ressemblant plutôt à :</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.004.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Si vous êtes parti d'un simple moteur de blog rafistolé, il est très probable que vous arriviez à un résultat de piètre qualité :</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.005.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>La solution est de partir d'une approche plus bas niveau : la caisse à outil qui va vous permettre de construire vos propres briques fonctionnelles et de réaliser un projet de manière cohérente et évolutive.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.006.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>De cette façon, vous allez énormément gagner en agilité, la clé de voûte de la qualité (du projet), de la sérénité (du développeur) et de la satisfaction (du client).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.007.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Maintenant que vous êtes convaincu du bien fondé des frameworks web, il est temps de passer au plat de résistance : pourquoi Django ?</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.008.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Django est écrit en Python et vous permet d'écrire du Python, il n'y a pas de fichiers de configuration en xml (ai-je besoin de rappeler que ce format est fait pour les machines ?).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.009.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Django est très facile à prendre en main, il suffit de quelques heures (même sans connaître initialement Python) pour avoir une première application qui tourne et en comprendre les principaux concepts.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.010.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Face aux deux approches : framework glue vs. réinvention de la roue, Django a choisi la seconde ce qui apporte une cohérence à tous les niveaux (documentation, code, aide, etc) au détriment de sa modularité intrinsèque.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.011.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>La documentation est un réel atout, surtout lorsqu'on débute. C'est l'une des meilleures documentation technique que je connaisse et elle est en train d'être encore améliorée !</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.012.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Je suis assez mal placé pour parler de rapidité de développement avec la refonte de ce blog qui a pris... du temps. Néanmoins, pour l'utiliser quotidiennement, je peux affirmer que le développement avec ce framework permet de concrétiser plus rapidement des projets. L'un des atouts est par exemple de prototyper des applications en des temps records, après bien sûr les détails prennent plus de temps, comme partout.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.013.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>L'interface d'administration auto-générée est vraiment utile et participe à l'« effet Wow !© » initial. Difficile de s'en priver ensuite.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.014.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>L'échappement des caractères html par défaut peut être un élément important pour une personne débutant en développement web. Ce choix est une réelle sécurité si vous ne maîtrisez pas vraiment toutes les failles possibles d'un code (même s'il serait bon de <a href="http://www.djangobook.com/en/1.0/chapter19/">vous renseigner à ce sujet</a> si c'est le cas !).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.015.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Django est simple, autant dans ses concepts que dans leurs mises en application, si vous connaissez Python, vous pouvez même sans peine plonger dans le code de Django et découvrir quelques pépites.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.016.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>La maturité est souvent un facteur décisif d'un point de vue professionnel, après 5 ans de développement, le framework est devenu stable et à énormément gagné de son ouverture en Open-Source (pour ceux qui se demandent ce qu'une litière pour chat vient faire ici, c'est un jardin zen, j'ai pas trouvé mieux).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.017.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Quelques chiffres issus de la présentation de l'année précédente, on voit bien la progression en terme d'utilisateurs et donc de contributeurs potentiels.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.018.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Enfin, l'avantage d'avoir des outils à sa disposition est de pouvoir laisser s'exprimer sa créativité, le plus important est ce que l'on fait avec ses outils. Vous pouvez prendre le meilleur des frameworks, ça ne vous assurera pas une application à succès. Ça serait bien trop facile sinon ;-).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.019.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Après avoir vanté autant de qualités, voyons pour quels projets cette caisse à outils s'applique.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.020.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Il n'y a pas d'outil miracle, notre métier est un éternel compromis et il faut savoir faire avec. L'avantage de Django est qu'il permet de couvrir un très large périmètre d'applications mais si vous voulez construire un <a href="http://stuffthathappens.com/blog/2008/03/31/the-right-tool-for-the-job/">gratte-ciel</a> il va peut-être falloir penser à autre chose.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.021.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Cela dit, il y a un très faible pourcentage de projets web qui doivent en arriver là et il sera toujours temps de changer certaines parties ou d'améliorer les performances le moment venu.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.022.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>On termine avec un peu de teasing...</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.023.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>On ne l'attend plus mais Django 1.0 arrive ! (si si, je vous assure) La première branche importante (<a href="http://jehaisleprintemps.net/blog/fr/2008/04/27/queryset-refactor/">queryset-refactor</a>) a été mergée au trunk.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.024.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Et la suivante (newforms-admin) est en cours de finitions actives. Ce n'est plus qu'une question de ... (mettez ce qui vous semble le plus crédible et votez sur whendjangowillreleaseonepointzero.com).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.025.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Des fois que le message n'ait pas été assez clair (j'adore les photos de gens qui sautent dans les présentations, je trouve ça kitsch au possible ;-)).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_pourquoi.026.jpg"
- alt="Pourquoi Django"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <h3>Bilan personnel</h3>
- <p>Difficile d'enchaîner une nuit trop <del>alcoolisée</del> courte (il faut croire que c'est une malédiction) et d'insuffler suffisamment de vitalité. Je suis néanmoins assez satisfait car je pense avoir bien fait passer le message qui était tout simple : essayez Django !</p>
- <p>L'exemple initial était assez fort pour capter directement l'attention, la liste des avantages était assez claire. Bon par contre je suis conscient qu'il y a du progrès à faire au niveau de la conclusion car je n'ai pas assez insisté à l'oral sur l'intérêt d'avoir une simple caisse à outils pour laisser s'exprimer sa créativité et je voulais insister là-dessus.</p>
- <p>Je me suis permis quelques trolls un peu douteux sur Zope 3 (un peu la chance d'avoir assisté à la conf dessus la veille, un peu car on en a parlé une bonne partie de la nuit), je suis pas vraiment sûr que ça avait sa place. Quoi qu'il en soit, les éléments de comparaison cités dans la discussion qui a suivie étaient intéressants.</p>
- <h2>Django : performances et qualité</h2>
- <p>J'ai eu beaucoup plus de mal à préparer cette présentation car elle était très dépendante du public. Je voulais éviter de ne m'adresser qu'à une poignée de personnes et j'ai donc choisi au final une approche plus généraliste sur les bonnes pratiques web, appliquées à Django.</p>
- <p>Un rapide sondage m'a montré que ce choix était pertinent et que me craintes étaient fondées. Moins d'un quart de la salle avait déjà essayé Django, et une poignée sur de gros projets. Adaptation à chaud : il valait mieux passer du temps sur les aspects pas trop pointus... quitte à décevoir ceux qui étaient venus pour l'intitulé de la conf !</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.027.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Un rappel préalable sur le coût de la qualité et des performances s'impose. C'est un investissement dans une logique qui s'inscrit dans la durée, ce n'est pas forcément adapté à tous les projets et ça doit être mis en place d'un commun accord entre les acteurs du projet (les tests sont très difficiles à facturer).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.028.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Un titre qui claque, je suis sûr qu'en anglais ça rend encore mieux.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.029.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Il existe de nombreux outils de détection, du simple module logging à ceux permettant de stresser votre application et votre architecture.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.030.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Avant d'optimiser, il faut bien évaluer la situation, il ne sert à rien d'optimiser un site qui ne rencontre pas de problèmes de performances, privilégiez plutôt l'expérience utilisateur (ergonomie, etc). Si vous n'avez pas le temps d'optimiser, vous pouvez toujours avoir une expansion horizontale dans un premier temps (plus de serveurs) si vous disposez des fonds nécessaires. J'ai oublié de parler de l'évolution vers les clouds pour gérer ce type de problématiques.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.031.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>On entre dans le vif du sujet.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.032.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Le cache est l'élément le plus simple à mettre en œuvre et il existe différents niveaux avec Django (page, fragment, vue, queryset, etc) qui permettent d'avoir la modularité nécessaire. Attention, il ne faut pas oublier d'avoir des mécanismes d'invalidation du cache ! (pas comme sur ce blog par exemple...)</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.033.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Le cache est bien pratique mais insuffisant parfois. Lorsqu'on arrive sur des gros projets, il est quasi illusoire de vouloir s'en tenir à des données normalisées. Ne serait-ce que pour le nombre d'items, il faut avoir recours à des champs dénormalisés. Django dispose de <a href="http://code.djangoproject.com/wiki/Signals">signals</a> pour gérer ça de façon automatisée.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.034.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>De nombreuses choses peuvent être faites en asynchrone (envoi de mail, préchargements de widget coûteux, etc), AJAX peut ici prendre tout son sens.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.035.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Il faut bien faire la différence entre ce qui est imputable à Django et ce qui concerne l'architecture de votre projet, un bon admin sys et/ou DBA peut faire des miracles. Il ne faut pas oublier non plus que les <a href="http://performance.survol.fr/">performances css/js</a> jouent un rôle important à ce niveau...</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.036.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Une petite astuce propre à Django, l'utilisation du tag <strong>{% with %}</strong> pour créer des alias dans les templates lorsqu'une méthode coûteuse est évaluée dans une boucle par exemple.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.037.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Le traitement des performances se fait de manière itérative, essayez de toujours identifier le facteur limitant de la réactivité de votre application.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.038.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Un résultat est important, que ce soit un échec ou pas (le scientifique reprend le dessus), pensez à documenter vos essais, que ce soit pour votre équipe ou de manière publique (blog, <a href="http://www.djangosnippets.org/">djangosnippets</a>, etc).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.039.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Un autre titre jemelapètegrave.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.040.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>La pérennité d'une application web est toute relative, l'évolution technologique est telle qu'il est difficile d'être pertinent à plus de 3 ans. Ça veut dire qu'il faut quand même rester évolutif jusque là !</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.041.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Les règles qui s'appliquent ici sont les mêmes que pour un projet Python, il est impératif de tester les différentes fonctionnalités grâce aux unittests et doctests. Django dispose d'<a href="http://www.djangoproject.com/documentation/testing/">un module entier consacré à ça</a>, il est temps de s'en servir. Un client spécifique aux tests permet même de tester les différentes vues et le résultats des appels (GET, POST, etc).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.042.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>En découplant les différentes applications de votre projet (lire à ce sujet l'<a href="http://www.b-list.org/weblog/2007/nov/09/projects/">excellent post de James Bennett</a>), vous allez pouvoir vous constituer (ou <a href="http://code.google.com/hosting/search?q=label:django">récupérer</a>) un bibliothèque d'applications web réutilisables dans plusieurs de vos projets.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.043.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>On ne mentionnera jamais assez à quel point la documentation d'un projet est importante. Normalement les doctests doivent permettre de « raconter une histoire », développez vos talents d'écrivain !</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.044.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Cerise sur le gâteau, Django vous permet de générer automatiquement la documentation à partir du code dans l'interface d'administration, ce qui s'avère très pratique si vous travaillez avec une équipe de plusieurs personnes dont certaines s'occupent exclusivement du html/css/js.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.045.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Exemple d'itération sur l'implémentation des URL.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.046.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Utilisation assez naïve avec la construction d'URL à la main, c'est une mauvaise pratique car vous devez modifier les URL à de nombreux endroits si vous décidez de changer votre schéma.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.047.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>La seconde méthode s'appuie sur une méthode du modèle (différente ici du bien connu <strong>get_absolute_url</strong> car on veut accéder au profil et non à l'utilisateur), c'est déjà mieux mais il faut encore modifier l'URL à deux endroits en cas de modification.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.048.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Enfin la bonne méthode est d'utiliser <a href="http://www.djangoproject.com/documentation/url_dispatch/#naming-url-patterns">les URL nommées</a>, qui permettent de ne dupliquer la création des URL à aucun endroit, si vous modifiez celle dans <strong>urls.py</strong> ça va impacter sur l'ensemble des URL de votre site. Cela est permis grâce au décorateur <strong>permalink</strong>.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.049.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Ces différentes pratiques vous permettent d'opérer des refactoring important de code tout en étant serein et de vous concentrer sur d'autres fonctionnalités.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.050.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Je voulais terminer sur un point qui me semble capital pour améliorer la qualité d'une application (pas forcément Django).</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.051.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>L'idée m'est venue en consultant la <a href="http://www.cameronmoll.com/archives/001266.html">présentation de Cameron Moll</a> et plus spécifiquement le slide comparant le <em>bon designer</em> au <em>super designer</em>.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.052.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>J'en suis arrivé à la conclusion qu'un <em>bon développeur</em> est <strong>consciencieux</strong>, il connaît ses outils et sait parfaitement obtenir un résultat satisfaisant avec. Qu'est-ce qu'il lui manque alors ?</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.053.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Bien souvent <strong>la curiosité</strong>, celle de fureter pour finalement trouver une solution plus adaptée ou un module qui fait déjà ce qu'il a mis une semaine à coder, celle d'aller à des conférences, de lire des livres, d'essayer de comprendre pourquoi certaines choses ont été faites ainsi. Cette qualité vous permet de vous épanouir quotidiennement dans votre travail.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.054.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Bon avec tous ces conseils, vous allez forcément faire une appli qui va conquérir le monde, faire chuter l'action Google et sauver la planète.</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.055.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <p>Les crédits, merci ! (complètement illisibles, il faut que je trouve un moyen simple de formater ça)</p>
- <p>
- <img
- src="/static/david/biologeek/images/conferences_pycon/django_performances_qualite.056.jpg"
- alt="Django : qualité et performances"
- style="margin: 0pt auto; display: block;"/>
- </p>
-
- <h3>Bilan personnel</h3>
- <p>Je suis beaucoup moins satisfait de ma seconde prestation, j'ai remis en question chaque concept présenté au fur et à mesure, doutant de l'intérêt pour quelqu'un s'intéressant peu à Django. Du coup j'étais un peu hésitant et je pense que ça s'est ressenti.</p>
- <p>Au final, j'ai un peu le sentiment que ceux qui connaissaient pas trop ces problématiques se sont ennuyés et ceux qui y étaient confrontés aussi car je ne suis pas allé assez loin...</p>
- <p>Concernant Keynote (ça vaut pour les deux confs) : aucun problème au niveau des images, par contre je n'ai pas pris le temps de configurer l'écran pour voir le slide suivant + le temps sur l'écran et c'était un tort car ça aide beaucoup.</p>
- <h2>Conclusion</h2>
- <p>Il y a probablement des formats plus appropriés pour aborder les problématiques de performances/qualités comme des tables rondes ou des séances de questions/réponses comme me le suggérait <a href="http://fabien.schwob.org">Fabien</a> par mail. Pour montrer la rapidité de développement de Django et donner envie d'essayer, rien ne vaut un atelier avec un petit projet de mise en bouche. Autant de pistes qu'il faudra explorer lors des journées 2009 !</p>
- <h3>Vous y étiez ?</h3>
- <p><strong>Votre avis m'intéresse énormément</strong>. J'aimerais vraiment pouvoir progresser à ce niveau et vous êtes le mieux placé pour m'aider. J'ai déjà eu des retours par blog (merci <a href="http://sunfox.org/blog/2008/05/19/pycon/">Sunny</a>), par email et sur irc mais si vous avez un peu de temps, n'hésitez pas, je prends le bon mais aussi et surtout le mauvais. N'ayez pas peur d'y aller trop fort, j'encaisse derrière :-).</p>
- <p><strong>[Edit]</strong> : <a href="http://dl.afpy.org/pycon-fr-08/videos/">les vidéos sont en ligne</a> ! Merci l'AFPy.</p>
- </div>
- </article>
- <footer>
- <h6 property="schema:datePublished">— 21/05/2008</h6>
- </footer>
- </section>
- <section>
- <div>
- <h3>Articles peut-être en rapport</h3>
- <ul>
- <li><a href="/david/biologeek/archives/20090313-lelitisme-de-la-curiosite/" title="Accès à ★ L'élitisme de la curiosité">★ L'élitisme de la curiosité</a></li>
- <li><a href="/david/biologeek/archives/20080902-sortie-de-django-10-une-annee-de-nouveautes/" title="Accès à Sortie de Django 1.0, une année de nouveautés">Sortie de Django 1.0, une année de nouveautés</a></li>
- <li><a href="/david/biologeek/archives/20080211-astuces-et-bonnes-pratiques-django/" title="Accès à ★ Astuces et bonnes pratiques Django">★ Astuces et bonnes pratiques Django</a></li>
- </ul>
- </div>
- </section>
- <section>
- <div id="comments">
- <h3>Commentaires</h3>
-
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Neovov</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Ça donne envie ! Dommage que j'ai raté tes présentations.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">kib2</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Merci David :)</p>
-
- <p>Tiens, cadeau : <a href="http://www.gitcasts.com/">http://www.gitcasts.com/</a></p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Xavier</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>A mourir de rire ! Mention spéciale au slide "accessibilité" !</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">kib2</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>J'adore la citation de Jean-Claude VanDamme, les belges ont beaucoup à nous apprendre :)</p>
-
- <p></p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Olivier Mansour</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Bonjour,</p>
-
- <p>Juste un truc, tu ne trouves aucun défaut à Django, ce que la plupart des décideurs trouve excessivement louche. Ils assimilent, avec raison, ce discours à un discours commercial peu objectif.</p>
-
- <p>Pour les prochains couts, je te conseilles de faire un slide sur les autres opportunités que Django et en quoi Django est plus approprié sur tel ou tel projet.</p>
-
- <p>Olivier</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Louevie</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Bonjour,</p>
-
- <p>Je suis actuellement avec intérêt votre site. J'ai également visité le site de Django suite à cet article et j'ai réalisé que vous faisiez partie des 4 "contributeurs". Qu'est que cela signifie exactement? C'est vous qui développez les outils Django ou vous en faites "simplement" la promotion et l'utiliser?</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Louevie</span> le <span class="comment-date" property="schema:commentTime">21/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Désolée... En fait, je viens de voir qu'il y avait le site d'origine en anglais. Vous participez donc à celui en français, c'est bien cela?</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">NiCoS</span> le <span class="comment-date" property="schema:commentTime">22/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>@Olivier Mansour : pour le moment, la seule limitation que j'ai trouvé à Django dans mes petits projets, c'est là structure conditionnelle au niveau des templates qui se limite à "if ... then ... else ...". On peut pas faire des "if ... elif ... elif ... elif ... else". Cela reste néanmoins contournable en utilisant le moteur de template Jinja (très proche de celui de Django) et en modifiant quelques paramètres au niveau de la vue.*</p>
-
- <p>L'autre limitation vient peut être du manque de souplesse au niveau de l'inteface d'admin mais l'intégration de newforms-admin devrait régler ce point et permettre de pouvoir monter aisément ses propres back-office. Mais bon, je n'ai pas encore été confronté à ce problème pour en parler véritablement.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">syntax_error</span> le <span class="comment-date" property="schema:commentTime">22/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>"J'avais déjà présenté Django l'année dernière et j'avais vraiment eu l'impression de passer à côté de ma conf."</p>
-
- <p>Du tout: j'ai assisté à ta conf l'année dernière (pas cette année malheureusement) et ca m'a fait découvrir le framework. Ca et les discutes qui s'en sont suivies lors de l'afpyro du soir m'ont convaincu d'essayer, et depuis je suis fan!</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">22/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>@Neovov : il y a une séance de rattrapage avec les vidéos ;-).</p>
-
- <p>@kib2 : de rien, je l'ai fait tout spécialement pour toi (ton commentaire m'avait bien motivé).</p>
-
- <p>@Xavier : c'est au moins ça !</p>
-
- <p>@Olivier Mansourt : quels défauts ? :-)</p>
-
- <p>Bon ok, tu as tout à fait raison. Si je devais citer quelques inconvénients, je rejoins NiCoS sur le manque de "flexibilité" du framework lorsque tu veux utiliser d'autres composants. C'est possible mais pas trivial.</p>
-
- <p>Il y aussi le problème de ne pas (encore) avoir les responders découplés des collections comme le fait restapi (dont j'ai parlé précédemment) mais je bosse là-dessus activement.</p>
-
- <p>@Louevie : concernant django-fr, il s'agit de la promotion du framework et de support francophone, après j'essaye d'aider à mon échelle en soumettant des patchs ou des idées pour améliorer le framework.</p>
-
- <p>@syntax_error : cool ! Ah qu'est-ce qu'on ferait pas sans les afpyros :-)</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Gwen</span> le <span class="comment-date" property="schema:commentTime">23/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Salut David,</p>
-
- <p>franchement, tes confs étaient de loin les meilleurs !</p>
-
- <p>Globalement, on sent bien que tu maitrises ton sujet à 200%, mais ce n'est pas là que tu fais la différence, car d'autres conférenciers étaient dans ce même cas.</p>
-
- <p>Là où tu as surpassé les autres, c'est dans la forme. Tes slides étaient très bien préparées et surtout contenaient le strict minimum "à la Steve Jobs ;)". Pour moi, un bon orateur est accompagné par ses slides et non pas l'inverse.</p>
-
- <p>Maintenant, si tu veux progresser voici quelques pistes:<br />- évite d'avoir le même ton tout au long du discours<br />- pose le micro sur ton menton (ou un micro cravate)<br />- soit plus posé sur scène, là c'est peut être dû aux abus de la veille ;)</p>
-
- <p></p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Julien</span> le <span class="comment-date" property="schema:commentTime">26/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>J'abonderai dans le sens d'Olivier. C'est un peu Alice au pays des merveilles d'autant que tes diapos sont minimalistes et font plus marketing que techniques.<br />Personnellement cela me fait plus penser à une présentation d'étudiant qu'à une présentation de professionnel. Je n'ai toutefois pas assisté à ta présentation alors je ne sais pas si tu étais + pro dans le discours. <br />En tout cas si les diapo doivent accompagner l'orateur elles doivent aussi porter le message ce qui permet à ceux qui n'écoute que d'une oreille de lire, et donc suivre, le topo.</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">27/05/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>@Gwen : <ému>merci</ému>, concernant les pistes, ça rejoint celles que je me suis fait (et dont j'ai fait part à l'afpy concernant le micro).</p>
-
- <p>@Julien : pour moi une conf technique ça n'existe pas, un atelier oui s'il reste en comité restreint, mais dès qu'il y a une centaine de personne dans la salle tu es sûr d'en perdre la moitié en cours de route.</p>
-
- <p>Ce que je trouve important lorsque je vais à une conf c'est le point de vue de l'orateur, son expérience face à une certaine situation/techno. Après pour la technique pure, rien ne remplacera la doc ou une formation.</p>
-
- <p>Enfin concernant ceux qui ne suivent que d'un œil, je comprends très bien que l'on puisse ne pas apprécier Django, mais c'est un peu le prix à payer dans ce cas, si on veut un résumé de Django à coup de listes il y a d'autres lieux où le trouver, c'était pas mon objectif (c'était même presque un contre-objectif).</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">cambuntu</span> le <span class="comment-date" property="schema:commentTime">23/08/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Bonjour, grace a vous j'ai pu installer django sur mon ubuntu, j'ai télécharger la paquet sur <a href="http://package.ubuntu.com">http://package.ubuntu.com</a> et sa marche je fait joujoute avec cela fait un bon bout.<br />Svp comment puis jel'utiliser conjointement avec Yahoo UI library ou d'autre framework css et javascript car je voudrais une interface public aussi reactive que mon interface d'administration. J'ai aussi besoin de quelques informations pour une utilisation avancé des newsforms et de l'extensions de mon interface d'administration<br />Excusez moi pour autant de question vous êtes ma reference francophone sur django Merci</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">23/08/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Django permet une utilisation de n'importe quel framework frontend mais ne propose pas de helpers spécifiques par défaut.</p>
-
- <p>Concernant les css, il suffit généralement de lier un fichier donc c'est loin d'être problématique.</p>
-
- <p>Pour le JavaScript, c'est plus délicat mais c'est le prix à payer pour avoir la liberté d'utiliser le framework que l'on préfère. Cela dit c'est loin d'être handicapant, il s'agit généralement d'appliquer les bonnes classes aux formulaires si on pratique du js non intrusif et propre.</p>
-
- <p>J'ai pas vraiment de conseils là-dessus, si ce n'est de bien comprendre comment fonctionnent les forms (anciennement newforms) Django pour pouvoir facilement les adapter.</p>
-
- <p>Bon courage, ne pas hésiter à poser ses questions sur la liste de diffusion ou sur irc (cf <a href="http://django-fr.org">http://django-fr.org</a>)</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Jean-Pierre</span> le <span class="comment-date" property="schema:commentTime">26/09/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Bonjour à tous, <br />Comme je l'ai déjà signalé, je serai plutôt de l'autre coté de la barrière (décideur business) et je suis très tenté de lancer mes prochains projets en Django.<br />Mon plus gros problème est de trouver des sociétés de développement qui le font (j'en ai une en Allemagne) mais j'aimerai beaucoup avoir d'autre agence web/société de développement qui utilise ce framework, où que ce soit en Europe, juste par sécurité. (et c'est peut être ce qui manque dans ta présentation David: une liste de companies qui utilise le framework).</p>
-
- <p>Merci de m'aider les gars !</p>
-
- <p></p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">Kedare</span> le <span class="comment-date" property="schema:commentTime">17/11/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>Simple curiosité, tu a utilisé quoi pour faire tes slides ? je le trouve très bien fait :)</p>
- </div>
- </div>
- <div class="comment" typeof="schema:UserComments">
- <p class="comment-meta">
- <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">17/11/2008</span> :
- </p>
- <div class="comment-content" property="schema:commentText">
- <p>@Jean-Pierre : quelques pistes dans ce billet :<br /><a href="https://larlet.fr/david/biologeek/archives/20080927-qui-propose-du-django-en-france/">https://larlet.fr/david/biologeek/archives/20080927-qui-propose-du-django-en-france/</a></p>
-
- <p>@Kedare : la réponse est dans le billet : Keynote.</p>
- </div>
- </div>
-
- </div>
- </section>
-
-
- <footer>
- <nav>
- <p>
- <small>
- Je réponds quasiment toujours aux <a href="mailto:david%40larlet.fr" title="Envoyer un email">emails</a> (<a href="/david/signature/" title="Ma signature actuelle avec possibilité de chiffrement">signés</a>) et vous pouvez me rencontrer à Montréal. <span class="more-infos">N’hésitez pas à <a href="/david/log/" title="Être tenu informé des mises à jour">vous abonner</a> pour être tenu informé des publications récentes.</span>
- </small>
- </p>
- </nav>
- </footer>
-
- </div>
-
- <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
-
- <script data-no-instant>InstantClick.init()</script>
-
- </body>
- </html>
|