<?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 Michele Bologna</title>
    <link>https://www.michelebologna.net/categories/python/</link>
    <description>Recent content in Python on Michele Bologna</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 02 Feb 2016 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.michelebologna.net/categories/python/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Spotify puzzles: round two</title>
      <link>https://www.michelebologna.net/2016/spotify-puzzles-round-two/</link>
      <pubDate>Tue, 02 Feb 2016 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2016/spotify-puzzles-round-two/</guid>
      <description>&lt;p&gt;Some months ago, &lt;a href=&#34;https://www.michelebologna.net/2015/05/spotify-puzzles-round-one/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;I began challenging myself with &lt;strong&gt;Spotify puzzles&lt;/strong&gt;&lt;/a&gt;: at that time I was dealing with an easy problem; now, the difficulty has increased. The round two consists in the typical &amp;ldquo;&lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Selection_algorithm&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Selection problem&lt;/a&gt;&lt;/em&gt;&amp;rdquo;: given an array of values, find the max (or min) &lt;code&gt;k&lt;/code&gt; values. I decided to still use Python and to use its &lt;strong&gt;heapq&lt;/strong&gt; module to store values in a binary max-heap data structure, and then remove exactly &lt;code&gt;k&lt;/code&gt; values from the top of the heap. This approach will guarantee that the total time complexity of the algorithm will be &lt;code&gt;O(n log k)&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fun with Python powered telnetd honeypot</title>
      <link>https://www.michelebologna.net/2015/fun-with-python-powered-telnetd-honeypot/</link>
      <pubDate>Fri, 04 Sep 2015 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2015/fun-with-python-powered-telnetd-honeypot/</guid>
      <description>&lt;h2 id=&#34;reason-hardening-serendipity-and-curiosity&#34;&gt;&#xA;  Reason: hardening, serendipity and curiosity&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#reason-hardening-serendipity-and-curiosity&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;As you already know, in the past weeks I hardened all of my boxes: while doing it, I flushed all iptables/ipfw rules, changed the default policy to DROP and take it from there to enable every rule as soon as I need it. Whilst Ubuntu uses &lt;a href=&#34;https://help.ubuntu.com/community/UFW&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;ufw&lt;/a&gt; as a fronted for iptables, Fedora uses &lt;a href=&#34;https://fedoraproject.org/wiki/FirewallD&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;firewalld&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spotify puzzles: round one</title>
      <link>https://www.michelebologna.net/2015/spotify-puzzles-round-one/</link>
      <pubDate>Sat, 16 May 2015 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2015/spotify-puzzles-round-one/</guid>
      <description>&lt;p&gt;Some time ago I came across &lt;a href=&#34;https://web.archive.org/web/20160413202413/https://labs.spotify.com/puzzles/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Spotify puzzles&lt;/a&gt;, a website in which Spotify&amp;rsquo;s engineers list a series of CS problems and gather solutions from interested people.&lt;/p&gt;&#xA;&lt;p&gt;The interesting idea is that all solutions should be sent via mail, and an honorable (automated) judge tests the solution and sends the feedback.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Formattare i decimali con Python</title>
      <link>https://www.michelebologna.net/2012/formattare-i-decimali-con-python/</link>
      <pubDate>Mon, 05 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2012/formattare-i-decimali-con-python/</guid>
      <description>&lt;p&gt;Un problema che ho recentemente risolto usando Python e la logica binaria prevedeva di stampare i numeri binari usando lo stesso numero di cifre [ad esempio: nel caso di 8 bit, stampare le parole di 4 bit anteponendo zero per quattro volte]. Tecnicamente, gli zero a sinistra sono ininfluenti ma servono per uniformare la formattazione, e in gergo sono chiamati &lt;em&gt;leading zeros&lt;/em&gt;. Questo ragionamento non vale solo per i numeri in binario, ma per tutti i casi in cui si vuole formattare l&amp;rsquo;output di Python.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Aggiornare tutti i package Python installati con pip</title>
      <link>https://www.michelebologna.net/2012/aggiornare-tutti-i-package-python-installati-con-pip/</link>
      <pubDate>Wed, 02 May 2012 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2012/aggiornare-tutti-i-package-python-installati-con-pip/</guid>
      <description>&lt;p&gt;Per aggiornare tutti i package Python installati, suggerisco di usare &lt;a href=&#34;http://www.pip-installer.org/en/latest/index.html&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;pip&lt;/a&gt; nel seguente modo:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Aggiorno pip all&amp;rsquo;ultima versione (suppongo di avere easy_install): &lt;code&gt;easy_install -U pip&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Estraggo la lista dei pkg installati e li aggiorno uno per uno: &lt;code&gt;pip freeze --local | cut -d = -f 1 | xargs pip install -U&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>django: come fare il deploy di un’applicazione su Apache</title>
      <link>https://www.michelebologna.net/2012/django-come-fare-il-deploy-di-unapplicazione-su-apache/</link>
      <pubDate>Tue, 28 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2012/django-come-fare-il-deploy-di-unapplicazione-su-apache/</guid>
      <description>&lt;p&gt;Una volta che avete terminato lo sviluppo di un&amp;rsquo;applicazione basata su django, è il momento di installarla in produzione. Nel mio caso, ho utilizzato django 1.3.1 e ho scelto di utilizzare &lt;a href=&#34;https://httpd.apache.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Apache&lt;/a&gt; e &lt;a href=&#34;https://code.google.com/p/modwsgi/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;mod_wsgi&lt;/a&gt;. Vediamo come fare il deploy passo-passo:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sviluppare applicazioni web con Django: la mia recensione</title>
      <link>https://www.michelebologna.net/2011/sviluppare-applicazioni-web-con-django-la-mia-recensione/</link>
      <pubDate>Wed, 30 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/sviluppare-applicazioni-web-con-django-la-mia-recensione/</guid>
      <description>&lt;p&gt;Spinto dalla curiosità, mi sono deciso ad imparare il &lt;strong&gt;framework &lt;a href=&#34;https://en.wikipedia.org/wiki/Django_%5c%28Web_framework%5c%29&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Django&lt;/a&gt;&lt;/strong&gt;, basato su Python, per sviluppare applicazioni web. In particolare, mi sono procurato il libro di &lt;a href=&#34;https://beri.it/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Marco Beri&lt;/a&gt; ``&lt;strong&gt;Sviluppare applicazioni web con Django&lt;/strong&gt;&amp;rsquo;&amp;rsquo;, edito da Apogeo. Comincio subito col dire che il prezzo è decisamente alto (32 Euro), nonostante il libro sia del 2009.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: scriviamo un generatore di Fibonacci ricorsivo (e poi iterativo) ed analizziamone la complessità asintotica</title>
      <link>https://www.michelebologna.net/2011/python-scriviamo-un-generatore-di-fibonacci-ricorsivo-e-poi-iterativo-ed-analizziamone-la-complessita-asintotica/</link>
      <pubDate>Tue, 14 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/python-scriviamo-un-generatore-di-fibonacci-ricorsivo-e-poi-iterativo-ed-analizziamone-la-complessita-asintotica/</guid>
      <description>&lt;p&gt;Tralasciando la parte matematica su cui potete trovare un&amp;rsquo;esauriente (ed interessante) spiegazione su Wikipedia, la &lt;a href=&#34;https://it.wikipedia.org/wiki/Successione_di_Fibonacci&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;serie di Fibonacci&lt;/a&gt; si definisce:&lt;/p&gt;&#xA;&lt;p&gt;F(n) = F(n-1) + F(n-2)&lt;/p&gt;&#xA;&lt;p&gt;per n &amp;gt; 1, e F(1) = 1 e F(0) = 0&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: scriviamo un HTTPS downloader simile a wget (con urllib2, optparse e getpass)</title>
      <link>https://www.michelebologna.net/2011/python-scriviamo-un-https-downloader-simile-a-wget-con-urllib2-optparse-e-getpass/</link>
      <pubDate>Thu, 02 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/python-scriviamo-un-https-downloader-simile-a-wget-con-urllib2-optparse-e-getpass/</guid>
      <description>&lt;p&gt;Per ragioni di semplicità di utilizzo e immediatezza (e anche per &lt;em&gt;imparare qualcosa di nuovo)&lt;/em&gt;, la settimana scorsa ho dovuto scrivere un downloader da linea di comando simile a GNU &lt;a href=&#34;https://www.gnu.org/software/wget/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;wget&lt;/a&gt;, ma con alcuni requisiti personalizzati:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Scambiare il contenuto di due variabili int senza utilizzare una variabile temporanea: XOR swap</title>
      <link>https://www.michelebologna.net/2011/scambiare-il-contenuto-di-due-variabili-int-senza-utilizzare-una-variabile-temporanea-xor-swap/</link>
      <pubDate>Tue, 19 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/scambiare-il-contenuto-di-due-variabili-int-senza-utilizzare-una-variabile-temporanea-xor-swap/</guid>
      <description>&lt;p&gt;Una domanda interessante che mi è stata posta è: &amp;ldquo;com&amp;rsquo;è possibile scambiare il contenuto di due variabili &lt;em&gt;senza utilizzare una variabile temporanea&lt;/em&gt;?&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Infatti, per scambiare il contenuto di due variabili, di solito si utilizza una variabile temporanea (vediamo un esempio in Python):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python e il metodo setdefault</title>
      <link>https://www.michelebologna.net/2011/python-e-il-metodo-setdefault/</link>
      <pubDate>Fri, 25 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/python-e-il-metodo-setdefault/</guid>
      <description>&lt;p&gt;Note to &lt;em&gt;self&lt;/em&gt; (pun intended): questo post rappresenta una sorta di appunto mentale per ricordarmi il funzionamento di &lt;code&gt;setdefault&lt;/code&gt; in Python, visto che puntualmente mi trovo ad utilizzarlo.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;setdefault&lt;/code&gt; è utilizzato sui dizionari (&lt;code&gt;dict&lt;/code&gt;) e permette di impostare una chiave di default durante una set. Mi spiego meglio con un esempio:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: scriviamo un quine</title>
      <link>https://www.michelebologna.net/2011/python-scriviamo-un-quine/</link>
      <pubDate>Tue, 01 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2011/python-scriviamo-un-quine/</guid>
      <description>&lt;p&gt;Una sfida che intriga molti programmatori è quella di scrivere un &lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Quine_%28computing%29&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;em&gt;quine&lt;/em&gt;&lt;/a&gt;&lt;/strong&gt;, ovvero quello di scrivere un programma che stampi il proprio sorgente.&lt;/p&gt;&#xA;&lt;p&gt;Partiamo con la definizione più semplice, e man mano aggiungiamo i vincoli necessari. Un programmatore furbo potrebbe stampare il contenuto del sorgente semplicemente aprendolo e stampando il contenuto:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trenitalia e Viaggiatreno: come implementare un servizio &#34;fai da te&#34; per avere le informazioni dello stato di un treno via SMS</title>
      <link>https://www.michelebologna.net/2010/trenitalia-e-viaggiatreno-come-implementare-un-servizio-fai-da-te-per-avere-le-informazioni-dello-stato-di-un-treno-via-sms/</link>
      <pubDate>Fri, 21 May 2010 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2010/trenitalia-e-viaggiatreno-come-implementare-un-servizio-fai-da-te-per-avere-le-informazioni-dello-stato-di-un-treno-via-sms/</guid>
      <description>&lt;p&gt;Da quando sono diventato un pendolare (per lavoro), ho iniziato a (ri)frequentare assiduamente le stazioni &lt;strong&gt;ferroviarie&lt;/strong&gt; e i treni di &lt;strong&gt;Trenitalia&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://www.flickr.com/photos/23681443@N05/4611971337/&#34; title=&#34;station.&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://farm5.static.flickr.com/4051/4611971337_4d468f8f49_t.jpg&#34; alt=&#34;station.&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Dopo un paio di settimane passate sui treni, mi sono accorto di un servizio interessante: il sito &lt;strong&gt;&lt;a href=&#34;http://www.viaggiatreno.it&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Viaggiatreno&lt;/a&gt;: il sito contiene le informazioni sui treni (informazioni in tempo reale sullo stato di un treno come ritardo o anticipo, ora prevista di arrivo e fermate già effettuate).&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: come ordinare un dizionario [dict] per chiave o per valore</title>
      <link>https://www.michelebologna.net/2009/python-come-ordinare-un-dizionario-dict-per-chiave-o-per-valore/</link>
      <pubDate>Mon, 07 Dec 2009 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2009/python-come-ordinare-un-dizionario-dict-per-chiave-o-per-valore/</guid>
      <description>&lt;p&gt;In Python, i dizionari (dict) sono una struttura dati associativa che associa una chiave ad un valore (k, v):&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;d = {}&#xA;d[&amp;#39;bart&amp;#39;] = &amp;#39;marge&amp;#39;&#xA;d[&amp;#39;maggie&amp;#39;] = &amp;#39;homer&amp;#39;&#xA;d[&amp;#39;milhouse&amp;#39;] = &amp;#39;nelson&amp;#39;&#xA;d[&amp;#39;lisa&amp;#39;] = &amp;#39;skinner&amp;#39;&#xA;&amp;gt;&amp;gt;&amp;gt; d&#xA;{&amp;#39;maggie&amp;#39;: &amp;#39;homer&amp;#39;, &amp;#39;lisa&amp;#39;: &amp;#39;skinner&amp;#39;, &amp;#39;bart&amp;#39;: &amp;#39;marge&amp;#39;, &amp;#39;milhouse&amp;#39;: &amp;#39;nelson&amp;#39;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Esistono due modi di ordinare un dizionario:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: uno script per eliminare i file Thumbs.db e le cartelle .DS_Store</title>
      <link>https://www.michelebologna.net/2008/python-uno-script-per-eliminare-i-file-thumbsdb-e-le-cartelle-ds_store/</link>
      <pubDate>Tue, 09 Sep 2008 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2008/python-uno-script-per-eliminare-i-file-thumbsdb-e-le-cartelle-ds_store/</guid>
      <description>&lt;p&gt;Windows XP crea automaticamente un file, chiamato Thumbs.db, in tutte le cartelle che visita per salvarne la visualizzazione (dettagli, anteprima, etc.). La stessa cosa fa OSX, creando addirittura (!) una cartella dal nome .DS_Store, contenente gli stessi attributi.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python: come mandare un e-mail con GMail TLS/SSL</title>
      <link>https://www.michelebologna.net/2008/python-come-mandare-un-e-mail-con-gmail-tlsssl/</link>
      <pubDate>Mon, 11 Aug 2008 00:00:00 +0000</pubDate>
      <guid>https://www.michelebologna.net/2008/python-come-mandare-un-e-mail-con-gmail-tlsssl/</guid>
      <description>&lt;p&gt;Mi è capitato di dover mandare un e-mail da uno script Python: quale provider utilizzare? Ovviamente GMail!&lt;/p&gt;&#xA;&lt;p&gt;Per questioni di spam, alcuni server SMTP non permettono di inviare e-mail senza essersi prima autenticati; nel caso di GMail, il protocollo per l&amp;rsquo;invio di mail non è il semplice SMTP in chiaro, bensì SMTP con autenticazione via TLS/SSL.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
