<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Lorenzo Bolla</title><link>https://lbolla-info.netlify.app/tags/python/</link><description>Recent content in Python on Lorenzo Bolla</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 02 Dec 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://lbolla-info.netlify.app/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>Python MRO surprises</title><link>https://lbolla-info.netlify.app/blog/python-mro-surprises/</link><pubDate>Fri, 02 Dec 2022 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/python-mro-surprises/</guid><description>&lt;p&gt;Consider a script like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;A&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;B&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;C&lt;/span&gt;(A, B):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;(self):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; super()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;__init__&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(&lt;span style="color:#e6db74"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What will it output? If you are like me, you would answer, without much thought, that it prints:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;a
c
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;To work it out you need to know about Python's MRO (Method Resolution Order): &lt;a href="https://medium.com/@__hungrywolf/mro-in-python-3-e2bcd2bd6851"&gt;this article&lt;/a&gt; provides a clear explanation of how it works. In this case, we have:&lt;/p&gt;</description></item><item><title>Nice threads in Python</title><link>https://lbolla-info.netlify.app/blog/nice-threads-in-python/</link><pubDate>Sat, 01 Feb 2020 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/nice-threads-in-python/</guid><description>&lt;p&gt;Python has two ways to execute code in parallel: processes and threads. Both have their strengths and weaknesses. In particular, threads are cheaper in terms of resources and are able to share memory, but besides the obvious pitfalls of multi-threaded programming, they suffer from some Python specific problems, notably:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Because of the GIL, only one Python's thread is actually running at any one time. So, very little parallelism is possible if the task is CPU bound. In fact, more often than not, it's more efficient to execute multiple tasks sequentially on a single thread (pinned to a single CPU), rather than spawning multiple threads and having the Python interpreter context switching too much and not being able to schedule the threads on all available CPUs.&lt;/p&gt;</description></item><item><title>Edit Kubernetes secrets</title><link>https://lbolla-info.netlify.app/blog/edit-kubernetes-secrets/</link><pubDate>Sun, 14 Jan 2018 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/edit-kubernetes-secrets/</guid><description>&lt;p&gt;&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt; secrets are difficult to edit using standard command line tools, like &lt;code&gt;kubectl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When doing &lt;code&gt;kubectl edit secret my-secret&lt;/code&gt; you are presented with a base64-encoded blob that you have to first decode, in order to edit it and then re-encode before saving the file.&lt;/p&gt;
&lt;p&gt;There are various ways to deal with it, but none is user-friendly, in my opinion. Therefore, I wrote &lt;a href="https://github.com/lbolla/kube-secret-editor"&gt;kube-secret-editor&lt;/a&gt;: a simple Python script to decode and encode secret values on the flight before/after editing.&lt;/p&gt;</description></item><item><title>Elixir pipe operator in Python</title><link>https://lbolla-info.netlify.app/blog/elixir-pipe-operator-in-python/</link><pubDate>Wed, 25 May 2016 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/elixir-pipe-operator-in-python/</guid><description>&lt;p&gt;&lt;a href="http://elixir-lang.org"&gt;Elixir&lt;/a&gt; implements lots of nice ideas, one of which is its &lt;a href="http://elixir-lang.org/docs/stable/elixir/Kernel.html#%7C%3E/2"&gt;pipe operator&lt;/a&gt;. It allows you to write things like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-elixir" data-lang="elixir"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iex&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, [&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;], &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;] &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;List&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;flatten()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Or:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-elixir" data-lang="elixir"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iex&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; inc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; x &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iex&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; dec &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; x &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iex&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; square &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; x &lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt; x &lt;span style="color:#f92672"&gt;*&lt;/span&gt; x &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;iex&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; inc&lt;span style="color:#f92672"&gt;.&lt;/span&gt;() &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; dec&lt;span style="color:#f92672"&gt;.&lt;/span&gt;() &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; square&lt;span style="color:#f92672"&gt;.&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Today, just for fun, I tried to implement something similar in Python. Here is the result:&lt;/p&gt;
&lt;script src="https://gist.github.com/lbolla/e7396c77e63b4c168cce27002f588494.js"&gt;&lt;/script&gt;
&lt;p&gt;So, you can write something like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;P&lt;span style="color:#f92672"&gt;|&lt;/span&gt; inc &lt;span style="color:#f92672"&gt;|&lt;/span&gt;P&lt;span style="color:#f92672"&gt;|&lt;/span&gt; dec &lt;span style="color:#f92672"&gt;|&lt;/span&gt;P&lt;span style="color:#f92672"&gt;|&lt;/span&gt; square
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Obviously, this is just a toy: it does not implement all the features available in the Elixir's one, but it was fun!&lt;/p&gt;</description></item><item><title>Comparison of blocking and non-blocking Python multiprocessing Queue</title><link>https://lbolla-info.netlify.app/blog/comparison-of-blocking-and-non-blocking-python-multiprocessing-queue/</link><pubDate>Mon, 25 Apr 2016 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/comparison-of-blocking-and-non-blocking-python-multiprocessing-queue/</guid><description>&lt;p&gt;Python's &lt;a href="https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Queue"&gt;multiprocessing&lt;/a&gt; module offers a &lt;code&gt;Queue&lt;/code&gt; implementation. Surprisingly enough (for me at least), its performance varies greatly if used in a blocking or non-blocking fashion. In particular, the non-blocking way is about &lt;em&gt;ten times slower&lt;/em&gt; than the blocking one!&lt;/p&gt;
&lt;p&gt;Consider this code, which feeds a Queue and then drains it in a blocking and non-blocking way:&lt;/p&gt;
&lt;script src="https://gist.github.com/lbolla/92bad9f4320940ac2f762424ac840a12.js"&gt;&lt;/script&gt;
&lt;p&gt;Running it on my machine, with Python 2.7, gives me these results (Python 3.4 results are similar, but less dramatic):&lt;/p&gt;</description></item><item><title>EMpy 1.0 is out! Python3 compatible!</title><link>https://lbolla-info.netlify.app/blog/empy-1.0-is-out-python3-compatible/</link><pubDate>Sun, 26 Apr 2015 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/empy-1.0-is-out-python3-compatible/</guid><description>&lt;p&gt;After a long sleep, I resumed development on &lt;a href="https://lbolla-info.netlify.app/blog/empy/"&gt;Empy&lt;/a&gt;. The trigger was an appeal from Guido van Rossum at PyCon 2015 to package authors to support Python 3.&lt;/p&gt;
&lt;p&gt;There are no new features to &lt;a href="https://lbolla-info.netlify.app/blog/empy/"&gt;Empy&lt;/a&gt;, but I have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ported the code to Python 3, using the amazing &lt;a href="http://python-future.org/"&gt;future&lt;/a&gt; library: now, both Python 2 and 3 are supported;&lt;/li&gt;
&lt;li&gt;setup &lt;a href="https://travis-ci.org/lbolla/EMpy"&gt;Travis CI&lt;/a&gt; to run unittest on all supported Python versions;&lt;/li&gt;
&lt;li&gt;upgraded the dependencies to the latest available libraries;&lt;/li&gt;
&lt;li&gt;Pylint'd and pep8'd the code&lt;/li&gt;
&lt;li&gt;Renamed the package in PyPi to &lt;code&gt;ElectroMagneticPython&lt;/code&gt; to avoid name conflicts with &lt;a href="https://pypi.python.org/pypi/EmPy"&gt;EmPy&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can try it out by simply:&lt;/p&gt;</description></item><item><title>Experiments in pickling</title><link>https://lbolla-info.netlify.app/blog/experiments-in-pickling/</link><pubDate>Wed, 14 May 2014 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/experiments-in-pickling/</guid><description>&lt;p&gt;&lt;a href="https://docs.python.org/2/library/pickle.html"&gt;&lt;code&gt;pickle&lt;/code&gt;&lt;/a&gt; is a standard library module to serialize and deserialize Python objects. Being written in pure Python, it's fairly slow, so the standard library provides a pure-C implementation, called &lt;a href="https://docs.python.org/2/library/pickle.html#module-cPickle"&gt;&lt;code&gt;cPickle&lt;/code&gt;&lt;/a&gt;, with the limitation that it cannot be &lt;a href="http://doughellmann.com/2007/06/24/pymotw-pickle-and-cpickle.html"&gt;subclassed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What's interesting about &lt;code&gt;cPickle&lt;/code&gt; are two little known settings that can speed up serialization quite substantially.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://docs.python.org/2/library/pickle.html#pickle.HIGHEST_PROTOCOL"&gt;&lt;code&gt;cPickle.HIGHEST_PROTOCOL&lt;/code&gt;&lt;/a&gt; basically dumps a Python object using a binary protocol, rather than the default ASCII-based, more portable, protocol 0. If portability or backward compatibility are not an issue for you, you should use it: it's documented and probably here to stay.&lt;/p&gt;</description></item><item><title>Die zombie, die!</title><link>https://lbolla-info.netlify.app/blog/die-zombie-die/</link><pubDate>Thu, 23 Jan 2014 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/die-zombie-die/</guid><description>&lt;p&gt;The &lt;a href="https://docs.python.org/2/library/subprocess.html"&gt;&lt;code&gt;subprocess&lt;/code&gt;&lt;/a&gt; module in Python standard library allows you to spanw processes to do some tasks. The parent process should &lt;a href="https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait"&gt;&lt;code&gt;wait&lt;/code&gt;&lt;/a&gt; on its children processes in order get the return value of the process and &lt;a href="http://stackoverflow.com/questions/320232/ensuring-subprocesses-are-dead-on-exiting-python-program"&gt;avoid&lt;/a&gt; &lt;a href="http://stackoverflow.com/questions/2760652/how-to-kill-or-avoid-zombie-processes-with-subprocess-module"&gt;zombies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes, though, processes are particularly hard to kill and even after a &lt;a href="https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait"&gt;&lt;code&gt;wait&lt;/code&gt;&lt;/a&gt;, a &lt;a href="https://docs.python.org/2/library/subprocess.html#subprocess.Popen.terminate"&gt;&lt;code&gt;terminate&lt;/code&gt;&lt;/a&gt; or a &lt;a href="https://docs.python.org/2/library/subprocess.html#subprocess.Popen.kill"&gt;&lt;code&gt;kill&lt;/code&gt;&lt;/a&gt; they refuse to die: they become &lt;a href="http://en.wikipedia.org/wiki/Zombie_process"&gt;zombies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In theory, Python should take care of reaping zombies for you once the zombie process gets garbage collected. In practice, it does not seem to work reliably and bigger weapons are needed.&lt;/p&gt;</description></item><item><title>Long running processes manager</title><link>https://lbolla-info.netlify.app/blog/long-running-processes-manager/</link><pubDate>Fri, 17 Jan 2014 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/long-running-processes-manager/</guid><description>&lt;p&gt;If you want to run multiple processes in Python, the nicest way, in my opinion, is to use &lt;a href="https://docs.python.org/3.4/library/concurrent.futures.html"&gt;concurrent.futures&lt;/a&gt; (there is a &lt;a href="https://pypi.python.org/pypi/futures"&gt;backport&lt;/a&gt; for Python 2.x, too).&lt;/p&gt;
&lt;p&gt;A problem that came up recently was to manage multiple long running processes, intended to run forever, from the same Python process. Using something like &lt;a href="http://supervisord.org/"&gt;supervisord&lt;/a&gt; wouldn't be ideal, because each individual application would have its own config file and deployment procedure.&lt;/p&gt;
&lt;p&gt;Instead, having just one &amp;quot;master&amp;quot; Python process to drive several other processes doing the job seemed the easiest solution to manage. The only caveat is that, being the processes managed long running, you want to restart them as soon as they die.&lt;/p&gt;</description></item><item><title>Overcoming Python GIL with Cython</title><link>https://lbolla-info.netlify.app/blog/overcoming-python-gil-with-cython/</link><pubDate>Mon, 23 Dec 2013 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/overcoming-python-gil-with-cython/</guid><description>&lt;p&gt;Everybody is aware of the infamous &lt;a href="https://wiki.python.org/moin/GlobalInterpreterLock"&gt;Python's GIL&lt;/a&gt;. In a nutshell, the GIL is a global variable that prevents multiple threads to be run concurrently by the interpreter. Under some occasions, for certain operations, the interpreter releases the GIL therefore in certain cases this is not a problem. For example, the GIL is released before doing I/O, so I/O bound threads tend to run concurrently. Another example is when doing system calls. Unfortunately, for CPU bound tasks that don't make any I/O or system calls, the GIL prevents different threads from running concurrently, even on multicore CPUs. The astonishing thing is that, in fact, not only different threads do not run concurrently, but they also run slower on multicore CPUs than on single core ones!&lt;/p&gt;</description></item><item><title>Connect to MSSQL from Python with ODBC and FreeTDS</title><link>https://lbolla-info.netlify.app/blog/connect-to-mssql-from-python-with-odbc-and-freetds/</link><pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/connect-to-mssql-from-python-with-odbc-and-freetds/</guid><description>&lt;p&gt;This is another of those posts that I wrote because I always forget how to do things&amp;hellip;&lt;/p&gt;
&lt;p&gt;This time, I don't want to forget how to connect from Python to MSSQL server anymore. In order to do it, you need the following system packages installed:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$&amp;gt; sudo apt-get install unixodbc-dev tdsodbc sqsh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;sqsh&lt;/code&gt; installs all the required &lt;code&gt;freetds&lt;/code&gt;-related libraries; &lt;code&gt;tdsodbc&lt;/code&gt; is the &lt;a href="http://en.wikipedia.org/wiki/FreeTDS"&gt;FreeTDS&lt;/a&gt; driver for &lt;a href="http://en.wikipedia.org/wiki/ODBC"&gt;ODBC&lt;/a&gt; and &lt;code&gt;unixodbc-dev&lt;/code&gt; is needed to install &lt;a href="https://code.google.com/p/pyodbc/"&gt;&lt;code&gt;pyodbc&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Python and C with ctypes</title><link>https://lbolla-info.netlify.app/blog/python-and-c-with-ctypes/</link><pubDate>Wed, 28 Aug 2013 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/python-and-c-with-ctypes/</guid><description>&lt;p&gt;Calling C code from Python is very simple using &lt;a href="https://docs.python.org/2/library/ctypes.html"&gt;ctypes&lt;/a&gt;. Here is a very simple example to get you started and to serve as a reminder for me!&lt;/p&gt;
&lt;p&gt;Let's say you have this C file, defining 3 functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;foo&lt;/code&gt; which prints something to &lt;code&gt;stdout&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bar&lt;/code&gt; which returns and &lt;code&gt;int&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;baz&lt;/code&gt; which takes a parameter and returns a value.&lt;/li&gt;
&lt;/ul&gt;
&lt;script src="https://gist.github.com/lbolla/6363780.js?file=go.c"&gt;&lt;/script&gt;
&lt;p&gt;First, you want to compile this C file into a shared object. Here is a &lt;code&gt;Makefile&lt;/code&gt; to do just this: simple type &lt;code&gt;make all&lt;/code&gt; and you're done.&lt;/p&gt;</description></item><item><title>Use Postgres advanced types in Python</title><link>https://lbolla-info.netlify.app/blog/use-postgres-advanced-types-in-python/</link><pubDate>Wed, 06 Mar 2013 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/use-postgres-advanced-types-in-python/</guid><description>&lt;p&gt;Postgres has a lot of useful &lt;a href="http://www.postgresql.org/docs/9.2/static/datatype.html"&gt;builtin data types&lt;/a&gt;, but only some of them are mapped to Python types when accessing the DB using &lt;a href="http://initd.org/psycopg/"&gt;psycopg2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Extending the support to other types is not straightforward, and involves the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a Python class to store the data, e.g. &lt;code&gt;class Point&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Write a function to convert a &lt;code&gt;Point&lt;/code&gt; to its SQL string representation, e.g. &lt;code&gt;adapt_point&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Write the inverse function to parse the SQL string representation of a &lt;code&gt;Point&lt;/code&gt; and return and instance of a &lt;code&gt;Point&lt;/code&gt;, e.g. &lt;code&gt;cast_point&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Finally bind all these functions and types, see &lt;code&gt;register_point_type&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The complete code is as follows, also available &lt;a href="https://gist.github.com/lbolla/5098907"&gt;as a gist&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>Blocking tasks in Tornado</title><link>https://lbolla-info.netlify.app/blog/blocking-tasks-in-tornado/</link><pubDate>Tue, 22 Jan 2013 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/blocking-tasks-in-tornado/</guid><description>&lt;p&gt;Every now and then a &lt;a href="https://groups.google.com/d/topic/python-tornado/NVA5sTFIlPo/discussion"&gt;new discussion is raised on Tornado's mailling list about what is the best way to execute blocking tasks&lt;/a&gt;. It turns out that there are 3 feasible options, in order of increasing complexity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Optimize blocking calls&lt;/em&gt;. Often, a slow DB query, or an overly complicate template are the blocking bottleneck. Rather than complicating the webserver, the first thing to try is to speed them up. This is sufficient 99% of the time.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Execute the slow task in a separate thread or process&lt;/em&gt;. This means off-loading the task to a different thread (or process) to the one running the &lt;code&gt;IOLoop&lt;/code&gt;, which is then free to accept other requests.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Use an asynchronous driver/library to run the task&lt;/em&gt;. For example, something like &lt;a href="http://www.gevent.org/"&gt;gevent&lt;/a&gt;, &lt;a href="http://emptysquare.net/blog/introducing-motor-an-asynchronous-mongodb-driver-for-python-and-tornado/"&gt;motor&lt;/a&gt; and the like.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This blog post is about the second option, in particular using Python's &lt;a href="https://docs.python.org/3/library/concurrent.futures.html#module-concurrent.futures"&gt;&lt;code&gt;concurrent.futures&lt;/code&gt;&lt;/a&gt; package.&lt;/p&gt;</description></item><item><title>Useful scripts - Watch</title><link>https://lbolla-info.netlify.app/blog/useful-scripts---watch/</link><pubDate>Fri, 30 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/useful-scripts---watch/</guid><description>&lt;p&gt;This is the fifth post of a series describing simple scripts that I wrote to ease my life as a programmer.&lt;/p&gt;
&lt;p&gt;They are &lt;a href="https://github.com/lbolla/cmd"&gt;available on github&lt;/a&gt;: fork &amp;amp; hack at will!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/lbolla/cmd/blob/master/Watch"&gt;&lt;code&gt;Watch&lt;/code&gt;&lt;/a&gt; reacts to changes in a directory executing a command provided by the user. It can be used, for example, to monitor a directory and run some unittests as soon as files in it change. This is exactly how I am using &lt;code&gt;Watch&lt;/code&gt; in &lt;a href="http://acme.cat-v.org/"&gt;&lt;code&gt;acme&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Useful scripts - htmlind and xmlind</title><link>https://lbolla-info.netlify.app/blog/useful-scripts---htmlind-and-xmlind/</link><pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/useful-scripts---htmlind-and-xmlind/</guid><description>&lt;p&gt;This is the forth post of a series describing simple scripts that I wrote to ease my life as a programmer.&lt;/p&gt;
&lt;p&gt;In this post I'll describe 2 simple scripts to indent nicely &lt;code&gt;HTML&lt;/code&gt; and &lt;code&gt;XML&lt;/code&gt; files. I use them primarily with &lt;a href="http://acme.cat-v.org/"&gt;&lt;code&gt;acme&lt;/code&gt;&lt;/a&gt;, to pipe selected text and get back nicely formatted output.&lt;/p&gt;
&lt;p&gt;Code is available here: &lt;a href="https://github.com/lbolla/cmd/blob/master/htmlind"&gt;&lt;code&gt;htmlind&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/lbolla/cmd/blob/master/xmlind"&gt;&lt;code&gt;xmlind&lt;/code&gt;&lt;/a&gt;. Both programs are written in Python and make use of specialized libraries freely available online. In particular, &lt;code&gt;xmlind&lt;/code&gt; uses &lt;a href="https://docs.python.org/2/library/xml.dom.minidom.html"&gt;&lt;code&gt;xml.dom.minidom&lt;/code&gt;&lt;/a&gt;, included in Python's standard library, and &lt;code&gt;htmlind&lt;/code&gt; uses a modified version of &lt;a href="https://github.com/lbolla/cmd/blob/master/pylib/BeautifulSoup.py"&gt;&lt;code&gt;BeautifulSoup&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Useful scripts - csvfmt, xmlfmt, jsonfmt</title><link>https://lbolla-info.netlify.app/blog/useful-scripts---csvfmt-xmlfmt-jsonfmt/</link><pubDate>Fri, 16 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/useful-scripts---csvfmt-xmlfmt-jsonfmt/</guid><description>&lt;p&gt;This is the third post of a series describing simple scripts that I wrote to ease my life as a programmer.&lt;/p&gt;
&lt;p&gt;In this post, I'll describe 3 scripts to &amp;quot;pretty print&amp;quot; some common file types, to improve readability: &lt;a href="https://github.com/lbolla/cmd/blob/master/csvfmt"&gt;&lt;code&gt;csvfmt&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/lbolla/cmd/blob/master/xmlfmt"&gt;&lt;code&gt;xmlfmt&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/lbolla/cmd/blob/master/jsonfmt"&gt;&lt;code&gt;jsonfmt&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/lbolla/cmd/blob/master/csvfmt"&gt;&lt;code&gt;csvfmt&lt;/code&gt;&lt;/a&gt; takes a &lt;code&gt;CSV&lt;/code&gt; (&amp;quot;Comma Separated Values&amp;quot;) file from &lt;code&gt;stdin&lt;/code&gt;, parses it and pretty print each record as a Python dictionary.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; csv
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; pprint
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; row &lt;span style="color:#f92672"&gt;in&lt;/span&gt; csv&lt;span style="color:#f92672"&gt;.&lt;/span&gt;DictReader(sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stdin):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pprint&lt;span style="color:#f92672"&gt;.&lt;/span&gt;pprint(row)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output looks like this:&lt;/p&gt;</description></item><item><title>Wordpress to markdown</title><link>https://lbolla-info.netlify.app/blog/wordpress-to-markdown/</link><pubDate>Mon, 12 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/wordpress-to-markdown/</guid><description>&lt;p&gt;Recently, I moved away from &lt;a href="http://wordpress.com/"&gt;Wordpress&lt;/a&gt;. I did it primarily because &lt;a href="http://john.onolan.org/ghost/"&gt;Wordpress is so much more than &lt;strong&gt;just&lt;/strong&gt; a blogging platform&lt;/a&gt; and what I needed was just a simple way of publishing posts with embedded code, links and images. Moreover, writing blogs using Wordpress's web editor is less than ideal&amp;hellip;&lt;/p&gt;
&lt;p&gt;The biggest problem to solve when moving away from Wordpress is how to not lose all your posts. Luckily, Wordpress allows you to &lt;a href="http://codex.wordpress.org/Tools_Export_Screen"&gt;export all your stuff in XML&lt;/a&gt;, but you also need a way to import them in whatever other blogging platform you are going to use.&lt;/p&gt;</description></item><item><title>Useful scripts - c+-c-</title><link>https://lbolla-info.netlify.app/blog/useful-scripts---c+-c-/</link><pubDate>Fri, 09 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/useful-scripts---c+-c-/</guid><description>&lt;p&gt;This is the second post of a series describing simple scripts that I wrote to ease my life as a programmer.&lt;/p&gt;
&lt;p&gt;They are &lt;a href="https://github.com/lbolla/cmd"&gt;available on github&lt;/a&gt;: fork &amp;amp; hack at will!&lt;/p&gt;
&lt;h2 id="cc-"&gt;c+/c-&lt;/h2&gt;
&lt;p&gt;In this post I'll describe a very simple script, &lt;a href="https://github.com/lbolla/cmd/blob/master/c%2B"&gt;&lt;code&gt;c+&lt;/code&gt;&lt;/a&gt;, and its counterpart &lt;a href="https://github.com/lbolla/cmd/blob/master/c-"&gt;&lt;code&gt;c-&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;c+&lt;/code&gt; prepends every line of &lt;code&gt;stdin&lt;/code&gt; with &lt;code&gt;#&lt;/code&gt;. &lt;code&gt;c-&lt;/code&gt; strips &lt;code&gt;#&lt;/code&gt; from the beginning of each line of &lt;code&gt;stdin&lt;/code&gt;. I use these scripts to comment/uncomment lines in Python scripts when using &lt;a href="http://acme.cat-v.org/"&gt;&lt;code&gt;acme&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Useful scripts - a+-a-</title><link>https://lbolla-info.netlify.app/blog/useful-scripts---a+-a-/</link><pubDate>Fri, 02 Nov 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/useful-scripts---a+-a-/</guid><description>&lt;p&gt;This is the first post of a series describing simple scripts that I wrote to ease my life as a programmer.&lt;/p&gt;
&lt;p&gt;They are implemented in various languages (&lt;code&gt;python&lt;/code&gt;, &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;go&lt;/code&gt;) and thought to be used in &lt;code&gt;Linux&lt;/code&gt;. Some of them are &amp;quot;general purpose&amp;quot;, while others are specifically designed to interface other tools I use (for example, &lt;a href="http://acme.cat-v.org/"&gt;&lt;code&gt;acme&lt;/code&gt;&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;All of them tend to have the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input from &lt;code&gt;stdin&lt;/code&gt;, output to &lt;code&gt;stdout&lt;/code&gt;, errors to &lt;code&gt;stderr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Return zero on success, non-zero on failure&lt;/li&gt;
&lt;li&gt;Do one thing only&lt;/li&gt;
&lt;li&gt;Not too much customizable&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These properties allow the scripts to remain very simple, be composable and easy to remember.&lt;/p&gt;</description></item><item><title>Asynchronous programming with Tornado</title><link>https://lbolla-info.netlify.app/blog/asynchronous-programming-with-tornado/</link><pubDate>Wed, 03 Oct 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/asynchronous-programming-with-tornado/</guid><description>&lt;p&gt;Asynchronous programming can be tricky for beginners, therefore I think it's useful to iron some basic concepts to avoid common pitfalls. For an explanation about generic asynchronous programming, I recommend you one of the &lt;a href="http://en.wikipedia.org/wiki/Asynchrony"&gt;many&lt;/a&gt; &lt;a href="http://www.cs.brown.edu/courses/cs196-5/f12/handouts/async.pdf"&gt;resources&lt;/a&gt; &lt;a href="http://krondo.com/?page_id=1327"&gt;online&lt;/a&gt;. I will focus solely on asynchronous programming in &lt;a href="http://www.tornadoweb.org/documentation/index.html"&gt;Tornado&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From Tornado's homepage:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;FriendFeed's web server is a relatively simple, non-blocking web server written in Python. The FriendFeed application is written using a web framework that looks a bit like web.py or Google's webapp, but with additional tools and optimizations to take advantage of the non-blocking web server and tools. Tornado is an open source version of this web server and some of the tools we use most often at FriendFeed. The framework is distinct from most mainstream web server frameworks (and certainly most Python frameworks) because it is non-blocking and reasonably fast. Because it is non-blocking and uses epoll or kqueue, it can handle thousands of simultaneous standing connections, which means the framework is ideal for real-time web services. We built the web server specifically to handle FriendFeed's real-time features every active user of FriendFeed maintains an open connection to the FriendFeed servers. (For more information on scaling servers to support thousands of clients, see The C10K problem.)&lt;/p&gt;</description></item><item><title>Tornado vs. Warp vs. Yesod</title><link>https://lbolla-info.netlify.app/blog/tornado-vs.-warp-vs.-yesod/</link><pubDate>Sun, 02 Sep 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/tornado-vs.-warp-vs.-yesod/</guid><description>&lt;p&gt;Today I tried to benchmark 3 web servers that I've used recently:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.tornadoweb.org/"&gt;Tornado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://hackage.haskell.org/package/warp/"&gt;Warp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yesodweb.com/"&gt;Yesod&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In fact, these are only *2* web servers, because &lt;code&gt;Yesod&lt;/code&gt; runs on top of Warp and it's a fully fledged web framework, rather than a web server: but this was also the intent of the benchmark, i.e. to measure how slower all its goodies made Yesod with respect to Warp.&lt;/p&gt;
&lt;p&gt;Tornado and Warp are obviously very different web servers (async vs. threaded, interpreted vs. compiled, etc.) but, &lt;a href="http://ziutek.github.com/web_bench/"&gt;who cares&lt;/a&gt;?&lt;/p&gt;</description></item><item><title>EMpy has moved!</title><link>https://lbolla-info.netlify.app/blog/empy-has-moved/</link><pubDate>Mon, 25 Jun 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/empy-has-moved/</guid><description>&lt;p&gt;&lt;a href="https://lbolla-info.netlify.app/blog/empy/"&gt;Empy&lt;/a&gt; has &lt;a href="http://lbolla.github.com/EMpy/"&gt;moved to Github&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>Pipelines in Python</title><link>https://lbolla-info.netlify.app/blog/pipelines-in-python/</link><pubDate>Fri, 20 Apr 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/pipelines-in-python/</guid><description>&lt;p&gt;Generators (&lt;a href="http://www.python.org/dev/peps/pep-0255/"&gt;PEP 255 &amp;quot;Simple Generators&amp;quot;&lt;/a&gt;) and Coroutines (&lt;a href="http://www.python.org/dev/peps/pep-0342/"&gt;PEP 342 &amp;quot;Coroutines via Enhanced Generators&amp;quot;&lt;/a&gt;) are the cleanest way I've come across so far to implement the concept of a &amp;quot;pipeline&amp;quot; in Python.&lt;/p&gt;
&lt;h2 id="first-approximation"&gt;First approximation&lt;/h2&gt;
&lt;p&gt;A pipeline is made of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a &lt;em&gt;Producer&lt;/em&gt;, that generates data;&lt;/li&gt;
&lt;li&gt;many /Stage/s, that receive data from the previous stage and send it to the next;&lt;/li&gt;
&lt;li&gt;a &lt;em&gt;Consumer&lt;/em&gt;, that receives data from the last stage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The producer is a coroutine that only /send/s data, generated internally from some initial state. /Stage/s are coroutines that both receive and send messages. The &lt;em&gt;consumer&lt;/em&gt; only receives data. Chaining is done in function &lt;em&gt;pipeline&lt;/em&gt;: each argument but the last is instantiated with an instance of the next stage. The full pipeline is &lt;em&gt;started&lt;/em&gt; by issuing a &lt;em&gt;next&lt;/em&gt; (or &lt;em&gt;send(None)&lt;/em&gt;) to the &lt;em&gt;Producer&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>hsenv</title><link>https://lbolla-info.netlify.app/blog/hsenv/</link><pubDate>Thu, 29 Mar 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/hsenv/</guid><description>&lt;p&gt;If you have never used &lt;a href="https://github.com/Paczesiowa/hsenv"&gt;hsenv&lt;/a&gt; before, you should. It's basically the Haskell's equivalent of Python's &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can find a &lt;a href="https://github.com/lbolla/hsenv"&gt;tweaked version of hsenv here&lt;/a&gt;: I've relaxed some requirements in order to make it install on newer GHC releases.&lt;/p&gt;
&lt;p&gt;Finally, if when using you hit this error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ hsenv Creating Virtual Haskell directory structure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Installing GHC Initializing GHC Package database at /home/lollo/work/Unique/.hsenv/ghc_pkg_db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copying necessary packages from original GHC package database
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hsenv: fd:9: hGetContents: invalid argument &lt;span style="color:#f92672"&gt;(&lt;/span&gt;invalid byte sequence&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hsenv: thread blocked indefinitely in an MVar operation
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, you have a problem with your locale. Follow the steps &lt;a href="https://wiki.archlinux.org/index.php/Locale#Enabling_necessary_locales"&gt;here&lt;/a&gt;, and retry.&lt;/p&gt;</description></item><item><title>ulint, Universal Lint</title><link>https://lbolla-info.netlify.app/blog/ulint-universal-lint/</link><pubDate>Thu, 05 Jan 2012 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/ulint-universal-lint/</guid><description>&lt;p&gt;I've been using so many code static checkers lately, that I decided to write a wrapper around the ones I use the most. I called it: &lt;a href="https://github.com/lbolla/ulint"&gt;Universal Lint&lt;/a&gt;, &lt;a href="https://github.com/lbolla/ulint"&gt;ulint&lt;/a&gt; for short.&lt;/p&gt;
&lt;p&gt;At the moment, Python, Javascript and Haskell files are supported, but adding new linters/extension is trivial.&lt;/p&gt;
&lt;p&gt;Download it and use it!&lt;/p&gt;</description></item><item><title>git pre-commit hook for Python and Javascript</title><link>https://lbolla-info.netlify.app/blog/git-pre-commit-hook-for-python-and-javascript/</link><pubDate>Thu, 17 Nov 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/git-pre-commit-hook-for-python-and-javascript/</guid><description>&lt;p&gt;Following a &lt;a href="http://news.ycombinator.com/item?id=3244475"&gt;recent discussion on HN&lt;/a&gt;, I decided to share my own &lt;a href="http://book.git-scm.com/5_git_hooks.html"&gt;git pre-commit hook&lt;/a&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; sys
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; re
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; subprocess
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;devnull &lt;span style="color:#f92672"&gt;=&lt;/span&gt; open(os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;devnull, &lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;call&lt;/span&gt;(cmd):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Popen(cmd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stdout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;PIPE,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stderr&lt;span style="color:#f92672"&gt;=&lt;/span&gt;subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;PIPE)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; out, err &lt;span style="color:#f92672"&gt;=&lt;/span&gt; p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;communicate()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; out&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;), err&lt;span style="color:#f92672"&gt;.&lt;/span&gt;decode(&lt;span style="color:#e6db74"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;), p&lt;span style="color:#f92672"&gt;.&lt;/span&gt;returncode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;execute&lt;/span&gt;(cmd, silent&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;False&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; silent:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;stdout&amp;#39;&lt;/span&gt;: devnull,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;stderr&amp;#39;&lt;/span&gt;: devnull,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retcode &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;call(cmd&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(), &lt;span style="color:#f92672"&gt;**&lt;/span&gt;params)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; retcode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;exists&lt;/span&gt;(cmd):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; execute(&lt;span style="color:#e6db74"&gt;&amp;#39;which &lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; cmd, silent&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_modified&lt;/span&gt;(ext):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modified &lt;span style="color:#f92672"&gt;=&lt;/span&gt; re&lt;span style="color:#f92672"&gt;.&lt;/span&gt;compile(&lt;span style="color:#e6db74"&gt;&amp;#39;^(?:M|A).(?P&amp;lt;name&amp;gt;.*\.&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;)&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; ext)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; out, _, _ &lt;span style="color:#f92672"&gt;=&lt;/span&gt; call(&lt;span style="color:#e6db74"&gt;&amp;#39;git status --porcelain&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modifieds &lt;span style="color:#f92672"&gt;=&lt;/span&gt; []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#f92672"&gt;in&lt;/span&gt; out&lt;span style="color:#f92672"&gt;.&lt;/span&gt;splitlines():
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;match&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; modified&lt;span style="color:#f92672"&gt;.&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;(line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; modifieds&lt;span style="color:#f92672"&gt;.&lt;/span&gt;append(&lt;span style="color:#66d9ef"&gt;match&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;group(&lt;span style="color:#e6db74"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; modifieds
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It's a work-in-progress, so you can find the &lt;a href="https://github.com/lbolla/dotfiles/blob/master/githooks/pre-commit"&gt;most updated version here&lt;/a&gt;. To use it, just drop it in your &lt;code&gt;.git/hooks&lt;/code&gt; directory. At every &lt;code&gt;git commit&lt;/code&gt;, it will run &lt;code&gt;[pep8][4]&lt;/code&gt; and &lt;code&gt;[pyflakes][5]&lt;/code&gt; on &lt;code&gt;.py&lt;/code&gt; files, and &lt;code&gt;[gjslint][6]&lt;/code&gt; on &lt;code&gt;.js&lt;/code&gt; files.&lt;/p&gt;</description></item><item><title>pylint.vim</title><link>https://lbolla-info.netlify.app/blog/pylint.vim/</link><pubDate>Thu, 25 Aug 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/pylint.vim/</guid><description>&lt;p&gt;&lt;code&gt;vim&lt;/code&gt; + Python + &lt;a href="http://www.logilab.org/857"&gt;&lt;code&gt;pylint&lt;/code&gt;&lt;/a&gt; is a powerful combination, especially when using this &lt;a href="http://www.vim.org/scripts/script.php?script_id=891"&gt;&lt;code&gt;vim&lt;/code&gt; plugin&lt;/a&gt;. Unfortunately, the script stopped working after a &lt;code&gt;pylint&lt;/code&gt; upgrade:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ pylint --version
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pylint 0.24.0,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;astng 0.22.0, common 0.56.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Python 2.7.2 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;default, Jun &lt;span style="color:#ae81ff"&gt;29&lt;/span&gt; 2011, 11:10:00&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;GCC 4.6.1&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can download the &lt;a href="https://gist.github.com/1170413"&gt;fixed version here&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;If interested, the patch looks like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-vimscript" data-lang="vimscript"&gt;diff pylint.vim.orig pylint.vim
69c69
&amp;lt; CompilerSet makeprg=(echo\ &amp;#39;[%]&amp;#39;;\ pylint\ -r\ y\ %)
---
&amp;gt; CompilerSet makeprg=(echo\ &amp;#39;[%]&amp;#39;;\ pylint\ -r\ y\ --output-format=parseable\
&amp;gt; %)
74c74
&amp;lt; CompilerSet efm=%+P[%f],%t:\ %#%l:%m,%Z,%+IYour\ code%m,%Z,%-G%.%#
---
&amp;gt; CompilerSet efm=%f:%l:\ [%t]%m,%f:%l:%m
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>MD5 vs SHA1 in Python</title><link>https://lbolla-info.netlify.app/blog/md5-vs-sha1-in-python/</link><pubDate>Wed, 24 Aug 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/md5-vs-sha1-in-python/</guid><description>&lt;p&gt;If you are interested to know if the &lt;a href="http://omnifarious.livejournal.com/363945.html"&gt;myth about &lt;code&gt;MD5&lt;/code&gt; being faster than &lt;code&gt;SHA1&lt;/code&gt;&lt;/a&gt; holds for Python, here is the result I got on my box:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-ipython" data-lang="ipython"&gt;In [1]: import hashlib
In [2]: %timeit hashlib.md5(&amp;#39;text text text&amp;#39;).hexdigest()
1000000 loops, best of 3: 1.29 us per loop
In [3]: %timeit hashlib.sha1(&amp;#39;text text text&amp;#39;).hexdigest()
1000000 loops, best of 3: 1.4 us per loop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Result is: &lt;code&gt;MD5&lt;/code&gt; is faster, but only just, in Python 2.7.2. Considering that &lt;a href="http://en.wikipedia.org/wiki/%60MD5%60"&gt;&lt;code&gt;MD5&lt;/code&gt; is broken&lt;/a&gt;, I think I'll use &lt;code&gt;SHA1&lt;/code&gt;&amp;hellip;&lt;/p&gt;</description></item><item><title>Get registered domain in Python and Javascript</title><link>https://lbolla-info.netlify.app/blog/get-registered-domain-in-python-and-javascript/</link><pubDate>Tue, 05 Apr 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/get-registered-domain-in-python-and-javascript/</guid><description>&lt;p&gt;&lt;a href="http://www.dkim-reputation.org/regdom-libs/"&gt;reg-dom-libs&lt;/a&gt; are a set of libraries for &lt;code&gt;C&lt;/code&gt;, &lt;code&gt;PHP&lt;/code&gt; and &lt;code&gt;Perl&lt;/code&gt; to convert an arbitrary domain name to the registered domain name.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For simple domains, like &lt;code&gt;www.amazon.com&lt;/code&gt; or &lt;code&gt;news.ycombinator.com&lt;/code&gt;, the task is trivial.&lt;/li&gt;
&lt;li&gt;For more complicated ones, like &lt;code&gt;www.ebay.co.uk&lt;/code&gt; or &lt;code&gt;www.japantimes.co.jp&lt;/code&gt;, handling the second level subdomain is a little painful.&lt;/li&gt;
&lt;li&gt;For exoteric ones, like &lt;code&gt;nic.com.ai&lt;/code&gt; or &lt;code&gt;www.nic.net.ge&lt;/code&gt; or &lt;code&gt;公司.cn&lt;/code&gt;, the problem becomes virtually impossible.&lt;/li&gt;
&lt;li&gt;After seeing stupid ones, like &lt;code&gt;www.comune.caserta.it&lt;/code&gt; (believe it or not, the registered domain is &lt;code&gt;comune.caserta.it&lt;/code&gt;!), I gave up finding an elegant algorithm for the problem.&lt;/li&gt;
&lt;li&gt;A full list of valid registered domain is necessary. Luckily, it is available (and nightly updated) &lt;a href="http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1"&gt;here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inspired by &lt;a href="http://www.dkim-reputation.org/regdom-libs/"&gt;reg-dom-libs&lt;/a&gt;, I've ported the algorithm to &lt;a href="https://github.com/lbolla/junk/blob/master/utils/regdomain.py"&gt;Python&lt;/a&gt; and &lt;a href="https://github.com/lbolla/junk/blob/master/utils/regdomain.js"&gt;Javascript&lt;/a&gt;. See the tests at the end of each file for an example of the usage. A demo is available &lt;a href="file:///junk/regdomain/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>twill revived</title><link>https://lbolla-info.netlify.app/blog/twill-revived/</link><pubDate>Fri, 11 Mar 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/twill-revived/</guid><description>&lt;p&gt;After reading &lt;a href="https://docs.google.com/viewer?url=http://adam.therobots.org/talks/testing.pdf"&gt;how to do automated testing in python&lt;/a&gt;, I've started using &lt;a href="http://twill.idyll.org/"&gt;twill&lt;/a&gt;, by &lt;a href="mailto:titus@idyll.org"&gt;C. Titus Brown&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;twill is a simple language that allows users to browse the Web from a command-line interface. With twill, you can navigate through Web sites that use forms, cookies, and most standard Web features.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unfortunately, development on twill seems to have stopped 3 years ago.&lt;/p&gt;
&lt;p&gt;I've &lt;a href="http://github.com/lbolla/twill"&gt;cloned the project on Github&lt;/a&gt;, fixed some deprecation warnings and added a cool new feature to inspect headers, as well as html.&lt;/p&gt;</description></item><item><title>tdaemon for Python3</title><link>https://lbolla-info.netlify.app/blog/tdaemon-for-python3/</link><pubDate>Sun, 20 Feb 2011 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/tdaemon-for-python3/</guid><description>&lt;p&gt;&lt;a href="https://github.com/brunobord/tdaemon"&gt;tdaemon&lt;/a&gt; is a neat little utility to do &lt;a href="http://weblog.patrice.ch/2009/02/07/continuous-testing-with-python.html"&gt;continuous testing&lt;/a&gt; in Python. Unfortunately, the original version only works with Python2. I've spent a little time to &lt;a href="https://github.com/lbolla/tdaemon"&gt;make it work with Python3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description></item><item><title>Missing `Dec_0` and friends from Python Decimal</title><link>https://lbolla-info.netlify.app/blog/missing-dec_0-and-friends-from-python-decimal/</link><pubDate>Thu, 29 Jul 2010 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/missing-dec_0-and-friends-from-python-decimal/</guid><description>&lt;p&gt;This fails in &lt;code&gt;py2.4&lt;/code&gt;, &lt;code&gt;py2.5.1&lt;/code&gt; and &lt;code&gt;py2.6&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; decimal &lt;span style="color:#f92672"&gt;import&lt;/span&gt; Dec_0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But it works in all the other &lt;code&gt;py2.5&lt;/code&gt; subversions!&lt;/p&gt;
&lt;p&gt;It seems that exposing &lt;code&gt;Dec_0&lt;/code&gt; (and other similar constants) was considered a &lt;a href="http://bugs.python.org/issue4812"&gt;bug&lt;/a&gt; and &amp;quot;fixed&amp;quot; on Jan 3rd 2009 by renaming it &lt;code&gt;_Dec_0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Indeed, if I had looked at the source code, I would have seen that &lt;code&gt;Dec_0&lt;/code&gt; was for &amp;quot;internal use only&amp;quot;.&lt;/p&gt;
&lt;p&gt;From &lt;code&gt;/usr/lib/python2.5/decimal.py:5159&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Reusable defaults&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Inf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#e6db74"&gt;&amp;#39;Inf&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;negInf &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#e6db74"&gt;&amp;#39;-Inf&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NaN &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#e6db74"&gt;&amp;#39;NaN&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dec_0 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dec_p1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dec_n1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Decimal(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Those definitions are missing in &lt;code&gt;py2.4&lt;/code&gt; and &lt;code&gt;py2.5.1&lt;/code&gt;, and renamed in &lt;code&gt;py2.6&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Wordpress Python library</title><link>https://lbolla-info.netlify.app/blog/wordpress-python-library/</link><pubDate>Sun, 06 Jun 2010 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/wordpress-python-library/</guid><description>&lt;p&gt;Today, I found &lt;a href="http://www.blackbirdblog.it/programmazione/progetti/28"&gt;this&lt;/a&gt;. It's a wonderfully simple Python library to manage your Wordpress blog via &lt;a href="http://www.xmlrpc.com"&gt;XML-RPC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description></item><item><title>vim and Python comments</title><link>https://lbolla-info.netlify.app/blog/vim-and-python-comments/</link><pubDate>Wed, 12 Aug 2009 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/vim-and-python-comments/</guid><description>&lt;p&gt;I'm currently undergoing a profound revision (read &amp;quot;cleanup&amp;quot;) of my &lt;code&gt;.vimrc&lt;/code&gt; and I recently had to choose a decent plug-in to comment python code.&lt;/p&gt;
&lt;p&gt;The best so far is &lt;a href="http://www.vim.org/scripts/script.php?script_id=23http://www.vim.org/scripts/script.php?script_id=23"&gt;EnhancedCommentify&lt;/a&gt;. It's highly configurable, powerful and it supports a different number of languages (not only python).&lt;/p&gt;
&lt;p&gt;The only one thing that wasn't easy to setup if the behaviour described &lt;a href="http://chistera.yi.org/~adeodato/blog/entries/2008/03/02/vim_enhanced_commentify_UseBlockIndent_with_nmap.html"&gt;here&lt;/a&gt;: being able to comment a block, respecting the indent, in both visual and normal mode.&lt;/p&gt;</description></item><item><title>qwerty vs dvorak vs colemak to edit Python code</title><link>https://lbolla-info.netlify.app/blog/qwerty-vs-dvorak-vs-colemak-to-edit-python-code/</link><pubDate>Mon, 02 Feb 2009 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/qwerty-vs-dvorak-vs-colemak-to-edit-python-code/</guid><description>&lt;p&gt;Yesterday, I was intrigued by the idea of choosing a more efficient keyboard layout to work with everyday. As long as I type Python code 90% of my time, I decided to evaluate the efficiency of the first 3 most widespread keyboard layouts: &lt;a href="http://en.wikipedia.org/wiki/QWERTY"&gt;QWERTY&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard"&gt;Dvorak&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Colemak"&gt;Colemak&lt;/a&gt;. I used &lt;a href="http://www.codeaxe.co.uk/dvorak/"&gt;this excellent tool&lt;/a&gt; to compare the three layouts over the first 50000 characters of the &lt;a href="http://webpy.org/"&gt;webpy&lt;/a&gt; source code. Here are the results:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; &amp;lt;div id=&amp;#34;page&amp;#34;&amp;gt;
 &amp;lt;div id=&amp;#34;text&amp;#34;&amp;gt;
 &amp;lt;h1&amp;gt;
The Qwerty Keyboard Layout Vs The Dvorak Keyboard Layout
 &amp;lt;/h1&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;
:: UP ::Overall effort
 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead class=&amp;#34;small&amp;#34;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;
Layout
 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;
Effort
 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


% improvement over worst layout


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


306,509.6


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


283,868.7


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


275,347.6


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Keys for each finger (stronger fingers should be used more often)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead class=&amp;#34;small&amp;#34;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Layout


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Thumbs


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


LPinky


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


LRing


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


LMiddle


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


LIndex


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


RIndex


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


RMiddle


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


RRing


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


RPinky


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Total


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


12.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


5.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


11.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


5.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


13.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


13.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


5.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


17.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


12.7 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


6.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead class=&amp;#34;small&amp;#34;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Layout


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Thumbs


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Left hand


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Right hand


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Total


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


38.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


35.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


33.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


40.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


34.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


39.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54,237.0 keys


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Finger Travel Distance (only the horizontal)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead class=&amp;#34;small&amp;#34;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Layout


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Thumbs


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


LPinky


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


LRing


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


LMiddle


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


LIndex


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


RIndex


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


RMiddle


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


RRing


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


RPinky


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Total


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


18.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


15.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


12.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


23.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,441.5 m


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


21.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


3.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


12.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


30.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,210.3 m


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


23.7 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


6.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


28.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,131.2 m


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;thead class=&amp;#34;small&amp;#34;&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Layout


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Thumbs


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Left hand


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;


Right hand


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Total


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/thead&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


46.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


54.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,441.5 m


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


38.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


61.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,210.3 m


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34;&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


42.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


57.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a1&amp;#34; style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1,131.2 m


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;a0&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% home keys (out of all character keys plus SHIFT and ENTER, but excluding keys operated by thumbs)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


20.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


33.7 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


38.7 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% keys typed with the same finger as the previous key (excluding repeating keys like ss)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.5 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


3.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


3.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% keys typed with the same hand as the previous key (ex: in Qwerty sd or ss are included, but s s is not since you type the space with the other hand)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


26.8 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


20.0 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


24.6 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% keys typed with the same hand as the previous key and jumping a row (ex: in Qwerty ev is a row jump -- you jump over the middle row -- and it&amp;#39;s awkward to type; ef is not a row jump)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


10.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


5.7 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.1 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% keys typed with the same hand as the previous key and in reverse order (ex: in Qwerty df or kj are typed in the easier order pinky-ring-middle-index, whereas fd and jk are in reverse order index-middle-ring-pinky, and harder to type)


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


15.4 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


11.9 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


15.2 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::% keys that need the SHIFT modifier


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Qwerty


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Dvorak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


Colemak


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14.3 %


 &amp;lt;/td&amp;gt;
 &amp;lt;td class=&amp;#34;bar&amp;#34;&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Pairs of consecutive keys typed with the same finger in Qwerty


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


:/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


253 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.47 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


de


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


200 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.37 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


tr


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


158 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.29 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


rt


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


102 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.19 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ol


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


99 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.18 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


un


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


98 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.18 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


q\_LeftShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


87 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ce


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


86 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


“/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


81 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ed


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


80 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


}/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


62 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Pairs of consecutive keys typed with the same finger in Dvorak


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ct


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


196 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.36 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


s\_RightShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


169 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.31 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


db


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


152 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.28 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


l\_RightShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


137 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.25 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


‘/LeftShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


133 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.25 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


rn


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


115 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.21 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ls


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


100 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.18 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


}/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


62 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


=/RightShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


59 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


“/LeftShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


58 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


e.


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


58 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Pairs of consecutive keys typed with the same finger in Colemak


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


:/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


253 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.47 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


ue


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


237 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.44 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


db


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


152 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.28 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


e,


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


89 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


q\_LeftShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


87 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


“/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


81 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


}/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


62 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.11 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


]/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


46 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.08 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


pt


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


44 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.08 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


‘/RightShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


41 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.08 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


“/RightShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


41 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.08 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Key frequency in your text


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/Space/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14067 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


25.94 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4391 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8.10 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


e


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


3239 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


5.97 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


t


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2184 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.03 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


s


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2170 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


4.00 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


r


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1890 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


3.48 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


a


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1619 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.99 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


o


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1557 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.87 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


l


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1530 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.82 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


n


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1519 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.80 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1511 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.79 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


i


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1372 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.53 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/RightShift/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1357 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.50 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


d


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1014 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.87 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


f


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


971 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.79 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


c


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


855 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.58 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


u


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


851 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.57 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


m


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


716 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.32 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


p


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


715 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.32 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


(


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


674 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.24 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


)


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


673 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.24 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


.


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


658 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.21 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


‘


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


623 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


,


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


573 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.06 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


b


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


571 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.05 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


“


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


563 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.04 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


554 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.02 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


=


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


518 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.96 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


:


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


490 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.90 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


q


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


463 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.85 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


y


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


423 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.78 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


h


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


416 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.77 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


w


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


352 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.65 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


&amp;gt;


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


348 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.64 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


g


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


304 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.56 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


v


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


257 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.47 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


x


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


253 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.47 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


k


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


231 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.43 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


&amp;lt;


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


154 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.28 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


125 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.23 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


[]


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


119 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.22 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


;


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


113 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.21 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


0


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


86 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


`


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


85 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.16 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


+


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


84 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


1


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


81 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


{


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


80 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


}


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


79 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.15 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


-


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


78 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.14 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


j


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


76 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.14 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


*


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


72 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.13 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


#


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


69 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.13 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


2


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


67 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.12 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


%


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


55 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.10 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


$


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


52 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.10 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


3


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


31 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.06 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


6


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


29 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.05 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


8


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


18 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.03 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


@


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


17 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.03 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


14 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.03 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


z


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


13 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.02 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


5


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


13 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.02 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


4


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.01 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


?


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


8 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.01 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


9


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


7 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.01 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;hr /&amp;gt;
 &amp;lt;h2 style=&amp;#34;font-size: 90%;&amp;#34;&amp;gt;


:: UP ::Frequent pairs of keys in your text


 &amp;lt;/h2&amp;gt;
 &amp;lt;table&amp;gt;
 &amp;lt;tbody&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_Space\_\_Space\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


9243 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


17.04 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_NewLine\_\_Space\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1233 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


2.27 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_Space\_\_LeftShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


805 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.48 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/(


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


674 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.24 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/)


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


673 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.24 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/”


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


563 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.04 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_LeftShift\_\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


554 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.02 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


se


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


549 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.01 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


,/Space/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


543 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


1.00 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/:


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


490 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.90 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


el


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


405 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.75 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


er


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


377 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.70 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


in


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


364 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.67 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


\_Space\_\_RightShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


362 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.67 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


or


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


352 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.65 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/LeftShift/&amp;gt;


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


348 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.64 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/Space/i


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


344 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.63 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/Space/s


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


341 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.63 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


te


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


340 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.63 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


e\_LeftShift\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


338 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.62 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


=/Space/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


332 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.61 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


/Space/=


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


321 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.59 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


re


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


306 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.56 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


lf


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


294 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.54 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


)/NewLine/


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


281 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.52 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;tr&amp;gt;
 &amp;lt;td&amp;gt;


e\_Space\_


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


281 times


 &amp;lt;/td&amp;gt;
 &amp;lt;td style=&amp;#34;text-align: right;&amp;#34;&amp;gt;


0.52 %


 &amp;lt;/td&amp;gt;
 &amp;lt;/tr&amp;gt;
 &amp;lt;/tbody&amp;gt;
 &amp;lt;/table&amp;gt;
 &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Actually, I was disappointed: there seem to be no clear advantage of Dvorak or Colemak, wrt QWERTY and, given the popularity of the latter, switching does not seem to be a good idea&amp;hellip;&lt;/p&gt;</description></item><item><title>py2dot</title><link>https://lbolla-info.netlify.app/blog/py2dot/</link><pubDate>Sun, 05 Oct 2008 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/py2dot/</guid><description>&lt;p&gt;&lt;img src="complicated.png" alt="py2dot example"&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;py2dot&lt;/code&gt; is a Python script to generate graphs from a  python program. It interprets a Python program as a graphs of function calls. It can represent classes and imported modules.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pypi.python.org/pypi/py2dot/"&gt;py2dot is available from pypi&lt;/a&gt;. More information are available &lt;a href="http://packages.python.org/py2dot/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Tab completion in Python shell</title><link>https://lbolla-info.netlify.app/blog/tab-completion-in-python-shell/</link><pubDate>Wed, 25 Jun 2008 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/tab-completion-in-python-shell/</guid><description>&lt;p&gt;Recently &lt;a href="http://groups.google.com/group/comp.lang.python/browse_thread/thread/b1f19db3f69cd8ce#"&gt;I saw with this little piece of code&lt;/a&gt; to give the standard python shell tab completion capabilities:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# setup tab completion in python shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; rlcompleter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; readline
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;readline&lt;span style="color:#f92672"&gt;.&lt;/span&gt;parse_and_bind(&lt;span style="color:#e6db74"&gt;&amp;#34;tab: complete&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Obviously, you can use the environmental variable &lt;code&gt;PYTHONSTART&lt;/code&gt; to execute this few lines anytime you start your python shell.&lt;/p&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</description></item><item><title>Python and vim</title><link>https://lbolla-info.netlify.app/blog/python-and-vim/</link><pubDate>Tue, 22 Apr 2008 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/python-and-vim/</guid><description>&lt;p&gt;Just a reminder of a very useful set of tips to effectively use vim to edit Python files: &lt;a href="http://henry.precheur.org/2008/4/18/Indenting%20Python%20with%20VIM.html"&gt;http://henry.precheur.org/2008/4/18/Indenting%20Python%20with%20VIM.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Memoize</title><link>https://lbolla-info.netlify.app/blog/memoize/</link><pubDate>Thu, 17 Apr 2008 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/memoize/</guid><description>&lt;p&gt;Recently, from a &lt;a href="http://groups.google.it/group/scipy-user/browse_thread/thread/d1bbbe898d099904/1cb8574c84168c57?hl=it&amp;amp;lnk=gst&amp;amp;q=memoize#1cb8574c84168c57"&gt;discussion&lt;/a&gt; on the &lt;a href="http://groups.google.it/group/scipy-user"&gt;scipy-user group&lt;/a&gt; I discovered a very elegant way to code a function with memory.&lt;/p&gt;
&lt;p&gt;Let's state the problem. Suppose you need a function that remembers, for each time it has been called, the input parameters and its output. This can be very useful in many different situations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If it is very expensive to evaluate, you can check its memory to see if it has been previously evaluated and, if yes, get its return value without actually calling it.&lt;/li&gt;
&lt;li&gt;Inside an optimization loop, to remember all the intermediate steps of the optimization.&lt;/li&gt;
&lt;li&gt;To accumulate data on the behaviour of the function itself.&lt;/li&gt;
&lt;li&gt;To surprise friends ;-)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The function's memory can be as long as the program's running time, or it can be &amp;quot;permanent&amp;quot; if hard-coded in a file. Starting from &lt;a href="http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/466320"&gt;here&lt;/a&gt; I've put together a couple of useful classes in python that can be used as decorators.&lt;/p&gt;</description></item><item><title>IQ test</title><link>https://lbolla-info.netlify.app/blog/iq-test/</link><pubDate>Sat, 02 Feb 2008 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/iq-test/</guid><description>&lt;p&gt;Qualche giorno fa, mi sono imbattuto in questo &lt;a href="http://www.ecmselection.co.uk/high_iq_enter_and_win/brainbuster_no_25_-_remove_digits.html"&gt;test di intelligenza&lt;/a&gt;, proposto da &lt;a href="http://www.ecmselection.co.uk/"&gt;ECM&lt;/a&gt;. Riporto il testo, per semplicita':&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Using each of the numbers 1, 2, 3, 4, 5, 6, 7, 8, 9 only once, form a nine digit number A that can satisfy the following criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A is exactly divisible by 9.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removing the rightmost digit from A forms an eight digit number B that is exactly divisible by 8.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removing the rightmost digit from B forms a seven digit number C that is exactly divisible by 7.&lt;/p&gt;</description></item><item><title>EMpy</title><link>https://lbolla-info.netlify.app/blog/empy/</link><pubDate>Thu, 27 Sep 2007 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/empy/</guid><description>&lt;p&gt;&lt;a href="http://empy.sourceforge.net"&gt;EMpy&lt;/a&gt; is out! Here is the release note:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I'm very pleased to announce the release of EMpy (Electromagnetic Python), a suite of numerical algorithms widely used in electromagnetism.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The package, in its very-alpha stage by now, only contains the transfer matrix and the rigorous coupled wave analysis algorithms, and some handy functions and classes (to model materials, for examples). The idea is to expand it in the near future with new algorithms and interfaces to existent software. The package is based on Numpy/Scipy and its homepage: &lt;a href="http://empy.sourceforge.net/"&gt;&lt;a href="http://empy.sourceforge.net"&gt;http://empy.sourceforge.net&lt;/a&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Papers about Python and scientific computing</title><link>https://lbolla-info.netlify.app/blog/papers-about-python-and-scientific-computing/</link><pubDate>Wed, 25 Apr 2007 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/papers-about-python-and-scientific-computing/</guid><description>&lt;p&gt;Here is a list of articles about Python and scientific computing appeared in &lt;a href="http://www.computer.org/portal/site/cise/index.jsp"&gt;Computing in Science and Engineering&lt;/a&gt;, available online:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.computer.org/portal/site/cise/menuitem.92a12adebee18778161489108bcd45f3/index.jsp?&amp;amp;pName=cise_level1_article&amp;amp;TheCat=1015&amp;amp;path=cise/2007/n3&amp;amp;file=oli.xml&amp;amp;"&gt;Python for Scientific Computing&lt;/a&gt; by Travis E. Oliphant (&lt;a href="http://www.computer.org/portal/cms_docs_cise/cise/2007/n3/10-20.pdf"&gt;pdf&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.computer.org/portal/site/cise/menuitem.92a12adebee18778161489108bcd45f3/index.jsp?&amp;amp;pName=cise_level1_article&amp;amp;TheCat=1015&amp;amp;path=cise/2007/n3&amp;amp;file=gei.xml&amp;amp;"&gt;Python: Batteries included&lt;/a&gt; by Paul F. Dubois;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.siue.edu/~rkrauss/pdfs/python-flexible-robots.pdf"&gt;A Python module for modeling and control design of flexible robots&lt;/a&gt; by Ryan W. Krauss;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cirl.berkeley.edu/twiki/pub/User/JarrodMillman/nipy-cise2007.pdf"&gt;Analysis of Functional Magnetic Resonance Imaging in Python&lt;/a&gt; by K. Jarrod Millman and Matthew Brett, Computing in Science and Engineering, vol. 9, no. 3, pp. 52-55, May/June, 2007;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://amath.colorado.edu/faculty/fperez/preprints/ipython-cise-final.pdf"&gt;IPython: A System for Interactive Scientific Computing&lt;/a&gt; by Fernando Perez;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nitace.bsd.uchicago.edu/misc/c3sci.pdf"&gt;Matplotlib: a 2D Graphics Environment&lt;/a&gt; by John D. Hunter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy reading!&lt;/p&gt;</description></item><item><title>Numerical computing Matlab vs Python + numpy + weave</title><link>https://lbolla-info.netlify.app/blog/numerical-computing-matlab-vs-python-+-numpy-+-weave/</link><pubDate>Wed, 11 Apr 2007 00:00:00 +0000</pubDate><guid>https://lbolla-info.netlify.app/blog/numerical-computing-matlab-vs-python-+-numpy-+-weave/</guid><description>&lt;p&gt;Recently, I've discovered the power of Python for numerical computing. Being a slave of Matlab for many years, I've decided to give Python (and it's numerical module &lt;code&gt;numpy&lt;/code&gt;) a try, comparing its number crunching capabilities versus Matlab's.&lt;/p&gt;
&lt;p&gt;The tests are heavily inspired by &lt;a href="http://www.scipy.org/PerformancePython"&gt;Prabhu Ramachandran&lt;/a&gt;. I've only added Matlab to complete his comparisons.&lt;/p&gt;
&lt;p&gt;Here is a short description of the test, taken from &lt;a href="http://www.scipy.org/PerformancePython"&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The example we will consider is a very simple (read, trivial) case of solving the 2D Laplace equation using an iterative finite difference scheme (four point averaging, Gauss-Seidel or Gauss-Jordan). The formal specification of the problem is as follows.&lt;/p&gt;</description></item></channel></rss>