<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Claudio&#039;s Hideout &#187; Programmazione</title>
	<atom:link href="http://claudio.cicali.name/post/tag/programmazione/feed/" rel="self" type="application/rss+xml" />
	<link>http://claudio.cicali.name</link>
	<description>Claudio Cicali web hub</description>
	<lastBuildDate>Sun, 25 Sep 2011 11:29:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Rispetto il Python, ma non lo amo</title>
		<link>http://claudio.cicali.name/post/2009/01/rispetto-il-python-ma-non-lo-amo/</link>
		<comments>http://claudio.cicali.name/post/2009/01/rispetto-il-python-ma-non-lo-amo/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 11:43:44 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Rant]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=279</guid>
		<description><![CDATA[Il mio rapporto con il linguaggio Python è un matrimonio d&#8217;interesse. Lo uso perché nella mia fattispecie lavorativa credo sia la scelta più furba (più facile trovare programmatori Python che programmatori Ruby). Non lo amo, ma lo rispetto profondamente. Tuttavia, avendo un (arrugginito) background Ruby di un certo spessore, ci sono cose che, tutte le [...]]]></description>
			<content:encoded><![CDATA[<p>Il mio rapporto con il linguaggio Python è un matrimonio d&#8217;interesse. Lo uso perché nella mia fattispecie lavorativa credo sia la scelta più furba (più facile trovare programmatori Python che programmatori Ruby). Non lo amo, ma lo rispetto profondamente.</p>
<p>Tuttavia, avendo un (arrugginito) background Ruby di un certo spessore, ci sono cose che, tutte le volte che le incontro, mi fanno storcere la bocca e tappare il naso. In breve, Python mi sembra rozzo e molto più a &#8220;basso livello&#8221; di quello che si vorrebbe far credere.</p>
<p>Faccio un elenco brevissimo di quelle cosette che mi disturbano, per poi alla fine fare un concreto esempio. Premetto che so bene che questi non sono <em>difetti</em>, ma <em>particolarità</em> di un linguaggio che in onore della coerenza ha fatto delle scelte che, beh l&#8217;ho già detto, non mi piacciono.</p>
<ul>
<li>I builtin. Mi spiace, ma non riesco a pensare al Python come un linguaggio puramente a oggetti</li>
<li>Il <em>self</em> come parametro esplicito</li>
<li>__init__ che è un metodo come tutti gli altri, <a href="http://mail.python.org/pipermail/python-dev/2005-January/050656.html">ma anche no</a></li>
<li>Il fatto che esistano le classi &#8220;new style&#8221;, che inficia tra le altre cose il comportamento di super()</li>
<li>Il super(), concetto piuttosto importantino nella OO, il cui comportamento <a href="http://fuhm.net/super-harmful/">non è mica scontatissimo</a></li>
<li>L&#8217;ereditarietà, con <em>effetti collaterali</em> poco intuitivi. Vi pare <em>elegante</em>, poi, una cosa di questo tipo? super(AppdateHTTPRetriever, self).__init__()</li>
<li>Il modo <em>esplicito</em> per fare setters e getters <em>dinamici</em> (che dovrebbero invece essere <em>impliciti)</em>, ovvero le property</li>
<li>Certe curiose caratteristiche dello <em>scoping</em> <em>globale</em> delle variabili</li>
<li>Il <em>pass</em>, che mi fa abbastanza ridere (<a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/182652">Matz take on that</a>)</li>
<li>la nausea da __ __ __</li>
<li><em>hasattr</em> e <em>has_key, </em>che, oltre alla non consistenza del nome, uno è un builtin e uno è un metodo (sì, uno è per gli oggetti e uno è per i dizionari, ma allora vedi punto 1)</li>
</ul>
<p>Ed ora un esempio.</p>
<p>Problema: data una directory dove risiedono dei &#8220;bot&#8221;, creare uno script che li esegua tutti uno ad uno. Ogni bot non è altro che una classe, che va dinamincamente istanziata ed eseguito il metodo &#8220;run&#8221; sulla stessa (la classe ha lo stesso nome del file Bot).</p>
<p>Fornisco due soluzioni, una in Python e una in Ruby. Quale vi sembra più <em>leggibile</em>?</p>
<p>Python:</p>
<pre># Richiede __init__.py nella directory dei bot
import glob, os
for filename in glob.glob("bots/Bot_*.py"):
  classname = modulename = os.path.splitext(os.path.split(filename)[-1])[0]
  package = filename.replace("/", ".")[:-3]
  mod = __import__(package)
  bot = mod.__dict__[modulename].__dict__[classname]()
  if hasattr(bot, "run"):
    bot.run()</pre>
<p>Ruby:</p>
<pre>Dir.glob('bots/Bot_*.rb').each() do | file |
  require file
  classname = file.split('/')[1].gsub('.rb','')
  bot = Object.const_get(classname).new()
  if (bot.methods.include?('run'))
    bot.run()
  end
end</pre>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2009/01/rispetto-il-python-ma-non-lo-amo/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP ip2long() madness</title>
		<link>http://claudio.cicali.name/post/2008/10/php-ip2long-madness/</link>
		<comments>http://claudio.cicali.name/post/2008/10/php-ip2long-madness/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 00:46:59 +0000</pubDate>
		<dc:creator>claudio</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://claudio.cicali.name/?p=21</guid>
		<description><![CDATA[Capita abbastanza spesso di dover salvare un indirizzo IP in una tabella di database. La teoria e la pratica insegnano quanto sia meglio salvare non la string CHAR(15) dell’IP, ma la sua rappresentazione numerica (si salva spazio, le ricerche sono più pratiche, gli indici velocissimi). Si dà il caso, poi, che sia MySQL che PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Capita abbastanza spesso di dover salvare un indirizzo IP in una tabella di database. La teoria e la pratica insegnano quanto sia meglio salvare non la string CHAR(15) dell’IP, ma la sua rappresentazione numerica (si salva spazio, le ricerche sono più pratiche, gli indici velocissimi).</p>
<p>Si dà il caso, poi, che sia MySQL che PHP abbiano delle funzioncine proprio adatte allo scopo. Rispettivamente INET_NTOA, INET_ATON e long2ip() e ip2long(). PostgreSQL ha addirittura un tipo di dato specifico, se non erro.</p>
<p>Il problema è che nei sistemi a 32bit la funzione PHP ip2long() ritorna un intero SIGNED, spesso negativo, mentre nei sistemi a 64bit torna <em>sempre</em> un UNSIGNED.</p>
<p>Se di questa cosa non te ne accorgi, avrai fatto la colonna della tua tabella come normale INTEGER (dunque SIGNED) e tutti i tuoi test funzioneranno alla grande.</p>
<p>Poi passi in produzione a 64bit e la tabella si riempirà di valori molto vicini a 2^31 (ovvero 127.255.255.255).</p>
<p><strong>Soluzione</strong>: il campo della tabella lo devi fare INT(11) UNSIGNED e in tabella dovrai sempre scrivere il valore UNSIGNED; per fare questo, un sistema è usare qualcosa come $ip = sprintf(‘%u’,ip2long($ip)) o qualcos’altro di più veloce con l’operatore shift (mai programmato videogiochi, mai preso confidenza con ‘ste robe arcane);</p>
<p>Nota numero <em>uno</em>: INTEGER UNSIGNED e basta mi pare crei un INT(10), non sufficiente. Meglio specificare INTEGER(11) UNSIGNED.</p>
<p>Nota numero <em>due</em>: usare BIGINT non è consigliabile, perché le INET_* non funzionano con quel tipo di dato.</p>
]]></content:encoded>
			<wfw:commentRss>http://claudio.cicali.name/post/2008/10/php-ip2long-madness/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

