tag:linuxfr.org,2005:/users/pitrouLinuxFr.org : les contenus de Antoine2015-11-27T01:52:57+01:00/favicon.pngtag:linuxfr.org,2005:News/368102015-11-27T01:52:57+01:002015-11-27T01:52:57+01:00Numba 0.22.1Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Numba, l'optimiseur Python spécialisé dans le calcul numérique, est sorti en version 0.22.1. Numba est un compilateur juste-à-temps (JIT ou JàT) pour Python, basé sur LLVM, permettant d'optimiser du code de calcul numérique, notamment basé sur Numpy. Cette nouvelle version participe du processus habituel de sorties (une nouvelle version tous les un à deux mois) et apporte son lot de nouvelles fonctionnalités et de corrections de bugs.</p></div><ul><li>lien nᵒ 1 : <a title="https://linuxfr.org/news/numba-0-14" hreflang="fr" href="https://linuxfr.org/redirect/95374">Dépêche précédente (Numba 0.14 + présentation du projet)</a></li><li>lien nᵒ 2 : <a title="http://numba.pydata.org/" hreflang="en" href="https://linuxfr.org/redirect/95375">Site officiel (page d'accueil)</a></li><li>lien nᵒ 3 : <a title="http://numba.pydata.org/numba-doc/dev/index.html" hreflang="en" href="https://linuxfr.org/redirect/95376">Documentation</a></li><li>lien nᵒ 4 : <a title="https://github.com/numba/numba/" hreflang="en" href="https://linuxfr.org/redirect/95377">Page Github (code et suivi de bugs)</a></li><li>lien nᵒ 5 : <a title="http://numba.pydata.org/numba-doc/dev/release-notes.html" hreflang="en" href="https://linuxfr.org/redirect/95378">Notes de version</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#quest-ce-que-numba">Qu'est-ce que Numba ?</a></li>
<li><a href="#alternatives">Alternatives</a></li>
<li>
<a href="#nouveaut%C3%A9s-de-la-version-022">Nouveautés de la version 0.22</a><ul>
<li><a href="#prise-en-charge-de-python-35-et-numpy-110">Prise en charge de Python 3.5 et Numpy 1.10</a></li>
<li><a href="#compilation-hors-ligne">Compilation hors ligne</a></li>
<li><a href="#am%C3%A9liorations-de-la-vectorisation-automatique">Améliorations de la vectorisation automatique</a></li>
<li><a href="#am%C3%A9liorations-de-lindexation-des-tableaux">Améliorations de l'indexation des tableaux</a></li>
<li><a href="#optimisation-de-la-mise-en-cache-des-fonctions">Optimisation de la mise en cache des fonctions</a></li>
<li><a href="#passage-de-listes-en-param%C3%A8tre-dune-fonction">Passage de listes en paramètre d'une fonction</a></li>
<li><a href="#tri-de-tableaux-et-de-listes">Tri de tableaux et de listes</a></li>
<li><a href="#corrections-pour-armv7">Corrections pour ARMv7</a></li>
</ul>
</li>
</ul><h2 id="quest-ce-que-numba">Qu'est-ce que Numba ?</h2>
<p>Le but de cette dépêche n'est pas de faire une présentation détaillée de Numba et le lecteur est renvoyé à <a href="//linuxfr.org/news/numba-0-14">la dépêche précédente sur Numba 0.14</a>.</p>
<p>En résumé, Numba est un compilateur juste-à-temps, sur demande, prenant en charge un sous-ensemble de Python et permettant d'accélérer les calculs scientifiques réalisés avec ce langage et la bibliothèque <a href="http://www.numpy.org/">Numpy</a>. En échange de ces limitations, le code compilé avec Numba approche ou égale habituellement la vitesse d'un code équivalent écrit en C ou Fortran. Numba permet également de compiler du code Python pour l'exécution sur un GPU, avec à la clé un potentiel d'accélération encore plus grand.</p>
<h2 id="alternatives">Alternatives</h2>
<p>Il existe quelques alternatives à Numba :</p>
<ul>
<li>
<a href="https://pythonhosted.org/pythran/">Pythran</a> est un compilateur hors-ligne produisant une extension compilée en C++ après traduction de votre code Python en C++</li>
<li>
<a href="http://cython.org/">Cython</a> permet de coder des modules d'extensions dans un sur-ensemble de Python, avec des annotations optionnelles</li>
<li>
<a href="http://pypy.org/">PyPy</a> est une implémentation alternative de Python bien connue, qui intègre un compilateur juste-à-temps prenant en charge l'ensemble de la sémantique de Python</li>
</ul><h2 id="nouveautés-de-la-version-022">Nouveautés de la version 0.22</h2>
<h3 id="prise-en-charge-de-python-35-et-numpy-110">Prise en charge de Python 3.5 et Numpy 1.10</h3>
<p>Numba fonctionnait déjà avec Python 2.6, 2.7, 3.3 et 3.4, ainsi que Numpy 1.6 à 1.9. Cette nouvelle version ajoute la prise en charge de Python 3.5 et Numpy 1.10. Cela ne veut pas dire que les fonctionnalités ajoutées à ces nouvelles versions sont toutes prises en charge, mais que les fonctionnalités pré-existantes marchent correctement et sont validées par la plateforme d'intégration continue (constituée d'un premier niveau, sous Linux seulement, avec Travis-CI, et un deuxième niveau intégrant Linux, OS X et Windows sur un jeu de machines interne à Continuum). De plus, des paquets binaires sont fournis sur la plateforme <a href="https://www.continuum.io/why-anaconda">Anaconda</a>.</p>
<h3 id="compilation-hors-ligne">Compilation hors ligne</h3>
<p>Numba fournit désormais <a href="http://numba.pydata.org/numba-doc/dev/user/pycc.html">une fonctionnalité de compilation hors ligne</a> (<em>Ahead of Time</em> en anglais) permettant de créer, à l'instar de Cython ou Pythran, un module d'extension compilé contenant les fonctions désirées. Cette fonctionnalité existait déjà en interne mais n'était pas documentée à cause de trop nombreuses limitations. Une bonne partie de ces limitations est désormais levée, et une intégration avec <code>distutils</code> et <code>setuptools</code> a été ajoutée.</p>
<p>La compilation juste-à-temps reste le cas d'usage privilégié de Numba, mais ce mode de compilation alternatif permettra à ceux qui le désirent de distribuer du code compilé sans dépendance à Numba, et une réduction des coûts de démarrage.</p>
<h3 id="améliorations-de-la-vectorisation-automatique">Améliorations de la vectorisation automatique</h3>
<p>Des fonctionnalités qui étaient auparavant uniquement fournies dans l'extension propriétaire de Numba, NumbaPro, sont désormais disponibles dans le projet de base. Elles incluent :</p>
<ul>
<li>l'ajout du parallélisme automatique pour les <a href="http://numba.pydata.org/numba-doc/dev/user/vectorize.html">fonctions universelles</a> compilées par Numba : dans ce mode, le calcul est automatiquement distribué sur autant de fils d'exécution matériels que n'en expose le CPU</li>
<li>une fonction permettant de <a href="http://numba.pydata.org/numba-doc/dev/cuda/reduction.html">générer automatiquement des réductions en CUDA</a> : une réduction consiste par exemple à générer la fonction somme (d'un tableau) depuis l'opérateur d'addition ; implémenter efficacement une réduction en CUDA n'est pas trivial, car il faut choisir une taille optimale pour les blocs de threads, et synchroniser correctement les accès aux tableaux de résultats partiels</li>
<li>la possibilité de compiler des <a href="http://numba.pydata.org/numba-doc/dev/cuda/ufunc.html">fonctions universelles pour l'exécution en CUDA</a> (et aussi sur les architectures HSA d'AMD)</li>
</ul><h3 id="améliorations-de-lindexation-des-tableaux">Améliorations de l'indexation des tableaux</h3>
<p>Les tableaux Numpy peuvent être indexés <a href="https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html">de multiples façons</a> (totale, partielle, par entiers, par plages d'entiers, par tableaux de booléens, etc.). Numba comprend désormais toutes les possibilités d'indexation basique et un sous-ensemble des possibilités d'indexation farfelue (ou <em>fancy indexing</em>).</p>
<h3 id="optimisation-de-la-mise-en-cache-des-fonctions">Optimisation de la mise en cache des fonctions</h3>
<p>Numba propose de manière optionelle (désactivée par défaut), de mettre en cache les fonctions compilées juste-à-temps, permettant de réduire largement les temps de compilation. Cette mise en cache procédait auparavant à une sérialisation de la représentation intermédiaire (<em>IR</em>) LLVM, elle sauvegarde désormais le code objet final de la fonction, permettant un gain de temps additionnel.</p>
<p>À noter que cette fonctionnalité est distincte de la compilation hors-ligne, bien que ses bienfaits puissent sembler similaires.</p>
<h3 id="passage-de-listes-en-paramètre-dune-fonction">Passage de listes en paramètre d'une fonction</h3>
<p>Numba ne permettait pas de passer une liste Python à une fonction compilée, car les modifications faites à la liste par la fonction n'étaient pas visibles par l'interpréteur. Cela est désormais autorisé, et les modifications sont répercutées à la fin de l'exécution de la fonction.</p>
<p>Ce nouveau comportement peut sembler étrange, mais est dû au fait que Numba transforme d'abord la liste Python en un vecteur natif. Par exemple, la fonction native reçoit un tableau linéaire d'entiers 64 bits plutôt qu'un tableau de pointeurs vers des objets typés.</p>
<h3 id="tri-de-tableaux-et-de-listes">Tri de tableaux et de listes</h3>
<p>Numba implémente désormais la méthode <code>sort()</code> sur les tableaux et les listes, ainsi que la fonction standard <code>sorted()</code>. L'algorithme utilisé est un <a href="https://en.wikipedia.org/wiki/Quicksort">tri rapide</a> assez simple ; il n'est donc pas stable, ce qui ne pose pas de problème, étant donné l'éventail des types de données actuellement pris en charge.</p>
<p>Pour l'anecdote, le tri rapide est, dans les cas non-triviaux, beaucoup plus rapide que <a href="https://en.wikipedia.org/wiki/Timsort">timsort</a> (l'algorithme standard de CPython) sur des tableaux de données natives ; cela rejoint l'expérience de Java, qui utilise un tri rapide pour les types valeur et timsort pour les types objet.</p>
<h3 id="corrections-pour-armv7">Corrections pour ARMv7</h3>
<p>Des changements ont été effectués pour réussir à faire tourner la suite de tests sans erreurs sur une machine armv7l (en l'occurrence, un <a href="http://www.hardkernel.com/main/products/prdt_info.php">ODROID-XU4</a>, mais le résultat devrait également fonctionner sous un Raspberry Pi 2). Notons qu'ARM n'est cependant pas officiellement pris en charge : il n'y a pas d'intégration continue sur ces architectures.</p></div><div><a href="https://linuxfr.org/news/numba-0-22-1.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/107114/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/numba-0-22-1#comments">ouvrir dans le navigateur</a>
</p>
AntoineLucasNÿcoBAudpalm123https://linuxfr.org/nodes/107114/comments.atomtag:linuxfr.org,2005:News/356832014-09-18T07:47:16+02:002014-09-19T08:49:55+02:00Numba 0.14Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Numba, l'optimiseur Python spécialisé dans le calcul numérique, est sorti en version 0.14. Numba est un compilateur juste-à-temps (JIT) pour Python, basé sur LLVM, permettant d'optimiser du code de calcul numérique, notamment basé sur Numpy. Il est compatible avec CPython 2.6, 2.7, 3.3 et 3.4. Des paquets binaires sont disponibles via Anaconda, la distribution de paquets binaires dédiée au calcul scientifique maintenue par Continuum Analytics, l'entreprise qui développe Numba.</p></div><ul><li>lien nᵒ 1 : <a title="http://numba.pydata.org/" hreflang="en" href="https://linuxfr.org/redirect/91525">Numba - site officiel</a></li><li>lien nᵒ 2 : <a title="http://conda.pydata.org/miniconda.html" hreflang="en" href="https://linuxfr.org/redirect/91526">Miniconda - pour un déploiement minimal d'Anaconda</a></li><li>lien nᵒ 3 : <a title="http://numba.pydata.org/numba-doc/0.14/releases.html" hreflang="en" href="https://linuxfr.org/redirect/91527">Numba 0.14 - notes de sortie</a></li><li>lien nᵒ 4 : <a title="https://github.com/numba/numba/" hreflang="en" href="https://linuxfr.org/redirect/91528">Page GitHub de Numba (code source, bug tracker)</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#quest-ce-que-numba">Qu'est-ce que Numba ?</a><ul>
<li><a href="#-cpython">… CPython ?</a></li>
<li><a href="#-sp%C3%A9cialis%C3%A9">… Spécialisé ?</a></li>
<li><a href="#-juste-%C3%A0-temps">… Juste à temps ?</a></li>
</ul>
</li>
<li><a href="#plateformes-support%C3%A9es">Plateformes supportées</a></li>
<li><a href="#un-exemple">Un exemple</a></li>
<li><a href="#principe-de-fonctionnement">Principe de fonctionnement</a></li>
<li>
<a href="#limitations">Limitations</a><ul>
<li><a href="#types-support%C3%A9s">Types supportés</a></li>
<li><a href="#constructions-support%C3%A9es">Constructions supportées</a></li>
<li><a href="#fonctions-support%C3%A9es">Fonctions supportées</a></li>
<li><a href="#diff%C3%A9rences-s%C3%A9mantiques">Différences sémantiques</a></li>
</ul>
</li>
<li><a href="#numba-et-l%C3%A9cosyst%C3%A8me-python">Numba et l'écosystème Python</a></li>
<li><a href="#statut-du-projet">Statut du projet</a></li>
<li><a href="#contribuer">Contribuer</a></li>
</ul><h2 id="quest-ce-que-numba">Qu'est-ce que Numba ?</h2>
<p>Numba est un compilateur juste à temps pour CPython spécialisé dans l'optimisation de code scientifique.</p>
<h3 id="-cpython">… CPython ?</h3>
<p>CPython est l'implémentation par défaut (ou "de référence", en langage politiquement correct) de Python. Les autres implémentations s'appellent PyPy, Jython, etc.</p>
<h3 id="-spécialisé">… Spécialisé ?</h3>
<p>Numba ne prétend pas être capable d'optimiser tous les types de code Python, ni même toutes les constructions du langage (même si cela n'est pas exclu comme objectif à long terme). Numba est capable d'optimiser les calculs numériques et scientifiques impliquant des entiers, des flottants, des complexes ; il est capable de reconnaître certaines types de données bien connus, comme les tableaux Numpy.</p>
<p>La liste des fonctionnalités optimisables grandit évidemment de version en version, par exemple la version 0.14 supporte désormais les types <code>numpy.datetime64</code> et <code>numpy.timedelta64</code>, qui permettent de faire des calculs sur des séries temporelles.</p>
<h3 id="-juste-à-temps">… Juste à temps ?</h3>
<p>Numba fonctionne lors de l'exécution de votre code Python. Il suffit d'apposer le décorateur "<code>@numba.jit</code>" à une fonction pour la faire optimiser par Numba (certains aiment prier pour qu'il arrive à l'optimiser). Il n'y a pas de phase de compilation séparée, ni de ligne de commande à lancer.</p>
<h2 id="plateformes-supportées">Plateformes supportées</h2>
<p>Numba utilise LLVM, ce qui permet une portabilité relativement aisée. Actuellement, les systèmes sous Linux, OS X et Windows sont supportés. Côté matériel, x86, x86-64 sont supportés et il y a également un backend CUDA (avec des limitations).</p>
<h2 id="un-exemple">Un exemple</h2>
<p>Partons de notre ami l'ensemble de Mandelbrot. Pour cela, posons la fonction suivante dans un fichier nommé <code>mandel.py</code> :</p>
<pre><code class="python"><span class="kn">import</span> <span class="nn">numpy</span>
<span class="k">def</span> <span class="nf">mandelbrot</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">):</span>
<span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span> <span class="o">=</span> <span class="o">-</span><span class="mf">2.0</span><span class="p">,</span> <span class="mf">1.0</span>
<span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span>
<span class="n">arr</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="n">height</span><span class="p">,</span> <span class="n">width</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
<span class="n">xs</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">x_min</span><span class="p">,</span> <span class="n">x_max</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">width</span><span class="p">)</span>
<span class="n">ys</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="n">y_min</span><span class="p">,</span> <span class="n">y_max</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="n">height</span><span class="p">)</span>
<span class="n">max_iters</span> <span class="o">=</span> <span class="mi">20</span>
<span class="k">for</span> <span class="n">idx_x</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">xs</span><span class="p">):</span>
<span class="k">for</span> <span class="n">idx_y</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">ys</span><span class="p">):</span>
<span class="n">c</span> <span class="o">=</span> <span class="nb">complex</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="n">z</span> <span class="o">=</span> <span class="mf">0.0j</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_iters</span><span class="p">):</span>
<span class="n">z</span> <span class="o">=</span> <span class="n">z</span> <span class="o">*</span> <span class="n">z</span> <span class="o">+</span> <span class="n">c</span>
<span class="k">if</span> <span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">real</span> <span class="o">+</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span> <span class="o">*</span> <span class="n">z</span><span class="o">.</span><span class="n">imag</span> <span class="o">>=</span> <span class="mi">4</span><span class="p">:</span>
<span class="c"># Hors de l'ensemble</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="c"># Dans l'ensemble</span>
<span class="n">arr</span><span class="p">[</span><span class="n">idx_y</span><span class="p">,</span> <span class="n">idx_x</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">return</span> <span class="n">arr</span></code></pre>
<p>Cette fonction renvoie un tableau d'entiers Numpy indiquant si un point fait partie de l'ensemble de Mandelbrot (1) ou non (0).</p>
<p>Maintenant, lançons un Python depuis le même répertoire :</p>
<pre><code class="python"><span class="o">>>></span> <span class="kn">import</span> <span class="nn">mandel</span>
<span class="o">>>></span> <span class="k">print</span><span class="p">(</span><span class="n">mandel</span><span class="o">.</span><span class="n">mandelbrot</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">15</span><span class="p">))</span>
<span class="p">[[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]]</span></code></pre>
<p>Ouf, ça ressemble :-) Maintenant compilons cette même fonction avec Numba :</p>
<pre><code class="python"><span class="o">>>></span> <span class="kn">from</span> <span class="nn">numba</span> <span class="kn">import</span> <span class="n">jit</span>
<span class="o">>>></span> <span class="n">opt</span> <span class="o">=</span> <span class="n">jit</span><span class="p">(</span><span class="n">mandel</span><span class="o">.</span><span class="n">mandelbrot</span><span class="p">)</span>
<span class="o">>>></span> <span class="k">print</span><span class="p">(</span><span class="n">opt</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="mi">15</span><span class="p">))</span>
<span class="p">[[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">1</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]</span>
<span class="p">[</span><span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">0</span><span class="p">]]</span></code></pre>
<p>Et lançons un benchmark d'une scientificité rigoureuse sur un tableau de 200x200 :</p>
<pre><code class="python"><span class="o">>>></span> <span class="kn">import</span> <span class="nn">timeit</span>
<span class="o">>>></span> <span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s">"mandel.mandelbrot(200, 200)"</span><span class="p">,</span> <span class="n">setup</span><span class="o">=</span><span class="s">"import mandel"</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="mf">0.20483311700081686</span>
<span class="o">>>></span> <span class="n">timeit</span><span class="o">.</span><span class="n">timeit</span><span class="p">(</span><span class="s">"opt(200, 200)"</span><span class="p">,</span> <span class="n">setup</span><span class="o">=</span><span class="s">"from __main__ import opt"</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="mf">0.003343598000355996</span></code></pre>
<p>Sur ce cas d'usage d'une grande importance, Numba est ainsi 60 fois plus rapide que l'interpréteur CPython !</p>
<h2 id="principe-de-fonctionnement">Principe de fonctionnement</h2>
<p>Numba est un optimiseur fonction par fonction. Il part de la fonction que vous décorez avec <code>numba.jit</code> et lance une inférence de types pour essayer d'assigner un type précis à chaque variable et valeur intermédiaire dans la fonction. Pour cela, il utilise des règles dédiées à chaque opérateur, fonction standard, etc.</p>
<p>Pour définir les types de départ du processus d'inférence, il y a en réalité deux possibilités :</p>
<ul>
<li>Dans l'utilisation de base de <code>numba.jit</code>, l'utilisateur ne passe pas de paramètres : c'est alors lors de l'appel de la fonction décorée que les types des arguments sont utilisés pour lancer le processus d'inférence (la compilation est ici paresseuse).</li>
<li>Dans une utilisation avancée, l'utilisateur peut décrire explicitement les types à l'entrée de la fonction (cela lui permet, par exemple, de choisir des flottants simple précision plutôt que double précision) ; dans ce cas, la compilation a lieu immédiatement.</li>
</ul><p>L'inférence de type est l'étage fondamental qui permet ensuite de produire du code travaillant sur des types bas niveau, plutôt qu'au niveau du modèle objet de Python, qui est beaucoup plus difficile à optimiser. Bien entendu, la chaîne de traitement (<em>pipeline</em>) est constituée de multiples étages :</p>
<ol>
<li>décodage du <em>bytecode</em> CPython</li>
<li>construction d'un graphe de flot de contrôle (CFG)</li>
<li>génération d'une représentation intermédiaire (IR) spécifique à Numba</li>
<li>inférence de types, produisant une détermination du type de chaque variable manipulée par la fonction</li>
<li>génération de code LLVM correspondant à l'exécution de l'IR sur les types déterminés précédemment</li>
<li>appel à LLVM pour la génération du code machine, et encapsulation du tout dans un objet dédié (<em>wrapper</em>) qui lance le code machine quand il est appelé</li>
</ol><p>Grâce à LLVM, Numba n'a pas à se charger des optimisations bas niveau (propagation de constantes, vectorisation SIMD, etc.) et peut se concentrer sur les traitements spécifiques au langage Python.</p>
<p>Pour une présentation plus détaillée, il convient de lire la documentation (en anglais) : <a href="http://numba.pydata.org/numba-doc/dev/developer/architecture.html">architecture de Numba</a>.</p>
<h2 id="limitations">Limitations</h2>
<p>À l'heure actuelle, plutôt que de se lancer dans une liste interminable de limitations, il est plus raisonnable de lister ce qui est supporté.</p>
<h3 id="types-supportés">Types supportés</h3>
<ul>
<li>les scalaires numériques, que ce soit les types Python (<code>int</code>, <code>float</code>, <code>complex</code>…) ou NumPy (<code>numpy.complex64</code>, etc.)</li>
<li>les booléens</li>
<li>les dates et intervalles de temps NumPy (<code>numpy.datetime64</code> et <code>numpy.timedelta64</code>)—mais pas les types standard <code>datetime.datetime</code> et <code>datetime.timedelta</code>
</li>
<li>les tuples des types ci-dessus</li>
<li>les tableaux NumPy des types ci-dessus</li>
</ul><h3 id="constructions-supportées">Constructions supportées</h3>
<p>Numba supporte la plupart des constructions syntaxiques du langage, sauf le traitement des exceptions (<code>try... except</code>, etc.), les gestionnaires de contexte (<code>with</code>), les générateurs (<code>yield</code>) et quelques autres détails.</p>
<h3 id="fonctions-supportées">Fonctions supportées</h3>
<p>Numba supporte une grande partie des opérateurs numériques, des fonctions standard (notamment le module <code>math</code>), et certaines fonctions de NumPy. Il est également capable d'optimiser les appels à des fonctions externes via <a href="https://docs.python.org/3/library/ctypes.html">ctypes</a> ou <a href="http://cffi.readthedocs.org/">cffi</a>.</p>
<h3 id="différences-sémantiques">Différences sémantiques</h3>
<p>Le caractère volontaire (<em>opt-in</em>) de la compilation permet à Numba de présenter des différences sémantiques par rapport au langage Python. Je ne les listerai pas ici, mais une différence évidente a trait aux entiers : les entiers de Python sont de largeur arbitraire, ceux de Numba sont de largeur fixe (déterminée à l'inférence de types, ou forcée par l'utilisateur). Un dépassement lors d'opérations mathématiques entraîne simplement une troncation.</p>
<p>Notons qu'une grande partie de ces différences reflète en réalité le comportement de NumPy (dont les entiers sont aussi à largeur fixe, par exemple).</p>
<h2 id="numba-et-lécosystème-python">Numba et l'écosystème Python</h2>
<p>Le fait que Numba fonctionne au-dessus de CPython lui permet de s'intégrer facilement à l'écosystème existant. Comme on l'aura compris, l'intégration avec NumPy est également une fonctionnalité de premier plan. D'une manière générale, la stratégie de Continuum (cf. ci-dessous) est de maximiser les possibilités d'interaction entre les multiples briques de calcul scientifique disponibles pour Python.</p>
<h2 id="statut-du-projet">Statut du projet</h2>
<p>Numba est supporté par Continuum Analytics, qui paye à cet effet plusieurs développeurs (dont l'auteur de cette dépêche). Le développement est en partie financé par des clients et des fonds de recherche américains. Nous recevons également des contributions extérieures. Bien entendu, le projet est libre (licence de type MIT).</p>
<h2 id="contribuer">Contribuer</h2>
<p>Numba est un projet jeune auquel manquent de nombreuses fonctionnalités ; il y a donc beaucoup d'opportunités de contribution. Le processus est <a href="http://numba.pydata.org/numba-doc/dev/developer/contributing.html">détaillé dans la documentation</a>. Les compétences nécessaires dépendent de ce à quoi vous vous intéressez :-) La majeure partie du code de Numba est en Python ; il y a quelques parties en C, mais on les évite assez facilement. Nul besoin d'être en expert en NumPy ou en LLVM pour commencer (je ne les connaissais presque pas).</p>
<p>Au débotté, voici quelques directions possibles de contribution, par ordre de difficulté :</p>
<ul>
<li>améliorer la documentation</li>
<li>améliorer le retour utilisateur, qui est actuellement assez fruste (messages d'erreur, informations sur la fonction compilée)</li>
<li>corriger des bugs (!)</li>
<li>ajouter le support de nouvelles fonctions (de la bibliothèque standard ou de NumPy)</li>
<li>ajouter le support de nouveaux types</li>
<li>ajouter le support de nouvelles constructions (comme la gestion des exceptions ou les générateurs)</li>
</ul></div><div><a href="https://linuxfr.org/news/numba-0-14.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103319/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/numba-0-14#comments">ouvrir dans le navigateur</a>
</p>
AntoineBenoît Sibaudhttps://linuxfr.org/nodes/103319/comments.atomtag:linuxfr.org,2005:Diary/330892012-09-09T11:39:27+02:002012-09-09T11:39:27+02:00Python 3.3.0 release candidate 2<p>Chers lecteurs,</p>
<p>La deuxième <em>release candidate</em> de Python 3.3 vient de sortir. Avec un peu de chance, ce sera aussi la dernière avant la sortie finale de cette nouvelle version stable.</p>
<p>Les améliorations de Python 3.3 sont nombreuses. Quelques exemples :</p>
<ul><li>nouvelle syntaxe <code>yield from</code> pour déléguer un générateur à un autre</li>
<li>nouveaux modules <code>lzma</code> (compression xz et lzma), <code>ipaddress</code> (opérations sur adresses et masques IP), <code>faulthandler</code> (affichage d'une trace lors d'un plantage du processus)</li>
<li>intégration de <code>pyvenv</code>, outil équivalent au célèbre <a href="http://pypi.python.org/pypi/virtualenv">virtualenv</a></li>
<li>amélioration de la compacité des chaînes unicode et des dictionnaires d'attributs des objets</li>
</ul><p>La <a href="http://docs.python.org/dev/whatsnew/3.3.html">liste complète des changements</a> est très longue, je vous laisse la lire.</p>
<p>Afin d'éviter au maximum les régressions, nous invitons les utilisateurs de Python 3 à tester cette rc2 avec leurs applications.</p>
<p>Téléchargement (sources, installeurs Windows, binaires OS X) : <a href="http://www.python.org/download/releases/3.3.0/">http://www.python.org/download/releases/3.3.0/</a></p><div><a href="https://linuxfr.org/users/pitrou/journaux/python-3-3-0-release-candidate-2.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/95533/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/python-3-3-0-release-candidate-2#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/95533/comments.atomtag:linuxfr.org,2005:Diary/329162012-08-02T19:00:34+02:002012-08-02T19:00:34+02:00fr.misc.cryptologie<p>Bonjour,</p>
<p>Cela faisait des années que je n'avais plus consulté fr.misc.cryptologie - depuis son infestation par l'affreux Lheureux. Je viens d'y retourner par curiosité, espérant que l'infâme ait fini par se lasser, et c'est encore pire qu'à mon souvenir : c'est devenu fr.misc.lheureux. Du coup, je pose une question : y a-t-il un autre endroit où un dilettante comme moi pourrait assister à des discussions sur la crypto ?</p><div><a href="https://linuxfr.org/users/pitrou/journaux/fr-misc-cryptologie.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/95054/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/fr-misc-cryptologie#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/95054/comments.atomtag:linuxfr.org,2005:Diary/326352012-05-28T00:18:09+02:002012-05-28T00:18:09+02:00En Inde, un calvaire oppose catholiques et scientistes<p>Jésus bouge encore (et il transpire un peu des pieds) !</p>
<p>« Des milliers de chrétiens fervents ont afflué en mars dans une banlieue de Bombay pour s'abreuver à la source gouttant des pieds de Jésus sur la croix, convaincus qu'elle libérait une eau lustrale.</p>
<p>Sceptique de nature, Sanal Edamaruku, président de l'Association rationaliste indienne, a affirmé, après inspection, que le suintement provenait d'une évacuation d'eaux de ménage défectueuse et qu'il représentait un danger pour ses consommateurs.</p>
<p>Ses propos ont immédiatement suscité l'ire de groupes religieux et une plainte de police l'accusant de propager "le venin anti-catholique" a été déposée à Bombay, qui pourrait lui valoir trois ans de prison pour blasphème. »</p>
<p>
<a href="http://fr.news.yahoo.com/inde-calvaire-oppose-catholiques-scientistes-145733548.html">http://fr.news.yahoo.com/inde-calvaire-oppose-catholiques-scientistes-145733548.html</a>
</p><div><a href="https://linuxfr.org/users/pitrou/journaux/en-inde-un-calvaire-oppose-catholiques-et-scientistes.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/94278/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/en-inde-un-calvaire-oppose-catholiques-et-scientistes#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/94278/comments.atomtag:linuxfr.org,2005:Diary/320782012-01-21T16:08:41+01:002012-01-21T16:08:41+01:00Microsoft Visual Studio Achievements<p>Microsoft propose une extension à Visual Studio qui gratifie ses utilisateurs d'« <em>achievements</em> » (comment traduire ce terme horrible ? décoration ? récompense ?) quand ils effectuent certaines actions.</p>
<p>On peut apprécier l'humour de Microsoft au travers d'un exemple pris au hasard parmi leur communauté d'utilisateurs :<br /><a href="http://channel9.msdn.com/niners/DavidBuckell/achievements/visualstudio">http://channel9.msdn.com/niners/DavidBuckell/achievements/visualstudio</a></p>
<p>J'aime beaucoup le « <em>Job Security (0 points)<br />
Write 20 single letter class level variables in one file. Kudos to you for being cryptic!</em> ».</p>
<p>ou bien « <em>Field Master (0 points)<br />
Have 100 fields in a single class. Gnarly!</em> »</p><div><a href="https://linuxfr.org/users/pitrou/journaux/microsoft-visual-studio-achievements.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/89124/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/microsoft-visual-studio-achievements#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/89124/comments.atomtag:linuxfr.org,2005:Diary/315062011-08-24T13:06:20+02:002011-08-24T13:06:20+02:0010x10<p>Ce n'est pas grand'chose, mais voici l'objectif de GNOME tel qu'énoncé en 2005 :</p>
<blockquote>
<p>10x10</p>
<p>To Own 10 % of the Global Desktop Market by 2010 (set at Stuttgart2005 by JeffWaugh )</p>
</blockquote>
<p>(<a href="http://live.gnome.org/10x10">http://live.gnome.org/10x10</a>)</p>
<p>Autant dire que c'est un échec. GNOME semble aimer se donner des objectifs de conquête du monde, et croire qu'ils toucheront un public de non-informaticiens. Que penser d'un projet LL qui préfère fantasmer une base utilisateurs future que satisfaire sa communauté actuelle ?</p>
<p>Pensent-ils que GNOME 3 arrivera à les sortir du ghetto geek ?</p><div><a href="https://linuxfr.org/users/pitrou/journaux/10x10.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/87157/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/10x10#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/87157/comments.atomtag:linuxfr.org,2005:Diary/313432011-07-06T19:22:49+02:002011-07-06T19:22:49+02:00Linux, GNOME, configurabilité<p>Je me doute que certains auront déjà ri en lisant les deux derniers mots du titre côte à côte, mais qu'importe.</p>
<p>Je viens de rentrer le bug suivant dans l'outil de suivi Mageia : <a href="https://bugs.mageia.org/show_bug.cgi?id=2051">https://bugs.mageia.org/show_bug.cgi?id=2051</a></p>
<p>Le bug en soi n'est pas extrêmement grave (après tout installer son propre navigateur est plutôt une pratique peu courante), mais il montre à quel point la gestion de configuration est devenue délirante sous Linux (ou, en tout cas, GNOME) :</p>
<ul><li>il y a une foultitude d'exécutables apparentés pour une tâche unique, qui s'appellent les uns les autres: gvfs-open, www-browser, xdg-open (j'en ai peut-être oublié en route)</li>
<li>il y a divers endroits pour configurer tout ça : la boîte de config GNOME des applications préférées (qui, j'imagine, va modifier des clés dans la base gconf), la variable $BROWSER, /usr/share/applications, $HOME/.local/share/applications (j'en ai peut-être oublié en route)</li>
<li>modifier un seul de ces endroits ne suffit pas : selon la situation, l'un ou l'autre des mécanismes de configuration sera utilisé (par exemple, le simplissime $BROWSER est ignoré par gvfs-open), il faut donc s'en farcir plusieurs</li>
<li>on se demande sérieusement comment l'utilisateur est censé <em>découvrir</em> toutes ces informations</li>
<li>je frémis à l'idée de devoir découvrir les complications additionnelles s'il me venait à l'idée d'utiliser différent gestionnaires de bureaux selon l'envie du moment</li>
</ul><p><strong>PS :</strong> cher Linuxfr, j'aimerais avoir un choix de licences pour mon journal. Au moins la licence Art Libre comme alternative à la CC by-sa.</p><div><a href="https://linuxfr.org/users/pitrou/journaux/linux-gnome-configurabilit%C3%A9.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/86719/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/linux-gnome-configurabilit%C3%A9#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/86719/comments.atomtag:linuxfr.org,2005:Diary/310092011-04-17T14:17:52+02:002011-04-17T14:17:52+02:00Journal Todd / Mélenchon<p>Un journal d'invitation, à tous, à regarder un débat entre Emmanuel Todd et Jean-Luc Mélenchon :<br /><a href="http://www.arretsurimages.net/contenu.php?id=3931 ">http://www.arretsurimages.net/contenu.php?id=3931 </a>
C'est lumineux !™</p><div><a href="https://linuxfr.org/users/pitrou/journaux/journal-todd-m%C3%A9lenchon.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/85682/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/journal-todd-m%C3%A9lenchon#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/85682/comments.atomtag:linuxfr.org,2005:Diary/254362007-10-11T01:55:34+02:002007-10-11T01:55:34+02:00Hécatombe de gnousEn préambule nous rappellerons que le gnou est un animal réputé stupide.<br />
(il a parfois aussi quelques problèmes d'hygiène mais ce n'est pas le sujet)<br />
<br />
Mais la tragédie qui vient d'arriver à quelques milliers de ces mammifères n'en est pas moins fascinante. Pensez donc : « Près de 15.000 gnous se sont noyés la semaine dernière dans le fleuve Mara lors de leur migration annuelle entre la Tanzanie et le Kenya. »<br />
Quinze mille gnous ! Noyés dans une rivière... Panurge est enfoncé, écrasé, laminé. (Les âmes chauvines diront que c'est parce que nous n'avons pas sur notre territoire un tel réservoir de bétail indolent. Je ne serais pas aussi catégorique. Fabien Penso n'a-t-il pas annoncé qu'il envisageait de réécrire Linuxfr en Ruby pour, je cite, « tenir la charge » ?)<br />
<br />
D'où un spectacle assez impressionnant pour prendre quelques photos souvenirs et montrer à la petite famille : « Les carcasses en décomposition s'étendent le long de la rivière, où elles nourrissent marabouts, vautours, crocodiles et autres charognards. Un mouchoir sur le visage pour s'épargner l'odeur, certains touristes prennent les tas de corps en photos. » Voilà un joli fond d'écran pour les amateurs de scènes animalières.<br />
<br />
Par ailleurs, « de nombreux gnous [sont] morts piétinés par ceux qui les suivaient », confirmant par là-même l'excellence des rapports sociaux et des systèmes de communication sophistiqués qui lient <span>la communauté</span> le troupeau des gnous.<br />
<br />
Cependant, un coupable est vite trouvé : « Certains responsables estiment que la destruction de la forêt Mau toute proche a modifié le climat et changé le niveau des crues de la rivière. » Si les gnous crèvent, c'est la faute à l'appât du gain, le capitalisme, le refus de partager le code source, tous ces désastres amenés par notre monde devenu fou. Le gnou est une victime, on profite de son idiotie pour l'éliminer par des voies détournées (une crue, l'avarie d'un site Web communautaire...).<br />
<br />
Enfin, rassurons-nous : « Le garde-chasse de la réserve, Michael Koikai, a rappelé que même si 15.000 gnous représentait une grande perte, ce chiffre ne représentait qu'une petite fraction de leur population totale, qu'il estime à "plus de cinq millions dans l'éco-système Mara-Serengeti". »<br />
Ce qu'il y a de bien avec les gnous, c'est qu'ils sont tellement nombreux qu'on a beau s'autoriser un pourcentage de pertes donnant lieu à des hécatombes impressionnantes, il restera toujours et encore énormément de gnous sur Terre.<br />
<br />
Source : <a href="http://fr.news.yahoo.com/rtrs/20071010/twl-kenya-gnous-bd5ae06_1.html">http://fr.news.yahoo.com/rtrs/20071010/twl-kenya-gnous-bd5ae(...)</a><div><a href="https://linuxfr.org/users/pitrou/journaux/h%C3%A9catombe-de-gnous.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/51850/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/h%C3%A9catombe-de-gnous#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/51850/comments.atomtag:linuxfr.org,2005:Diary/219012006-06-16T14:13:02+02:002006-06-16T14:13:02+02:00Mandriva et les caractères accentuésQue penser d'un système informatique qui, bien que très sophistiqué, serait incapable d'afficher du texte brut correctement ?<br />
En particulier quand il s'agit de texte livré avec le système lui-même ?<br />
<br />
Chez Mandriva, c'est possible.<br />
- gedit est pourri par un patch qui empêche l'auto-détection correcte du codage UTF-8 (ironiquement, tout nouveau fichier créé par gedit l'est en UTF-8, ce qui fait qu'il ne sera pas relu correctement à la prochaine ouverture...) :<br />
<a href="http://qa.mandriva.com/show_bug.cgi?id=20277">http://qa.mandriva.com/show_bug.cgi?id=20277</a><br />
- les pages de manuel sont codées de façon incohérente - certaines en UTF-8, d'autres en ISO-8859-15 :<br />
<a href="http://qa.mandriva.com/show_bug.cgi?id=17554">http://qa.mandriva.com/show_bug.cgi?id=17554</a><br />
<br />
Deux bugs à la fois simples et graves que personne ne semble pressé de corriger. Il faut se demander si le français (avec accents et cédilles) est encore une langue utilisée couramment chez Mandriva, ou peut-être qu'ils pensent que lire l'UTF-8 en représentation ISO-8859-15 est <i>user-friendly</i>...<br />
<br />
Ce problème montre assez bien ce qui arrive quand un projet, tout à la résolution de problèmes de plus en plus compliqués, oublie les fondamentaux de l'informatique (afficher et modifier du texte, fonctionnalité basique et rigoureusement indispensable).<br />
<br />
On se demande aussi s'il y a un pilote dans l'équipe QA de Mandriva.<div><a href="https://linuxfr.org/users/pitrou/journaux/mandriva-et-les-caract%C3%A8res-accentu%C3%A9s.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/48385/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/mandriva-et-les-caract%C3%A8res-accentu%C3%A9s#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/48385/comments.atomtag:linuxfr.org,2005:Diary/213782006-04-10T17:04:34+02:002006-04-10T17:04:34+02:00D-Link sabote les protocoles de l'InternetUn administrateur système danois voit son serveur NTP spammé par des requêtes illégitimes provenant de modems/routeurs D-Link (illégitimes car contrevenant clairement aux règles affichées par l'administrateur système).<br />
D-Link refuse de prendre en compte le problème et de mettre à jour ses firmwares, coûtant ainsi des milliers de dollars à l'administrateur système par les surcoûts en bande passante occasionnés.<br />
<br />
Open Letter to D-Link about their NTP vandalism<br />
<a href="http://people.freebsd.org/~phk/dlink/">http://people.freebsd.org/~phk/dlink/</a><br />
<br />
When Firmware Attacks! (DDoS by D-Link)<br />
<a href="http://www.lightbluetouchpaper.org/2006/04/07/when-firmware-attacks-ddos-by-d-link/">http://www.lightbluetouchpaper.org/2006/04/07/when-firmware-(...)</a><div><a href="https://linuxfr.org/users/pitrou/journaux/d-link-sabote-les-protocoles-de-linternet.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/47879/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/d-link-sabote-les-protocoles-de-linternet#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/47879/comments.atomtag:linuxfr.org,2005:Diary/212402006-03-24T01:45:41+01:002006-03-24T01:45:41+01:00Contestation interne chez MicrosoftPlutôt intéressant à lire de l'extérieur, un blog d'employé(s) Microsoft commente les retards dans la sortie de Vista.<br />
Voir notamment, dans le forum, la frustration exprimée par les employés.<br />
Des "infos" croustillantes telles que : "<i>Results: Client appcompat % hovering at < 40% (GASP - INTERNAL INFO... better moderate this one out!!!!)</i>".<br />
(traduction : le groupe qui s'occupe de tester la compatibilité des applications trouve un résultat de moins de 40%... dixit)<br />
<br />
<a href="http://minimsft.blogspot.com/2006/03/vista-2007-fire-leadership-now.html">http://minimsft.blogspot.com/2006/03/vista-2007-fire-leaders(...)</a><div><a href="https://linuxfr.org/users/pitrou/journaux/contestation-interne-chez-microsoft.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/47743/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/contestation-interne-chez-microsoft#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/47743/comments.atomtag:linuxfr.org,2005:Diary/194392005-09-16T14:07:43+02:002005-09-16T14:07:43+02:00Yahoo, Google et autres pourrisNos moteurs préférés sont des amis du libre et à ce titre, ils aident l'Etat chinois à emprisonner de dangereux terroristes de la pensée.<br />
Bientôt Google Mail transmettra directement vos opinions suspectes aux autorités compétentes.<br />
<br />
<a href="http://affordance.typepad.com/mon_weblog/2005/09/moteurs_morale_.html">http://affordance.typepad.com/mon_weblog/2005/09/moteurs_morale_.ht(...)</a><br />
<br />
Extrait :<br />
« <i>[...]<br />
Dernière en date des dérives inévitables de ce genre de "conflit d'intérêt", le journaliste Shi Tao condamné à 10 ans de prison pour avoir "illégalement transmis des secrets d’Etat à l’étranger." Or dans cette affaire le verdict (.pdf) atteste que Yahoo! a fourni aux autorités chinoises des informations (adresses IP) permettant de faire le lien entre Shi Tao et des emails enoyés vers des sites web à l'étranger.<br />
Après les fonds de pension et autres entreprises éthiques, à quand un moteur éthique ?</i> »<div><a href="https://linuxfr.org/users/pitrou/journaux/yahoo-google-et-autres-pourris.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/45963/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/yahoo-google-et-autres-pourris#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/45963/comments.atomtag:linuxfr.org,2005:Diary/194382005-09-16T13:44:17+02:002005-09-16T13:44:17+02:00Mandriva et les noms de domaine...Quelqu'un aurait dû expliquer à Mandrake - je veux dire Mandriva - comment fonctionne l'hypertexte et pourquoi ça vaut le coup de garder les anciens noms de domaine un certain temps, même après une migration.<br />
Là ça fait pas très sérieux<br />
<a href="http://www.mandrakesoft.com/">http://www.mandrakesoft.com/(...)</a><br />
<br />
Le pire c'est que leur serveur de clés (hkp://www.mandrakesecure.net/) a subi le même sort... Et comment je fais pour trouver le nom du nouveau serveur de clés dans leur foutoir pas possible de sites Web ???<div><a href="https://linuxfr.org/users/pitrou/journaux/mandriva-et-les-noms-de-domaine.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/45962/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/pitrou/journaux/mandriva-et-les-noms-de-domaine#comments">ouvrir dans le navigateur</a>
</p>
Antoinehttps://linuxfr.org/nodes/45962/comments.atom