Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

5 роки тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <!doctype html>
  2. <html lang=fr>
  3. <head>
  4. <!-- Always define the charset before the title -->
  5. <meta charset=utf-8>
  6. <title>Un projet Python : de l&#39;idée à la publication — Biologeek — David Larlet</title>
  7. <!-- 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) -->
  8. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  9. <!-- Fake favicon, to avoid extra request to the server -->
  10. <link rel="icon" href="data:;base64,iVBORw0KGgo=">
  11. <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
  12. <link rel="manifest" href="/manifest.json">
  13. <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
  14. <noscript>
  15. <style type="text/css">
  16. /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
  17. body {
  18. font-family: 'EquityTextB', serif;
  19. }
  20. h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
  21. font-family: 'EquityCapsB', sans-serif;
  22. font-variant: normal;
  23. }
  24. </style>
  25. </noscript>
  26. <!-- Canonical URL for SEO purposes -->
  27. <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20101203-un-projet-python-de-lidee-la-publication">
  28. </head>
  29. <body>
  30. <div>
  31. <header>
  32. <nav>
  33. <p>
  34. <small>
  35. 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>.
  36. </small>
  37. </p>
  38. </nav>
  39. </header>
  40. <section>
  41. <h1 property="schema:name">Un projet Python : de l&#39;idée à la publication</h1>
  42. <article typeof="schema:BlogPosting">
  43. <div property="schema:articleBody">
  44. <img src="/static/david/biologeek/images/logos/graphe-social.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
  45. <p>J'aime coder en Python mais pas uniquement pour l'esthétique ou la puissance du langage, j'apprécie l'écosystème me permettant de concrétiser une idée en quelques commandes. Je vais prendre un exemple concret avec l'idée du jour qui était de créer un triple store à partir de redis_graph suite à <a href="http://twitter.com/#!/rgaidot/status/10317008201580544">un tweet de Régis Gaidot</a>.</p>
  46. <p>Au final, je n'aurais pas utilisé redis_graph car l'implémentation utilisant des sets était limitante et je préférais avoir recours à des hashs mais ce n'est pas l'objet du billet. Je vais essayer de décrire commande par commande ce que j'ai pu faire cette après midi.</p>
  47. <h2>Initialisation</h2>
  48. <p>On commence par installer redis, pour ça l'utilisation de <a href="http://mxcl.github.com/homebrew/">homebrew</a> sur mac est vraiment une bénédiction quand on a connu la puissance d'apt-get...</p>
  49. <pre><code>$ brew install redis
  50. </code></pre>
  51. <p>Et ensuite il faut un peu deviner comment lancer le serveur (bon ok, ou lire la doc), tiens il y a des redis-* dans mon path, essayons redis-server, bingo ! Et voilà notre serveur de test lancé, pas trop besoin de se préoccuper de la configuration pour l'instant.</p>
  52. <p>Passons à l'environnement Python, ici on utilise <a href="http://virtualenv.openplans.org/">virtualenv</a> (associé à <a href="http://www.doughellmann.com/projects/virtualenvwrapper/">virtualenvwrapper</a>) qui est la solution miracle que tout le monde attendait pour avoir des environnements Python virtuels indépendants. Et on installe les dépendances :</p>
  53. <pre><code>$ mkvirtualenv redis_triplestore --no-site-packages
  54. $ cd your/path/
  55. $ workon redis_triplestore
  56. $ pip install -e git+https://github.com/andymccurdy/redis-py.git#egg=redispy
  57. $ pip install redis_wrap
  58. $ pip install redis_graph
  59. </code></pre>
  60. <p>Pour éviter d'avoir à installer les dépendances à la main pour notre projet, on génère tout de suite un fichier requirements.txt qui permettra de faire ça en une fois :</p>
  61. <pre><code>$ pip freeze &gt; requirements.txt
  62. </code></pre>
  63. <p>Il y a l'<a href="http://blog.akei.com/post/573774396/installer-django-dans-un-environnement-python-virtuel">excellent billet de Nico</a> si vous voulez un peu plus de détail sur tout ça.</p>
  64. <h2>Développement</h2>
  65. <p>Ici vous commencez à coder votre idée, pas grand chose à dire là-dessus. J'ai décidé de mettre directement les tests dans le fichier car je voulais que ça tienne dans un snippet avant d'en faire un vrai projet.</p>
  66. <p>J'ai juste encore une fois été étonné par la rapidité de Redis, au point de me demander au début si mes tests étaient bien évalués !</p>
  67. <p>Je trouve ça élégant de pouvoir concrétiser une idée en une cinquantaine de lignes, juste pour le fun ;-).</p>
  68. <h2>Publicaiton</h2>
  69. <p>Si j'hésite à publier ce genre de bêtise codée en 2h c'est car ça implique une certaine responsabilité et maintenance qui est chronophage (et pas vraiment enthousiasmante non plus...). Mais je me dis que ça peut être utile, au même titre que redis_wrap dont je me suis servi avec satisfation.</p>
  70. <p>Ici c'est l'étape technique du setup.py qui consiste généralement en un copier/coller d'un autre/ancien projet qu'il faut adapter. Pour vérifier qu'il fonctionne bien :</p>
  71. <pre><code>$ python setup.py sdist
  72. </code></pre>
  73. <p>Ok, votre paquet est créé, commençons par mettre le code quelque part. Ça dépend de vos préférences, je préfère mercurial donc je pousse ça sur <a href="https://bitbucket.org/">Bitbucket</a> :</p>
  74. <pre><code># Création du dépôt sur Bitbucket
  75. $ hg init .
  76. $ mate .hg/hgrc
  77. # Ajout de l'URL du dépôt
  78. $ hg add
  79. $ hg ci -m "Initial implementation"
  80. $ hg tag "0.1"
  81. $ hg push
  82. </code></pre>
  83. <p>Vous pouvez faire les premières étapes dans un autre ordre mais de mémoire, si vous clonez et que vous avez déjà un dossier du même nom correspondant au projet, ça va râler.</p>
  84. <p>Finalisons le setup.py avec 2/3 urls et enregistrons le projet sur pypi :</p>
  85. <pre><code>$ python setup.py register
  86. $ python setup.py sdist upload
  87. </code></pre>
  88. <p>Et voilà ! Votre projet est <a href="http://code.welldev.org/redis_triplestore">accessible à tous</a> et <a href="http://pypi.python.org/pypi/redis_triplestore">installable par tous</a>, il ne reste plus qu'à en faire la promotion :-).</p>
  89. </div>
  90. </article>
  91. <footer>
  92. <h6 property="schema:datePublished">— 03/12/2010</h6>
  93. </footer>
  94. </section>
  95. <section>
  96. <div>
  97. <h3>Articles peut-être en rapport</h3>
  98. <ul>
  99. <li><a href="/david/biologeek/archives/20110426-bilan-sur-les-rencontres-django-2011/" title="Accès à Bilan sur les rencontres Django 2011">Bilan sur les rencontres Django 2011</a></li>
  100. <li><a href="/david/biologeek/archives/20101210-format-de-conference-pour-les-rencontres-django-2011/" title="Accès à Format de conférence pour les rencontres Django 2011">Format de conférence pour les rencontres Django 2011</a></li>
  101. <li><a href="/david/biologeek/archives/20101130-de-lopendata-au-linkeddata-exemple-de-nosdonneesfr/" title="Accès à ★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr">★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr</a></li>
  102. </ul>
  103. </div>
  104. </section>
  105. <section>
  106. <div id="comments">
  107. <h3>Commentaires</h3>
  108. <div class="comment" typeof="schema:UserComments">
  109. <p class="comment-meta">
  110. <span class="comment-author" property="schema:creator">Julien</span> le <span class="comment-date" property="schema:commentTime">17/12/2010</span> :
  111. </p>
  112. <div class="comment-content" property="schema:commentText">
  113. <p>Python un langage apoptotique que plus personne de sérieux ne peut envisager utiliser.</p>
  114. </div>
  115. </div>
  116. <div class="comment" typeof="schema:UserComments">
  117. <p class="comment-meta">
  118. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">19/12/2010</span> :
  119. </p>
  120. <div class="comment-content" property="schema:commentText">
  121. <p>Et pourtant il a gagné une place cette année sur l&#39;index TIOBE qui confirme la progression :<br /><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html</a></p>
  122. <p>Comme quoi...</p>
  123. </div>
  124. </div>
  125. <div class="comment" typeof="schema:UserComments">
  126. <p class="comment-meta">
  127. <span class="comment-author" property="schema:creator">RT</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
  128. </p>
  129. <div class="comment-content" property="schema:commentText">
  130. <p>Le magnifique Python a un avenir un peu flou, mais tant qu&#39;il reste promu par Google (entre autres), son apoptose reste hypothétique.</p>
  131. </div>
  132. </div>
  133. <div class="comment" typeof="schema:UserComments">
  134. <p class="comment-meta">
  135. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
  136. </p>
  137. <div class="comment-content" property="schema:commentText">
  138. <p>&quot;un peu flou&quot; ?!</p>
  139. <p>C&#39;est le langage de l&#39;année pour TIOBE quand même, il faut arrêter de croire que le Python est peu utilisé…</p>
  140. </div>
  141. </div>
  142. <div class="comment" typeof="schema:UserComments">
  143. <p class="comment-meta">
  144. <span class="comment-author" property="schema:creator">RT</span> le <span class="comment-date" property="schema:commentTime">12/01/2011</span> :
  145. </p>
  146. <div class="comment-content" property="schema:commentText">
  147. <p>Le &quot;flou&quot; du post précédent ne qualifiait pas l&#39;adhésion des programmeurs envers Python, mais concernait la promotion de 3.0 ou 3.1 qui me semble assez peu utilisé aujourd&#39;hui par rapport à une 2.4, 2.5 (celle utilisé pour appengine par exemple) ou plus.</p>
  148. </div>
  149. </div>
  150. <div class="comment" typeof="schema:UserComments">
  151. <p class="comment-meta">
  152. <span class="comment-author" property="schema:creator">Daniel</span> le <span class="comment-date" property="schema:commentTime">22/11/2011</span> :
  153. </p>
  154. <div class="comment-content" property="schema:commentText">
  155. <p>Ah le python quel doux langage.</p>
  156. <p>En ce qui me concerne dés qu&#39;il est question d&#39;écrire un peut de code je l&#39;utilise.</p>
  157. <p>En quelques lignes on a quelques choses de fonctionnel.</p>
  158. </div>
  159. </div>
  160. </div>
  161. </section>
  162. <footer>
  163. <nav>
  164. <p>
  165. <small>
  166. Je réponds quasiment toujours aux <a href="m&#x61;ilto:d&#x61;vid%40l&#x61;rlet&#46;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>
  167. </small>
  168. </p>
  169. </nav>
  170. </footer>
  171. </div>
  172. <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
  173. <script data-no-instant>InstantClick.init()</script>
  174. </body>
  175. </html>