<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Programming on Nicola Iarocci</title>
    <link>https://nicolaiarocci.com/categories/programming/</link>
    <description>Recent content in Programming on Nicola Iarocci</description>
    <generator>Hugo -- 0.143.1</generator>
    <language>en</language>
    <copyright>Produced / Written / Maintained by Nicola Iarocci since 2010</copyright>
    <lastBuildDate>Thu, 01 Sep 2016 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://nicolaiarocci.com/categories/programming/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Cerberus 1.0 has been released</title>
      <link>https://nicolaiarocci.com/cerberus-1-0-released/</link>
      <pubDate>Thu, 01 Sep 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-1-0-released/</guid>
      <description>&lt;p&gt;After a one year long development cycle I am proud to announce that version 1.0 of &lt;a href=&#34;http://python-cerberus.org&#34;&gt;Cerberus&lt;/a&gt;, the data validation and transformation tool for Python, is finally out. A while ago I wrote an article on the &lt;a href=&#34;http://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/&#34;&gt;new features and breaking changes&lt;/a&gt; that come with it, so please check it out carefully along with the &lt;a href=&#34;http://docs.python-cerberus.org/en/stable/changelog.html&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I just wish to reiterate my gratitude towards all the contributors to the project. The ones who specifically worked on this awesome release, those who made it all possible, are: Matthew Ellison, Dominik Kellner, David Kirkendall, Damián Nohales, calve, Jonathan Huot, Roman Redkovich and of course the one and the only Frank Sachsenheim, whose role was pivotal to this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>After a one year long development cycle I am proud to announce that version 1.0 of <a href="http://python-cerberus.org">Cerberus</a>, the data validation and transformation tool for Python, is finally out. A while ago I wrote an article on the <a href="http://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/">new features and breaking changes</a> that come with it, so please check it out carefully along with the <a href="http://docs.python-cerberus.org/en/stable/changelog.html">changelog</a>.</p>
<p>I just wish to reiterate my gratitude towards all the contributors to the project. The ones who specifically worked on this awesome release, those who made it all possible, are: Matthew Ellison, Dominik Kellner, David Kirkendall, Damián Nohales, calve, Jonathan Huot, Roman Redkovich and of course the one and the only Frank Sachsenheim, whose role was pivotal to this release.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve SDK for .NET v0.2 is out in the wild</title>
      <link>https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</link>
      <pubDate>Tue, 02 Aug 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-sdk-for-net-v0-2-is-out-in-the-wild/</guid>
      <description>&lt;p&gt;I just released a long overdue update to &lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET/&#34;&gt;Eve.NET&lt;/a&gt;. This release marks a significant improvement over the previous one, which was more a prototype than a real package. New features are as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PostAsync()&lt;/code&gt; supports bulk inserts&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DeleteAsync()&lt;/code&gt; supports bulk deletes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;softDelete&lt;/code&gt; option to include soft-deleted documents with query results&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAsync()&lt;/code&gt; has a &lt;code&gt;rawQuery&lt;/code&gt; option to pass raw Eve queries to the server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BearerAuthenticator&lt;/code&gt; class adds support for Bearer Token authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several fixes made it into this release and, most importantly, I switched to portable Profile259 which offers support for the following platforms: Xamarin.iOS, Xamarin.Android, WinPhone 8.1, Windows 8, .NET 4.5+. Yes, that means no more support for .NET 4.0. See the &lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET/blob/master/CHANGES&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I just released a long overdue update to <a href="https://github.com/nicolaiarocci/Eve.NET/">Eve.NET</a>. This release marks a significant improvement over the previous one, which was more a prototype than a real package. New features are as follows:</p>
<ul>
<li><code>PostAsync()</code> supports bulk inserts</li>
<li><code>DeleteAsync()</code> supports bulk deletes</li>
<li><code>GetAsync()</code> has a <code>softDelete</code> option to include soft-deleted documents with query results</li>
<li><code>GetAsync()</code> has a <code>rawQuery</code> option to pass raw Eve queries to the server</li>
<li><code>BearerAuthenticator</code> class adds support for Bearer Token authentication</li>
</ul>
<p>Several fixes made it into this release and, most importantly, I switched to portable Profile259 which offers support for the following platforms: Xamarin.iOS, Xamarin.Android, WinPhone 8.1, Windows 8, .NET 4.5+. Yes, that means no more support for .NET 4.0. See the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/CHANGES">changelog</a> for details.</p>
<p>Eve.NET v0.2 is on NuGet so you can install it either from Visual Studio or with the Package Manager console. Enjoy!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introducing SimpleObjectCache a simple cross-platform object cache for .NET systems</title>
      <link>https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</link>
      <pubDate>Wed, 20 Jul 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introducing-simpleobjectcache-a-simple-cross-platform-object-cache-for-net-systems/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/SimpleObjectCache&#34;&gt;SimpleObjectCache&lt;/a&gt; is a very simple permanent, cross-platform, asynchronous key-value object cache for .NET. It comes with built-in &lt;a href=&#34;https://www.sqlite.org&#34;&gt;SQLite 3&lt;/a&gt; support. Alternative backends can be added by implementing the &lt;code&gt;IObjectCache&lt;/code&gt; or &lt;code&gt;IBulkObjectCache&lt;/code&gt; interfaces.&lt;/p&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;
&lt;p&gt;First, you need to set the &lt;code&gt;ApplicatioName&lt;/code&gt;. This is also going to be the folder where your cache will reside. Depending on the host OS the location of this folder might be different. On Windows it would be something like &lt;code&gt;C:\ProgramData\&amp;lt;ApplicationName&amp;gt;\SimpleObjectCache&lt;/code&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/SimpleObjectCache">SimpleObjectCache</a> is a very simple permanent, cross-platform, asynchronous key-value object cache for .NET. It comes with built-in <a href="https://www.sqlite.org">SQLite 3</a> support. Alternative backends can be added by implementing the <code>IObjectCache</code> or <code>IBulkObjectCache</code> interfaces.</p>
<h2 id="how-it-works">How it works</h2>
<p>First, you need to set the <code>ApplicatioName</code>. This is also going to be the folder where your cache will reside. Depending on the host OS the location of this folder might be different. On Windows it would be something like <code>C:\ProgramData\&lt;ApplicationName&gt;\SimpleObjectCache</code>.</p>
<p>Let’s instantiate SimpleObjectCache so we can use it:</p>
<script src="https://gist.github.com/nicolaiarocci/8ad25dc8a892adb6a7428a3e5177edcd.js"></script>

<p>Now we create a <code>Person</code>, then store it into our cache.</p>
<script src="https://gist.github.com/nicolaiarocci/a45090fde90ce0fb210a1c000c9bd9ae.js"></script>

<p>As we insert an object into the cache we can also set its expiration date:</p>
<script src="https://gist.github.com/nicolaiarocci/61e55e36e4e602a4ef025bf08df6617b.js"></script>

<p>Inserting an object with an already existing key, which we just did, will overwrite the previous object with the same key. Retrieving the object is a matter of providing its key:</p>
<script src="https://gist.github.com/nicolaiarocci/30a890e120b10f0d4258d0e5f34e40f8.js"></script>

<p>To remove the object from the cache we use the <code>Invalidate</code> method:</p>
<script src="https://gist.github.com/nicolaiarocci/303a88046f0ad546f22eed84f45d6099.js"></script>

<p>Bulk inserts are also possible:</p>
<script src="https://gist.github.com/nicolaiarocci/2654b88bc3f7fe818dfa8ac862599728.js"></script>

<p>Note that we just set the Tom and Mike expiration date to yesterday. Now let’s add John again. For him however, we set an expiration date which is bigger than Tom’s and Mike’s:</p>
<script src="https://gist.github.com/nicolaiarocci/abf9444dc7d87b175d6249506d5ef568.js"></script>

<p>The <code>Vacuum</code> method removes expired objects from the cache. So Tom and Mike, whose dates are passed, are going to be purged by the following command:</p>
<script src="https://gist.github.com/nicolaiarocci/729bf7604e06caacffbf761054829c74.js"></script>

<p>Now let’s get all the available <code>Person</code> objects from the cache.</p>
<script src="https://gist.github.com/nicolaiarocci/a69e45d088d6d104ebe20a480405d6ba.js"></script>

<p>Since Tom and Mike are gone, we only got one object back, and that’s our very own little John.</p>
<h2 id="installation">Installation</h2>
<p>SimpleObjectCache is on <a href="https://www.nuget.org/packages/SimpleObjectCache/">NuGet</a>. Run the following command on the Package Manager Console:</p>
<script src="https://gist.github.com/nicolaiarocci/758165b8800d9dba483b8a50373d964c.js"></script>

<p>Or install via the NuGet Package Manager in Visual Studio.</p>
<h2 id="wrapping-it-up">Wrapping it up</h2>
<p>We needed a simple cache that we could use as a component of our cross-platform storage system (more on that in a future post). We wanted the cache to also run seamlessly on the old .NET 4.0 framework. Unfortunately <a href="https://github.com/akavache/Akavache">Akavache</a>, to which this project is blatantly inspired, does not run on .NET4, so I decided to roll out my own simplified alternative. This project also offered a great occasion get my feet wet with bait-and-switch portable classes and a few other interesting challenges.</p>
<p>Currently supported platforms are iOS and Android (Xamarin) and .NET Framework versions 4.0 and .NET 4.5+.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>EveGenie makes Eve schema generation a breeze</title>
      <link>https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</link>
      <pubDate>Wed, 15 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/evegenie-makes-eve-schema-generation-breeze/</guid>
      <description>&lt;p&gt;Released by the nice folks at Drud, &lt;a href=&#34;https://github.com/drud/evegenie&#34;&gt;EveGenie&lt;/a&gt; is a tool for making &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; schema generation easier.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eve’s schema definitions are full of features, but can take a good amount of time to create when dealing with lots of complex resources. From our experience, it’s often helpful to describe an endpoint in JSON before creating it as an Eve schema. This allows you to make quick decisions about the structure of your entities without spending time moving schema code around. This is where EveGenie comes in.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Released by the nice folks at Drud, <a href="https://github.com/drud/evegenie">EveGenie</a> is a tool for making <a href="http://python-eve.org">Eve</a> schema generation easier.</p>
<blockquote>
<p>Eve’s schema definitions are full of features, but can take a good amount of time to create when dealing with lots of complex resources. From our experience, it’s often helpful to describe an endpoint in JSON before creating it as an Eve schema. This allows you to make quick decisions about the structure of your entities without spending time moving schema code around. This is where EveGenie comes in.</p></blockquote>
<p>EveGenie saves time by creating a ready to use Python Eve schema from a very simple JSON representation of a set of resources.</p>
<p>Interested? Good! Matt Tucker (<a href="https://twitter.com/ultimateboy">@ultimateboy</a>) has a <a href="http://www.drud.com/evegenie-python-eve-schema-generation-done-fast/">getting started with EveGenie</a> article up for you, so make sure to check it out.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve REST API Framework v0.6.4 now available</title>
      <link>https://nicolaiarocci.com/eve-0-6-4-just-released/</link>
      <pubDate>Wed, 08 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-6-4-just-released/</guid>
      <description>&lt;p&gt;Quick note to let you all know that &lt;a href=&#34;https://pypi.python.org/pypi/Eve/0.6.4&#34;&gt;Eve v0.6.4&lt;/a&gt; is out with a few significant &lt;a href=&#34;http://python-eve.org/changelog#version-0-6-4&#34;&gt;updates&lt;/a&gt;. Thanks to James Stewart for contributing to this release.&lt;/p&gt;
&lt;p&gt;Work on v0.7, which will include MongoDB Aggregation Framework support (&lt;a href=&#34;http://python-eve.org/features.html#mongodb-aggregation-framework&#34;&gt;docs&lt;/a&gt;) and many other &lt;a href=&#34;http://python-eve.org/changelog#version-0-7&#34;&gt;new features&lt;/a&gt;, continues steadily.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quick note to let you all know that <a href="https://pypi.python.org/pypi/Eve/0.6.4">Eve v0.6.4</a> is out with a few significant <a href="http://python-eve.org/changelog#version-0-6-4">updates</a>. Thanks to James Stewart for contributing to this release.</p>
<p>Work on v0.7, which will include MongoDB Aggregation Framework support (<a href="http://python-eve.org/features.html#mongodb-aggregation-framework">docs</a>) and many other <a href="http://python-eve.org/changelog#version-0-7">new features</a>, continues steadily.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Meet Eve-Swagger the swagger.io extension for your Eve powered REST API</title>
      <link>https://nicolaiarocci.com/announcing-eve-swagger/</link>
      <pubDate>Mon, 06 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/announcing-eve-swagger/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/eve-swagger&#34;&gt;Eve-Swagger&lt;/a&gt; is a swagger.io extension for &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; powered RESTful APIs. It has been around for a while on GitHub but I never managed to officially release it. So rejoice! it is now available on PyPI.&lt;/p&gt;
&lt;p&gt;But what is Swagger, and why is it useful to your RESTful API? With a Swagger-enabled API you can get interactive documentation, client SDK generation and discoverability, all for free. From &lt;a href=&#34;http://swagger.io&#34;&gt;Swagger website&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/eve-swagger">Eve-Swagger</a> is a swagger.io extension for <a href="http://python-eve.org">Eve</a> powered RESTful APIs. It has been around for a while on GitHub but I never managed to officially release it. So rejoice! it is now available on PyPI.</p>
<p>But what is Swagger, and why is it useful to your RESTful API? With a Swagger-enabled API you can get interactive documentation, client SDK generation and discoverability, all for free. From <a href="http://swagger.io">Swagger website</a>:</p>
<blockquote>
<p>Swagger is a simple yet powerful representation of your RESTful API. With the largest ecosystem of API tooling on the planet, thousands of developers are supporting Swagger in almost every modern programming language and deployment environment. With a Swagger-enabled API, you get interactive documentation, client SDK generation and discoverability.</p></blockquote>
<p>When Eve-Swagger is installed and properly configured your Eve API exposes
a special <code>/api-docs</code> endpoint which returns a 100% swagger-compliant JSON
response. This JSON can then be processed by the swagger tools like <a href="https://github.com/swagger-api/swagger-ui">Swagger
UI</a> and <a href="http://editor.swagger.io/#/">Swagger Editor</a>. Here we can appreciate Swagger UI providing API
documentation out of the box (click to zoom):</p>
<p><img alt="Swagger UI" loading="lazy" src="/images/Screen-Shot-2016-06-06-at-15.13.04.png"></p>
<p>Like most Eve extensions Eve-Swagger comes as a standard Flask Blueprint and, as such, using it is very simple:</p>
<script src="https://gist.github.com/nicolaiarocci/7720dd28f2e74e77c94edcb487aa5102.js"></script>

<p>Once the blueprint has been registered all you have to do is add a <code>SWAGGER_INFO</code> node to your settings. It maps to a swagger <a href="http://swagger.io/specification/#infoObject">infoObject</a> and contains some simple, human readable information. The extension will also scan your endpoint settings to figure out the API graph and document it. Of course, in order to not to clutter your launch script, you could (and probably should) set <code>SWAGGER_INFO</code> in your <a href="http://python-eve.org/config">configuration file</a>.</p>
<p>Installation is super easy:</p>
<script src="https://gist.github.com/nicolaiarocci/a7d2e3d8451f13907de6347448346c00.js"></script>

<p>This is just version 0.0.2 so many parts might still be moving, but you are encouraged to start using it right away. Also if you appreciate this extension please let me know by either starring it on GitHub or with a tweet or email, so I will know that I should really try hard and allocate more time to this project. As always, feel free to contribute via pull request!</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 1.0 is coming and it is going to be awesome</title>
      <link>https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</link>
      <pubDate>Wed, 01 Jun 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-1-0-coming-going-awesome/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-cerberus.org&#34;&gt;Cerberus&lt;/a&gt; is a lightweight and extensible data validation library for Python. Beta has been around since 2012. During this time Cerberus has been serving as the validation system for &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; core. It has been also adopted by a &lt;a href=&#34;https://github.com/search?q=from+cerberus+import+Validator&amp;amp;type=Code&amp;amp;utf8=%E2%9C%93&#34;&gt;quite a lot&lt;/a&gt; open source projects, averaging around 18K downloads per month on PyPI and collecting some remarkable &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus?slide=56&#34;&gt;endorsements&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All things considered, I would dare to claim that Cerberus is battle tested to death. This is, in fact, one reason why I believe that the time for a canonical and stable release has come. Another reason is that next release is a major one. It brings a ton of important &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0&#34;&gt;new features&lt;/a&gt; along with very significant code refactoring and a redesigned, powerful &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/api.html&#34;&gt;API&lt;/a&gt;. Third, next release &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#breaking-changes&#34;&gt;breaks&lt;/a&gt; backward compatibility, and we want to signal that in the version number.&lt;/p&gt;
&lt;p&gt;So next Cerberus release will be 1.0. If you have been following the development this will come as no surprise, as a Release Candidate has been out for a while. As a Cerberus user you will want to take the plunge and upgrade to 1.0 because well, it is just too cool to be true. If new to Cerberus you will also want to adopt 1.0 right away, for the same reason. If you are new however, make sure you get the &lt;a href=&#34;https://cerberus.readthedocs.io/en/latest/usage.html#cerberus-usage&#34;&gt;basics covered&lt;/a&gt; before reading further. By the way, at latest PyCon Italy I gave a talk on Cerberus which also included a preview of several 1.0 features. You can check the &lt;a href=&#34;https://speakerdeck.com/nicola/cerberus&#34;&gt;slides&lt;/a&gt; to get a general idea of the tool, its usage, and upcoming features.&lt;/p&gt;
&lt;p&gt;Let’s now look at some of the relevant features and changes introduced with Cerberus 1.0. For a (mostly) accurate list of changes and new features, have a look at the &lt;a href=&#34;http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0&#34;&gt;changelog&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-cerberus.org">Cerberus</a> is a lightweight and extensible data validation library for Python. Beta has been around since 2012. During this time Cerberus has been serving as the validation system for <a href="http://python-eve.org">Eve</a> core. It has been also adopted by a <a href="https://github.com/search?q=from+cerberus+import+Validator&amp;type=Code&amp;utf8=%E2%9C%93">quite a lot</a> open source projects, averaging around 18K downloads per month on PyPI and collecting some remarkable <a href="https://speakerdeck.com/nicola/cerberus?slide=56">endorsements</a>.</p>
<p>All things considered, I would dare to claim that Cerberus is battle tested to death. This is, in fact, one reason why I believe that the time for a canonical and stable release has come. Another reason is that next release is a major one. It brings a ton of important <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">new features</a> along with very significant code refactoring and a redesigned, powerful <a href="http://docs.python-cerberus.org/en/latest/api.html">API</a>. Third, next release <a href="http://docs.python-cerberus.org/en/latest/changelog.html#breaking-changes">breaks</a> backward compatibility, and we want to signal that in the version number.</p>
<p>So next Cerberus release will be 1.0. If you have been following the development this will come as no surprise, as a Release Candidate has been out for a while. As a Cerberus user you will want to take the plunge and upgrade to 1.0 because well, it is just too cool to be true. If new to Cerberus you will also want to adopt 1.0 right away, for the same reason. If you are new however, make sure you get the <a href="https://cerberus.readthedocs.io/en/latest/usage.html#cerberus-usage">basics covered</a> before reading further. By the way, at latest PyCon Italy I gave a talk on Cerberus which also included a preview of several 1.0 features. You can check the <a href="https://speakerdeck.com/nicola/cerberus">slides</a> to get a general idea of the tool, its usage, and upcoming features.</p>
<p>Let’s now look at some of the relevant features and changes introduced with Cerberus 1.0. For a (mostly) accurate list of changes and new features, have a look at the <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">changelog</a>.</p>
<h2 id="transformation-and-normalization">Transformation and normalization</h2>
<p>Big news in the normalization department. Similar to <code>validated()</code>, the new <code>normalized()</code> method returns a normalized copy of a document without validating it.</p>
<script src="https://gist.github.com/nicolaiarocci/d67e66bd0970225cfdd032952d9ed651.js"></script>

<h3 id="renaming-of-fields">Renaming of Fields</h3>
<p>You can now define a field to be renamed before any further processing.</p>
<script src="https://gist.github.com/nicolaiarocci/19346b40a34a3a99f512d3a9e97744b2.js"></script>

<p>To let a callable rename a field or arbitrary fields, you can define a handler for renaming. If the constraint is a string, it points to a custom method.</p>
<script src="https://gist.github.com/nicolaiarocci/2eddf9ae965e66f7b2ed7bb84453dd2e.js"></script>

<p>If the constraint is an iterable, the value is processed through that chain.</p>
<script src="https://gist.github.com/nicolaiarocci/0b9f72c1e6f480f90cb845adc26b28f5.js"></script>

<h3 id="purging-unknown-fields">Purging Unknown Fields</h3>
<p>After renaming, unknown fields will be purged if the <code>purge_unknown</code> property of a <code>Validator</code> instance is <code>True</code>.</p>
<script src="https://gist.github.com/nicolaiarocci/2bc43cfb27b4148a50a217ee6fae9671.js"></script>

<p>You can set the property per keyword-argument upon initialization or as rule for subdocuments like <code>allow_unknown</code>. The default is <code>False</code>.</p>
<h3 id="default-values">Default Values</h3>
<p>You can set default values for missing fields in the document by using the default rule.</p>
<script src="https://gist.github.com/nicolaiarocci/829129d3a30dcf29aadee2173139690d.js"></script>

<p>You can also define a default setter callable to set the default value dynamically. The callable gets called with the current (sub)document as the only argument. If the constraint is a string, it points to a custom method.</p>
<script src="https://gist.github.com/nicolaiarocci/a9731d22994c23312f9c2569d3c58e02.js"></script>

<h3 id="value-coercion">Value Coercion</h3>
<p>Coercion has been introduced with 0.9. It allows you to apply a callable to a value before the document is validated. The return value of the callable replaces the new value in the document. This can be used to convert values or sanitize data before it is validated.</p>
<script src="https://gist.github.com/nicolaiarocci/85ba0667defc1f54486ce45b851ca548.js"></script>

<p>If the constraint is an iterable, the value is processed through that chain.</p>
<script src="https://gist.github.com/nicolaiarocci/20fd9437713f77d4cc9365162b5675eb.js"></script>

<p>Please note that <code>coerce</code> kicks in with <code>validate()</code>, not with <code>normalized()</code>.</p>
<h2 id="schema-validation">Schema Validation</h2>
<p>This is another area the is seeing a lot of changes and new, powerful things.</p>
<h3 id="registries">Registries</h3>
<p>Schema registries are awesome if your schemas shall include references to themselves (recursion) and if they contain a lot of reused parts and are supposed to be serialized. There are two default registries in the cerberus module namespace. You can use <code>schema_registry</code> to store definitions for schemas which can later be re-used:</p>
<script src="https://gist.github.com/nicolaiarocci/d7bf19da6a6505bacf7a4be7ad0058d1.js"></script>

<p>And you can extend <code>rules_set_registry</code> with rules-sets which can then be referenced in validation schemas:</p>
<script src="https://gist.github.com/nicolaiarocci/c82f6a8e255cd408d02afca8d2be0012.js"></script>

<h3 id="schema-constraints-in-docstrings">Schema Constraints in docstrings</h3>
<p>Validation schemas themselves are validated when passed to the validator or a new set of rules is set for a document’s field. A <code>SchemaError</code> is raised when an invalid validation schema is encountered.</p>
<p>Now you can provide constraints as literal Python expression in the docstring of the rule’s implementing method to validate the arguments given in a schema for that rule. Either the docstring contains solely the literal or the literal is placed at the bottom of the docstring preceded by the following sentence: <code>The rule's arguments are validated against this schema</code>.</p>
<p>The example below is comes directly from Cerberus’ own test suite:</p>
<script src="https://gist.github.com/nicolaiarocci/71575bca60ba1993e5e59cdc3f3a9f1a.js"></script>

<h2 id="validation-rules">Validation Rules</h2>
<h3 id="forbidden"><code>forbidden</code></h3>
<p>Opposite to <code>allowed</code>, this new rule validates if a value is any but one of the defined values:</p>
<script src="https://gist.github.com/nicolaiarocci/b7ea2a0170c2e67e0b1c5d59cff80879.js"></script>

<h3 id="min-max"><code>min</code>, <code>max</code></h3>
<p>Up to 0.9 you could only use <code>min</code> and <code>max</code> to compare numeric types. Now they define minimum and maximum values allowed for any types that implement comparison operators.</p>
<script src="https://gist.github.com/nicolaiarocci/2e356654c5bd0f98f95473bf27ef2d2e.js"></script>

<h3 id="keyschema"><code>keyschema</code></h3>
<p>For better consistency, the <code>propertyschema</code> rule has been renamed to <code>keyschema</code>. This is the counterpart to <code>valueschema</code> and validates the <em>keys</em> of a <code>dict</code>.</p>
<script src="https://gist.github.com/nicolaiarocci/f553cf446a986058a836a08206076573.js"></script>

<h3 id="type"><code>type</code></h3>
<p>Data type validation now also supports the <code>binary</code> type.</p>
<h2 id="breaking-changes">Breaking Changes</h2>
<p>This is a major release which breaks backward compatibility in several ways. Don’t worry, these changes are for the better. However, if you are upgrading, then you should really take the time to read the list of changes in the <a href="http://docs.python-cerberus.org/en/latest/changelog.html#version-1-0">changelog</a> and consider their impact on your codebase, especially so if you have custom validators sitting around. For your convenience, there are also some <a href="http://docs.python-cerberus.org/en/latest/upgrading.html">upgrade notes</a> available.</p>
<h2 id="acknowledgements">Acknowledgements</h2>
<p>Cerberus 1.0 would not exist in its current form without the incredible work done by Frank “<a href="https://github.com/funkyfuture">funkyfuture</a>” Sachsenheim. After his initial, timid, set of v0.9 contributions, Frank went on a rage. He really adopted the project and went on touching on every aspect of it: documentation, new features, proposal, fixes, refactoring, ticket triaging, you-name-it. His efforts have been instrumental in taking the project to the next level. As a token of appreciation for his work, I’m tagging this release with the <code>funkyfuture</code> codename.</p>
<p>Of course he was not alone. Other contributors were Matthew Ellison, Dominik Kellner, Damián Nohales, calve, Roman Redkovich. And then are all the other people who helped by opening tickets and spreading the word around. Thank you all, folks.</p>
<h2 id="closing-notes">Closing notes</h2>
<p>Cerberus 1.0 is an important milestone. I consider the API to be reasonably stable and, once it is released, I plan to let it settle down for a while. Release Candidate will stay out for a couple more weeks, which is ideal for you to experiment a little bit before the final release.</p>
<p>If you are a Eve user you probably see the potential that new Cerberus can offer to your RESTful API, especially in the normalization department. Don’t get too excited though as I do not plan on immediately adding Cerberus 1.0 to Eve. Next Eve release (v0.7), which is also upcoming, will be focused on MongoDB Aggregation Framework and other things. That is more than enough for a major release. I am targeting the following release (v0.8) for Cerberus 1.0 support.</p>
<p>So, have fun with New Cerberus. As usual, please report any issue on the <a href="https://github.com/nicolaiarocci/cerberus/issues">ticket</a> system.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica per la PA v0.2.1</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</link>
      <pubDate>Mon, 23 May 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-per-la-pa-v0-2-1/</guid>
      <description>&lt;p&gt;Ho appena pubblicato su NuGet l’ultimo aggiornamento di &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/&#34;&gt;FatturaElettronicaPA&lt;/a&gt;, il package .NET per la compilazione e convalida delle fatture elettroniche per la Pubblica Amministrazione. Si tratta della &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/0.2.1&#34;&gt;versione 0.2.1&lt;/a&gt; che fa proprie le novità annunciate il 9 Maggio scorso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A partire dal 9 maggio 2016 sono introdotti nuovi controlli sui file trasmessi al Sistema di Interscambio. Per consentire il necessario adeguamento al nuovo regime di verifiche, fino al 31 luglio 2016 il mancato superamento di uno o più di questi nuovi controlli non comporterà lo scarto del file ma solo una segnalazione che verrà riportata all’interno della Ricevuta di consegna o della Notifica di mancata consegna. Dal 1 agosto 2016 i file che non dovessero superare uno o più di questi controlli verranno scartati.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ho appena pubblicato su NuGet l’ultimo aggiornamento di <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/">FatturaElettronicaPA</a>, il package .NET per la compilazione e convalida delle fatture elettroniche per la Pubblica Amministrazione. Si tratta della <a href="https://www.nuget.org/packages/FatturaElettronicaPA/0.2.1">versione 0.2.1</a> che fa proprie le novità annunciate il 9 Maggio scorso:</p>
<blockquote>
<p>A partire dal 9 maggio 2016 sono introdotti nuovi controlli sui file trasmessi al Sistema di Interscambio. Per consentire il necessario adeguamento al nuovo regime di verifiche, fino al 31 luglio 2016 il mancato superamento di uno o più di questi nuovi controlli non comporterà lo scarto del file ma solo una segnalazione che verrà riportata all’interno della Ricevuta di consegna o della Notifica di mancata consegna. Dal 1 agosto 2016 i file che non dovessero superare uno o più di questi controlli verranno scartati.</p></blockquote>
<p>Se per ora i nuovi controlli non sono vincolanti, lo saranno a partire dal 1 agosto. Poiché si tratta di una serie di convalide sui conteggi consiglio di passare alla versione 0.2.1 al più presto, così da verificare che in effetti le vostre fatture elettroniche siano in linea con le aspettative della PA: potreste avere qualche sorpresa.</p>
<p>Nel nostro caso, per esempio, abbiamo dovuto prendere atto che gli importi imponibili relativi alle aliquote IVA, così come le corrispondenti imposte, devono essere indicati al lordo degli eventuali sconti generali del documento, pena il rifiuto dello stesso da parte del sistema di interscambio. Date una occhiata al <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/blob/master/CHANGES">changelog</a> per l’elenco completo delle novità.</p>
<p>Voglio aggiungere un commento sulle modalità di pubblicazione degli aggiornamenti tecnici da parte di Agenzia Entrate/Sogei. Sebbene siano dotati di data e numero di versione, questi sono da considerarsi, ad essere buoni, puramente indicativi. Per esempio l’attuale <a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/Elenco_Controlli_V1.2.pdf">versione 1.2</a> dell’elenco controlli è stata aggiornata “silenziosamente” un paio di giorni dopo la pubblicazione (hanno aggiunto una tolleranza di 1 Euro al controllo 00422). Così lo sviluppatore incauto che si limiti a controllare la data e il numero di versione del documento rischia di vedersi respingere fatture per lui del tutto corrette, a meno che non di prenda la briga di verificare, riga per riga, la corrispondenza tra la documentazione in suo possesso e quella disponibile sul sito in quel momento. Chiaramente in PA non hanno idea di cosa sia il <a href="http://semver.org/">Semantic Versioning</a>.</p>
<p>Un ringraziamento al mio collega Stefano Gardini. Il suo nome non compare nelle commit ma, quando si stratta di fatturazione e contabilità, è come se ci fosse.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My Crazy Speaking Month</title>
      <link>https://nicolaiarocci.com/crazy-speaking-month/</link>
      <pubDate>Mon, 09 May 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/crazy-speaking-month/</guid>
      <description>&lt;p&gt;April was definitely my crazy Speaking Month. After an almost one year long self-imposed conference hiatus, I was challenged to deliver four different talks, attend two discussion panels, give one live demo and release one interview. All in a three weeks period span. First I went to &lt;a href=&#34;http://www.pycon.it&#34;&gt;PyCon Sette&lt;/a&gt; in Florence. A few days later a plane took me to St. Petersburg, Russia, for &lt;a href=&#34;http://www.it-sobytie.ru/en/events/5862&#34;&gt;PiterPy&lt;/a&gt;. Finally, the next weekend I was in Rome for the &lt;a href=&#34;https://mvp.microsoft.com&#34;&gt;Western Europe Microsoft MVP Community Day&lt;/a&gt;. In the meantime several Channel 9 TecHeroes episodes were due for release. This was of course super exciting. And challenging.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>April was definitely my crazy Speaking Month. After an almost one year long self-imposed conference hiatus, I was challenged to deliver four different talks, attend two discussion panels, give one live demo and release one interview. All in a three weeks period span. First I went to <a href="http://www.pycon.it">PyCon Sette</a> in Florence. A few days later a plane took me to St. Petersburg, Russia, for <a href="http://www.it-sobytie.ru/en/events/5862">PiterPy</a>. Finally, the next weekend I was in Rome for the <a href="https://mvp.microsoft.com">Western Europe Microsoft MVP Community Day</a>. In the meantime several Channel 9 TecHeroes episodes were due for release. This was of course super exciting. And challenging.</p>
<p>This post is not much (or only) about my talks or performance, but hopefully more around the different communities I got a chance to interact with.</p>
<h2 id="pycon-sette-florence">PyCon Sette, Florence</h2>
<p>PyCon Italy is like home to me. Here, back in 2012, I gave my first Python talk which also happened to be my first English talk ever. Back then Italy was hosting EuroPython 2012, the general assembly of the European Python community, so we had people flying in from all over the continent (and beyond). And I was there all alone, a .NET guy who knew no one, pretending to teach pythonistas how to <a href="https://speakerdeck.com/nicola/developing-restful-web-apis-with-python-flask-and-mongodb">properly build a REST API powered by MongoDB and Flask</a>. Talk about putting myself out of my comfort zone. That talk was important for many reasons, I won’t go into them, suffice to say that, without it, the <a href="http://python-eve.org">Eve</a> project would not exist now.</p>
<p>The following years I went back with more talks. After the three booming EuroPython years we saw the number of PyCon attendees drop from the 700s to the about 150 at PyCon Cinque. Following that first post-EuroPython event however the numbers started to raise. Fast. So fast, in fact, that this year we ended up celebrating the all-time high of 575 attendees. An impressive result, as it almost tops EuroPython numbers. We owe a lot to the skill, expertise and braveness of the PyCon Italy organizers. They are simply awesome, and tireless. Such a result, however, also a is a testimony of how strong, vibrant and resilient the Italian community around Python is.</p>
<p>This year I was there to give my first <a href="https://speakerdeck.com/nicola/cerberus">Cerberus talk</a>. The room was packed full, everything went smoothly (at least from my perspective) and when all was done and said I was left with the impression that the project was well received. My only regret is that I totally forgot to submit the talk for the English track. I also took part in the Python Web Framework Royal Rumble, a panel in which Django, Flask, Pyramid and TurboGear champions were to fight each other. I was <a href="https://speakerdeck.com/nicola/flask-web-development-one-drop-at-a-time">defending the Flask flag</a>, and it was a lot of fun.</p>
<p>The Italian Python community is cozy and friendly as always, stronger than ever. PyCon in Florence keeps improving its already high standard. My only suggestion would be to reverse the English/Italian tracks ratio. I would go for an all-English conference with just one track for Italian language. I am sure a lot of guests would flock in from nearby countries. I mean who would not want to visit Florence, and Tuscany Plus, many pythonistas already have very fond memories from the Italian EuroPython years and I am sure they would love to come back.</p>
<h2 id="piterpy-st-petersburg">PiterPy, St. Petersburg</h2>
<p>PiterPy is an important and very well organized Python event which gathers attendees not only from St. Petersburg, but also from other Russian cities and nearby countries.</p>
<p>I was invited by the conference organizers to talk about project Eve. I was honoured, excited and curious to meet fellow pythonistas from the Eastern Europe. Other headliners were Chris Ewing, Gael Varoquaux, Hynek Schlawack, Simone Soldateschi and Fabio Natali. As you can tell, we all have different backgrounds and specialize on different things, as it should be when you want to present your audience with different interesting aspects of your stack of choice.</p>
<p>I did my <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">Eve talk</a> and then even managed to sneak in lightening talk on Cerberus. I was also interviewed by Vladimir Filonov (I think the recording is due out soon) and to my surprise the interview was not on my open source activity but rather on the Italian Python community. It turns out that in Russia they care a lot about the community, and they are eager to know more about other Python communities scattered all around Europe. Freaking awesome, if you ask me.</p>
<p>Organizers were professional and friendly all the time, letting me feel comfortable right from the start. In fact I was just off the plane when I met with Maxim Klymyshyn, who took me from the Airport to the conference location. The venue itself (Original Sokos Olympia Garden, conveniently located close to St. Petersburg’s city center) was probably one of the best, if not the best, conference venue I ever been at. And what about the attendees? They were very welcoming with their international guests and language barrier was not an issue as many of them speak very good English (often better than mine). Be warned however, when given the opportunity they will not hesitate to challenge the unwary speaker with the hardest of questions. I am told (by the attendees themselves) that this is in fact a trait of the Russian people. They won’t be shy when they have something to say. As a speaker, I really appreciated the attitude!</p>
<p>The day after the conference a cultural trip to <a href="https://en.wikipedia.org/wiki/Catherine_Palace">Catherine Palace</a> in Pushkin was planned for both speakers and attendees. That was terrific. Should you go to St. Petersburg, on a business trip or just as a tourist, make sure you visit Catherine Palace. You won’t regret it.</p>
<p>My eternal gratitude goes to Vladimir Shulyak and Dmitry Nazarov for taking me and my new buddy Chris Ewing out for diner and then on a super nice walk around the city center. Special thanks to Serge Matveenko, Diana Lyubavskaya and the rest of the team for inviting us and, most importantly, for putting up such a great event. I am sure PiterPy will soon become a relevant event within the international community.</p>
<h2 id="western-europe-mvp-community-day-rome">Western Europe MVP Community Day, Rome</h2>
<p>This was my first time as a MVP to a Microsoft event. Not only that. This was actually a MVP-only event and I was there to give a talk to experienced MVPs who, for the most part, have been in the program for years. Kind of intimidating, although I was reassured by the fact that my proposal had been voted by the MVP community itself.</p>
<p>Like at my first Python conference years ago I knew no one there, not personally at least, so it took some balls win my shyness and introduce myself to the first person I recognized, that one being <a href="https://mvp.microsoft.com/it-it/PublicProfile/4020723?fullName=Alessandro%20%20Del%20Sole">Alessandro Del Sole</a>, a long time MVP veteran. He and his pals were super nice and only moments after introducing myself to them I was already feeling part of the community. A very empowering feeling. Later during the evening and even more so the following day, at the conference, I got to meet and know a lot of new friends, all very knowledgeable in their craft, which is awesome.</p>
<p>I would say that the focus of the event was about Microsoft’s new openness toward other stacks and communities, which also helped in making me feel comfortable. I gave my <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">Real Life .NET Cross Platform</a> talk, with good feedback. SimpleCache, which was used as an example project and wasn’t really the main topic, got a lot of interest so I may actually release it on NuGet soon (blog post coming). My highlight for the event though, would be Karen Juhl keynote during which I suddenly realized that a picture of me, along with quotes from <a href="nicolaiarocci.com/look-mum-im-an-mvp/">one of my articles</a>, was being shown on stage. It took me a few seconds to realize what was going on, as it was totally unexpected. That was crazy, and mesmerizing. Later, when I got to talk with Karen, I learned that that very same slide has been used at several MVP events across Europe. So exciting!</p>
<p>The conference was closed by an Open Source Communities Panel, to which I was invited as a member of multiple communities.</p>
<p>The next day I was at the OpenDomus.net event, where I got a chance to repeat my cross platform talk (this time in Italian), and then to give a live demo of Ubuntu Bash on Windows. That one was interesting, and surprising I think, for many attendees. A few days later, with <a href="https://twitter.com/_geniodelmale?lang=it">Lorenzo Barbieri</a>, we recorded a Best of Build 2016 episode on the same topic (link below).</p>
<h2 id="techeroes-interlude">TecHeroes Interlude</h2>
<p>April and March were also the months in which I and Lorenzo Barbieri recorded and released a few MSDN TecHeroes Italy episodes:</p>
<ul>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-VSVim-Editor">Vim for Visual Studio</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Python-tools-per-Visual-Studio">Python Tools for Visual Studio</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids">CoderDojo Coding Clubs for Kids</a></li>
<li><a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform">Real Life .NET Cross Platform</a></li>
<li><a href="https://channel9.msdn.com/Shows/Best-of-Build--Italy/Bash-su-Ubuntu-su-Windows">Bash on Ubuntu on Windows</a> (actually a Best of Build episode)</li>
</ul>
<h2 id="wrapping-it-up">Wrapping it up</h2>
<p>As I mentioned at the OSS panel I am lucky to have an active role in more than one community and to work every day with diverse technologies. Now, most of the times the problems tackled by these stacks are, in fact, the same. Besides the obvious differences in semantics, what really changes and is most interesting to me is the approach, the path if you will, taken by each individual stack. For me, being exposed to multiple approaches and therefore getting a chance to appreciate the differences, the pros and cons of each one (which tend to vary depending on the situation at hand) has been invaluable. I could (and probably should) fill a blog post with the things I learned working on Python that I am now using, with profit, in C#. And vice-versa.</p>
<p>And what about the communities? Different communities, again, expose me to different cultures. That is a good thing. Being rooted into a community is great but being active in multiple communities is even better, in essence for the same reasons you’d want to become a polyglot programmer.</p>
<p>So my invite is to get involved once again, no matter how active and fit you are into a stack and its community. Try something totally new, even if it doesn’t really sound like something immediately useful to you. Because you know, cross-pollination is a good thing. And you get to party twice the time, too.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve REST API Framework v0.6.2 is out</title>
      <link>https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</link>
      <pubDate>Mon, 14 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-rest-api-framework-v0-6-2-is-out/</guid>
      <description>&lt;p&gt;Today I released &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; 0.6.2. It includes many fixes and improvements over the previous releases. Areas addressed are CORS management, soft deletes, token authentication, oplog, data validation, and others. Please see the &lt;a href=&#34;http://python-eve.org/changelog&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;Work on v0.7 is also ongoing. It will include new features such as support for the MongoDB Aggregation Framework (&lt;a href=&#34;http://python-eve.org/features.html#mongodb-aggregation-framework&#34;&gt;docs&lt;/a&gt;) and a few breaking changes, so you might want to check it out in advance.&lt;/p&gt;
&lt;p&gt;Special thanks to Arnau Orriols, Cyril Bonnard, Hamdy, Luca Di Gaspero, Manquer, Nick Park, Patrick Decat, Prayag Verma, Ralph Smith, Stratos Gerakakis, Valerie Coffman and Wei Guan who contributed to this release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Today I released <a href="http://python-eve.org">Eve</a> 0.6.2. It includes many fixes and improvements over the previous releases. Areas addressed are CORS management, soft deletes, token authentication, oplog, data validation, and others. Please see the <a href="http://python-eve.org/changelog">changelog</a> for details.</p>
<p>Work on v0.7 is also ongoing. It will include new features such as support for the MongoDB Aggregation Framework (<a href="http://python-eve.org/features.html#mongodb-aggregation-framework">docs</a>) and a few breaking changes, so you might want to check it out in advance.</p>
<p>Special thanks to Arnau Orriols, Cyril Bonnard, Hamdy, Luca Di Gaspero, Manquer, Nick Park, Patrick Decat, Prayag Verma, Ralph Smith, Stratos Gerakakis, Valerie Coffman and Wei Guan who contributed to this release.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Real Life .NET Cross Platform</title>
      <link>https://nicolaiarocci.com/real-life-net-cross-platform/</link>
      <pubDate>Fri, 11 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/real-life-net-cross-platform/</guid>
      <description>&lt;p&gt;There is a new episode up at Channel9 TecHeroes. It is called &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform&#34;&gt;Real Life .NET Cross Platform&lt;/a&gt; and it is about developing production-ready, cross-platform applications with today’s .NET. In the interview we talk about &lt;a href=&#34;https://github.com/CIR2000/Amica.vNext.SimpleCache&#34;&gt;SimpleCache&lt;/a&gt;, an asynchronous, permanent and cross-platform key-value object cache powered by SQLite3. The project is still a work in progress so there is no NuGet package available yet, but it is quite usable already. The &lt;a href=&#34;https://speakerdeck.com/nicola/real-life-net-cross-platform&#34;&gt;talk slides&lt;/a&gt; are also available.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>There is a new episode up at Channel9 TecHeroes. It is called <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-Real-Life-Net-Cross-Platform">Real Life .NET Cross Platform</a> and it is about developing production-ready, cross-platform applications with today’s .NET. In the interview we talk about <a href="https://github.com/CIR2000/Amica.vNext.SimpleCache">SimpleCache</a>, an asynchronous, permanent and cross-platform key-value object cache powered by SQLite3. The project is still a work in progress so there is no NuGet package available yet, but it is quite usable already. The <a href="https://speakerdeck.com/nicola/real-life-net-cross-platform">talk slides</a> are also available.</p>
]]></content:encoded>
    </item>
    <item>
      <title>CoderDojo interview at Channel 9</title>
      <link>https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</link>
      <pubDate>Fri, 04 Mar 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/my-coderdojo-interview-at-chennel-9-techeroes/</guid>
      <description>&lt;p&gt;I was recently interviewed at Channel 9 TecHeroes. Topic was CoderDojo, the network of free computer programming clubs for young people. The show is run by Microsoft Italy, so the interview is in Italian. &lt;a href=&#34;https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids&#34;&gt;Enjoy the show&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was recently interviewed at Channel 9 TecHeroes. Topic was CoderDojo, the network of free computer programming clubs for young people. The show is run by Microsoft Italy, so the interview is in Italian. <a href="https://channel9.msdn.com/Shows/TecHeroes/TecHeroes-CoderDojo-Coding-Club-for-Kids">Enjoy the show</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Look mum, I’m a MVP</title>
      <link>https://nicolaiarocci.com/look-mum-im-an-mvp/</link>
      <pubDate>Sat, 02 Jan 2016 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/look-mum-im-an-mvp/</guid>
      <description>&lt;p&gt;A few hours ago I was notified that I have been awarded with the Microsoft MVP Award for Development Technologies.&lt;/p&gt;
&lt;p&gt;This came totally unexpected. Especially so considering that during the last few years I have been splitting my time between Microsoft and other open source technologies. My public work has mostly been on Python and MongoDB. Yes I also released .NET open source projects in the meantime (more are coming soon) and yes, I wrote a few articles here and on the MSDN Blog, attended Microsoft events and did interviews. But really, I did not expect these activities to have an impact. This is probably why only a couple minutes from learning about the award I was suffering Impostor Syndrome symptoms.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few hours ago I was notified that I have been awarded with the Microsoft MVP Award for Development Technologies.</p>
<p>This came totally unexpected. Especially so considering that during the last few years I have been splitting my time between Microsoft and other open source technologies. My public work has mostly been on Python and MongoDB. Yes I also released .NET open source projects in the meantime (more are coming soon) and yes, I wrote a few articles here and on the MSDN Blog, attended Microsoft events and did interviews. But really, I did not expect these activities to have an impact. This is probably why only a couple minutes from learning about the award I was suffering Impostor Syndrome symptoms.</p>
<p>Now however, as I ponder on the whole issue a little bit, I start to realise how this could probably make (at least some sort of) sense. New Microsoft has been eager to catalyse attention and interest from the open source community and, in a broader sense, from people not yet accustomed to the brand. In light of this, people who have been active in communities other than Microsoft’s and have also been exposed to different technologies, mindsets and approaches to common IT problems could indeed offer some value. Or at least that’s how I am reading it right now.</p>
<p>So a new chapter is unfolding in my twenty-five years long love/hate relationship with Microsoft. It is my intent to live up to this award, for which I am very grateful.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.6.1 has been released</title>
      <link>https://nicolaiarocci.com/eve-0-6-1-has-been-released/</link>
      <pubDate>Thu, 29 Oct 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-6-1-has-been-released/</guid>
      <description>&lt;p&gt;A new version of &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt;, the REST API framework for Humans, has been released today. Following the 0.6 milestone released one month ago, v0.6.1 introduces some fixes and few new important features. Upgrade is strongly encouraged. As always, a &lt;a href=&#34;http://python-eve.org/changelog#version-0-6-1&#34;&gt;changelog&lt;/a&gt; with full list of updates is available.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A new version of <a href="http://python-eve.org">Eve</a>, the REST API framework for Humans, has been released today. Following the 0.6 milestone released one month ago, v0.6.1 introduces some fixes and few new important features. Upgrade is strongly encouraged. As always, a <a href="http://python-eve.org/changelog#version-0-6-1">changelog</a> with full list of updates is available.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Custom endpoint handlers with Eve</title>
      <link>https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</link>
      <pubDate>Mon, 24 Aug 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/building-custom-endpoint-handlers-with-eve/</guid>
      <description>&lt;p&gt;On &lt;a href=&#34;https://stackoverflow.com/questions/24134383/servicing-html-requests-with-eve/&#34;&gt;Stack Overflow&lt;/a&gt; and the Eve &lt;a href=&#34;https://groups.google.com/forum/?hl=en#!topic/python-eve/LM9kZkgq3vA&#34;&gt;mailing list&lt;/a&gt;, but also in my mailbox and even on Twitter, I get a lot of enquiries on how to build custom endpoints within a Eve-powered RESTful application. Now, since within Eve all endpoints are fully customizable, what they really mean is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How do I setup endpoints without any binding to a data entity, just connected to a custom method?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;They would like to call something like &lt;code&gt;/mycustomendpoint&lt;/code&gt; and get the response from a method they have defined somewhere in the Python sources. The standard endpoint-entity mapping provided by Eve covers 90% of their needs, but sometimes they just need endpoints that have nothing to do with data entities.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>On <a href="https://stackoverflow.com/questions/24134383/servicing-html-requests-with-eve/">Stack Overflow</a> and the Eve <a href="https://groups.google.com/forum/?hl=en#!topic/python-eve/LM9kZkgq3vA">mailing list</a>, but also in my mailbox and even on Twitter, I get a lot of enquiries on how to build custom endpoints within a Eve-powered RESTful application. Now, since within Eve all endpoints are fully customizable, what they really mean is:</p>
<blockquote>
<p>How do I setup endpoints without any binding to a data entity, just connected to a custom method?</p></blockquote>
<p>They would like to call something like <code>/mycustomendpoint</code> and get the response from a method they have defined somewhere in the Python sources. The standard endpoint-entity mapping provided by Eve covers 90% of their needs, but sometimes they just need endpoints that have nothing to do with data entities.</p>
<p>This is very easy to achieve. I’m writing it down so I can point people to this post in the future.</p>
<h2 id="eve-_is_-flask">Eve <em>is</em> Flask</h2>
<p><a href="http://python-eve.org">Eve</a> is a Flask application and I really mean it since it is, in fact, a Flask subclass. Eve adds out-of-the-box <a href="http://python-eve.org/features">RESTful capabilities</a> to the Flask micro-framework. Most of the time you will be happy with just Eve’s own features but remember, the full <a href="http://flask.pocoo.org">Flask</a> (and <a href="http://werkzeug.pocoo.org">Werkzeug</a> at a lower level) features set is also part of your arsenal.</p>
<blockquote>
<p>Whatever you can do with Flask, you can do with Eve</p></blockquote>
<p>So yes, of course you can easily set some functions to be invoked when a custom endpoint is hit with a request. The following snippet is a slightly modified version of Flask’s very own <a href="http://flask.pocoo.org/docs/0.10/quickstart/#a-minimal-application">Quickstart</a> tutorial:</p>
<script src="https://gist.github.com/nicolaiarocci/01ea2cd1068afc99f9e38f0bb9afcabf.js"></script>

<p>By decorating the <code>hello_world</code> method with the <code>route</code> decorator we added a new endpoint to the application. Each time a request to <code>/hello</code> comes in, it will be routed to our custom method. Of course the regular API endpoints (either defined in <code>settings.py</code>, passed as a dict at launch, or registered live by calling the <code>register_resource</code> method) will also be available.</p>
<p>If you have an <a href="http://python-eve.org/authentication.html">Eve authentication class</a> securing regular API endpoints, you can apply it to your custom endpoint too. Just add a <code>requires_auth</code> decorator:</p>
<script src="https://gist.github.com/nicolaiarocci/3fc0379e083266f20faf12b209108aa9.js"></script>

<p>Say that you saved the above snippet as <em>run.py</em> and also have your RESTful endpoints properly <a href="http://python-eve.org/config">configured</a>. Launch the script:</p>
<script src="https://gist.github.com/nicolaiarocci/697f85ee10b7e0c0b601fdd21b171a15.js"></script>

<p>You can now point your browser to <code>http://localhost:5000/hello/</code> and enjoy the application greeting. Or you can consume any other configured API endpoint.</p>
<p>As all of Flask features are at your fingertips you might as well opt for registering a <a href="http://flask.pocoo.org/docs/0.10/blueprints/">blueprint</a>, which is what the awesome <a href="https://github.com/charlesflynn/eve-docs">Eve-Docs</a> extension is doing in order to provide a static HTML <code>/docs</code> endpoint on top of any Eve powered API.</p>
]]></content:encoded>
    </item>
    <item>
      <title>FatturaElettronicaPA for .NET has been updated</title>
      <link>https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</link>
      <pubDate>Tue, 14 Jul 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fatturaelettronicapa-for-net-has-been-updated/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA&#34;&gt;FatturaElettronicaPA&lt;/a&gt; has just been updated to v0.1.4. With this release invoice bodies (&lt;code&gt;FatturaElettronicaBody&lt;/code&gt; items) are also validated. As always, you can install the package directly from &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/&#34;&gt;NuGet&lt;/a&gt;. See the &lt;a href=&#34;http://nicolaiarocci.com/fattura-elettronica-open-source/&#34;&gt;original post&lt;/a&gt; for more info. Also don’t forget to check the &lt;a href=&#34;https://github.com/FatturaElettronicaPA&#34;&gt;related projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: v0.1.6 has also been released.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA">FatturaElettronicaPA</a> has just been updated to v0.1.4. With this release invoice bodies (<code>FatturaElettronicaBody</code> items) are also validated. As always, you can install the package directly from <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. See the <a href="http://nicolaiarocci.com/fattura-elettronica-open-source/">original post</a> for more info. Also don’t forget to check the <a href="https://github.com/FatturaElettronicaPA">related projects</a>.</p>
<p>Update: v0.1.6 has also been released.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.9 has been released</title>
      <link>https://nicolaiarocci.com/cerberus-0-9-has-been-released/</link>
      <pubDate>Tue, 30 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-9-has-been-released/</guid>
      <description>&lt;p&gt;A few days ago &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus 0.9&lt;/a&gt; was released. It includes a bunch of new cool features, let’s browse through some of them.&lt;/p&gt;
&lt;h2 id=&#34;collection-rules&#34;&gt;Collection rules&lt;/h2&gt;
&lt;p&gt;First up is the new set of &lt;code&gt;anyof&lt;/code&gt;, &lt;code&gt;allof&lt;/code&gt;, &lt;code&gt;noneof&lt;/code&gt; and &lt;code&gt;oneof&lt;/code&gt; validation rules. &lt;code&gt;anyof&lt;/code&gt; allows you to list multiple sets of rules to validate against. The field will be considered valid if it validates against one set in the list. For example, to verify that a property is a number between 0 and 10 or 100 and 110, you could do the following:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few days ago <a href="https://github.com/nicolaiarocci/cerberus">Cerberus 0.9</a> was released. It includes a bunch of new cool features, let’s browse through some of them.</p>
<h2 id="collection-rules">Collection rules</h2>
<p>First up is the new set of <code>anyof</code>, <code>allof</code>, <code>noneof</code> and <code>oneof</code> validation rules. <code>anyof</code> allows you to list multiple sets of rules to validate against. The field will be considered valid if it validates against one set in the list. For example, to verify that a property is a number between 0 and 10 or 100 and 110, you could do the following:</p>
<pre><code>&gt;&gt;&gt; schema = {
...     'prop1': {
...         'type': 'number',
...         'anyof': [
...             {'min': 0, 'max': 10}, 
...             {'min': 100, 'max': 110}
...         
...         ]
...     }
... }

&gt;&gt;&gt; doc = {'prop1': 5}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; doc = {'prop1': 105}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; doc = {'prop1': 55}
&gt;&gt;&gt; v.validate(document, schema)
False
</code></pre>
<p><code>allof</code> is the same as <code>anyof</code>, except that all rule collections in the list must validate. Same pattern applies to <code>noneof</code> (no rule in collection must validate) and <code>oneof</code> (only one rule in collection must validate).</p>
<h2 id="type-coercion">Type coercion</h2>
<p>Type coercion allows you to apply a callable to a value before any other validators run. The return value of the callable replaces the new value in the document. This can be used to convert values or sanitize data before it is validated.</p>
<pre><code>&gt;&gt;&gt; v = Validator({'amount': {'type': 'integer'}})
&gt;&gt;&gt; v.validate({'amount': '1'})
False

&gt;&gt;&gt; v = Validator({
...     'amount': {
...         'type': 'integer', 
...         'coerce': int
...     }
... })
&gt;&gt;&gt; v.validate({'amount': '1'})
True
&gt;&gt;&gt; v.document
{'amount': 1}

&gt;&gt;&gt; to_bool = lambda v: v.lower() in ['true', '1']
&gt;&gt;&gt; v = Validator({
...     'flag': {
...         'type': 'boolean', 
...         'coerce': to_bool
...     }
... })
&gt;&gt;&gt; v.validate({'flag': 'true'})
True

&gt;&gt;&gt; v.document
{'flag': True}
</code></pre>
<h2 id="properties-keys-validation">Properties (keys) validation</h2>
<p><code>propertyschema</code> is the counterpart to <code>valueschema</code> (also new, it replaces the now deprecated <code>keyschema</code>) and validates the keys of a dictionary.</p>
<pre><code>&gt;&gt;&gt; schema = 'a_dict': {
...     'type': 'dict', 
...     'propertyschema': {
...         'type': 'string', 
...         'regex': '[a-z]+'
...     }
... }

&gt;&gt;&gt; document = {'a_dict': {'key': 'value'}}
&gt;&gt;&gt; v.validate(document, schema)
True

&gt;&gt;&gt; document = {'a_dict': {'KEY': 'value'}}
&gt;&gt;&gt; v.validate(document, schema)
False
</code></pre>
<h2 id="list-of-types">List of types</h2>
<p>The <code>type</code> rule can now be a list of types, to allow for different type of values for the field.</p>
<pre><code>&gt;&gt;&gt; v = Validator({
...     'quotes': {
...         'type': ['string', 'list']
...     }
... })

&gt;&gt;&gt; v.validate({'quotes': 'Hello world!'})
True

&gt;&gt;&gt; v.validate({'quotes': ['Do not disturb my circles!', 
...                        'Heureka!']})
True

&gt;&gt;&gt; v = Validator({
...     'quotes': {
...         'type': ['string', 'list'], 
...         'schema': {'type': 'string'}
...     }
... })

&gt;&gt;&gt; v.validate({'quotes': 'Hello world!'})
True 

&gt;&gt;&gt; v.validate({'quotes': [1, 'Heureka!']})
False

&gt;&gt;&gt; v.errors
{'quotes': {0: 'must be of string type'}}
</code></pre>
<p>And there is more so make sure you check the <a href="https://cerberus.readthedocs.org/en/latest/#changelog">changelog</a> before upgrading. No breaking changes but there’s at least one deprecation, as mentioned.</p>
<p>Fun fact: Cerberus is currently getting 3x the downloads of his sister project <a href="https://github.com/nicolaiarocci/eve">Eve</a>, the REST API Framework for which the tool was originally conceived. Interesting if you consider that Eve is featuring 10x the GitHub stars. Fun, but not really surprising since Cerberus probably has a broader audience.</p>
<p>Special thanks to Frank Sachsenheim, Tobias Betz, Brett and C.D. Clark III for their valuable contributions to this release.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Monolith vs Microservices</title>
      <link>https://nicolaiarocci.com/monolith-vs-microservices/</link>
      <pubDate>Thu, 04 Jun 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/monolith-vs-microservices/</guid>
      <description>&lt;p&gt;I spent the last couple days in Paris with a bunch of smart architects and developers who are about to deal with a complex Monolithic-to-Microservices architecture transition.&lt;/p&gt;
&lt;p&gt;On my flight back to Italy I jotted down a few thoughts on the topic and then, this morning, the first thing that comes up on my newsfeed is &lt;a href=&#34;http://martinfowler.com/bliki/MonolithFirst.html&#34;&gt;Monolith First&lt;/a&gt; by Martin Fowler. Stunning, because the essay content totally resonates with my own notes, so much that it would perfectly serve as a recap for them.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I spent the last couple days in Paris with a bunch of smart architects and developers who are about to deal with a complex Monolithic-to-Microservices architecture transition.</p>
<p>On my flight back to Italy I jotted down a few thoughts on the topic and then, this morning, the first thing that comes up on my newsfeed is <a href="http://martinfowler.com/bliki/MonolithFirst.html">Monolith First</a> by Martin Fowler. Stunning, because the essay content totally resonates with my own notes, so much that it would perfectly serve as a recap for them.</p>
<blockquote>
<p>Going directly to a microservices architecture is risky, so consider building a monolithic system first. Split to microservices when, and if, you need it.</p></blockquote>
<p>And also, perhaps more importantly:</p>
<blockquote>
<p>A more common approach is to start with a monolith and gradually peel off microservices at the edges. Such an approach can leave a substantial monolith at the heart of the microservices architecture, but with most new development occurring in the microservices while the monolith is relatively quiescent.</p></blockquote>
<p>I find it fascinating that there is a chance that my notes and the essay were written (by astral coincidence?) in the very same minutes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Composition vs. Inheritance: How to Choose?</title>
      <link>https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</link>
      <pubDate>Tue, 26 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/composition-vs-inheritance-how-to-choose/</guid>
      <description>&lt;p&gt;Steven Lowe piece on &lt;a href=&#34;http://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose&#34;&gt;Composition vs. Inheritance&lt;/a&gt; is a must read. Just to wet your appetite, let me quote the opening paragraph:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In the beginning, there was no inheritance and no composition, only code. And the code was unwieldy, repetitive, blocky, unhappy, verbose, and tired. Copy and Paste were the primary mechanisms of code reuse. Procedures and functions were rare, newfangled gadgets viewed with suspicion. Calling a procedure was expensive! Separating pieces of code from the main logic caused confusion! It was a Dark Time.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Steven Lowe piece on <a href="http://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose">Composition vs. Inheritance</a> is a must read. Just to wet your appetite, let me quote the opening paragraph:</p>
<blockquote>
<p>In the beginning, there was no inheritance and no composition, only code. And the code was unwieldy, repetitive, blocky, unhappy, verbose, and tired. Copy and Paste were the primary mechanisms of code reuse. Procedures and functions were rare, newfangled gadgets viewed with suspicion. Calling a procedure was expensive! Separating pieces of code from the main logic caused confusion! It was a Dark Time.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source: Web Service PA</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</link>
      <pubDate>Thu, 21 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source-web-service-pa/</guid>
      <description>&lt;p&gt;&lt;em&gt;this post is about an all-Italian open source release, so it’s going to be in Italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il progetto &lt;a href=&#34;http://nicolaiarocci.com/fattura-elettronica-open-source/&#34;&gt;Fattura Elettronica Open Source&lt;/a&gt; si è arricchito di un nuovo strumento: &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices&#34;&gt;Web Services&lt;/a&gt;. Il namespace &lt;code&gt;FatturaElettronicaPA.WebServices&lt;/code&gt; raccoglie una serie di client C# che consentono di consultare i Web Service per la Fattura Elettronica messi a disposizione dalla Pubblica Amministrazione.&lt;/p&gt;
&lt;p&gt;Sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere al tempo stesso semplici e leggeri. Al momento lavorano in modalità sincrona ma l’obiettivo è di renderli tutti asincroni.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>this post is about an all-Italian open source release, so it’s going to be in Italian</em></p>
<p>Il progetto <a href="http://nicolaiarocci.com/fattura-elettronica-open-source/">Fattura Elettronica Open Source</a> si è arricchito di un nuovo strumento: <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices">Web Services</a>. Il namespace <code>FatturaElettronicaPA.WebServices</code> raccoglie una serie di client C# che consentono di consultare i Web Service per la Fattura Elettronica messi a disposizione dalla Pubblica Amministrazione.</p>
<p>Sono disegnati in maniera da esporre tutti la stessa interfaccia ed essere al tempo stesso semplici e leggeri. Al momento lavorano in modalità sincrona ma l’obiettivo è di renderli tutti asincroni.</p>
<h2 id="come-usare-i-web-service">Come usare i Web Service</h2>
<p>Prendiamo per esempio il Web Service che consente di convalidare un Codice Univoco di Fatturazione e recuperare le informazioni relative all’ufficio:</p>
<pre><code>var ws = new CodiceUnivocoFatturazioneWebService()

// Authorization Id ricevuto dall'ente.
ws.AuthId = &quot;&lt;auth Id&gt;&quot;;
// Codice univoco dell'ufficio che ci interessa
ws.CodiceUfficio = &quot;KN3VNW&quot;;

ws.PerformRequest();
if (ws.Ufficio == null) return;

// &quot;Ravenna&quot;
Console.WriteLine(ws.Ufficio.Comune);
</code></pre>
<p>Molto semplice. Gli altri WebService (sono sette in tutto) operano secondo lo stesso schema. Ricordo che per l’utilizzo dei Web Services della Pubblica Amministrazione è necessario richiedere una specifica autorizzazione. L’Authorization Id è gratuito ed il rilascio è immediato, ma bisogna compilare un apposito <a href="http://www.indicepa.gov.it/registr-user-ws/ws-registrazione-start.php">questionario</a>.</p>
<h2 id="installazione">Installazione</h2>
<p>FatturaElettronicaPA.WebServices è su <a href="https://www.nuget.org/packages/FatturaElettronicaPA.WebServices/">NuGet</a> quindi tutto quel che serve è eseguire:</p>
<pre><code>PM&gt; Install-Package FatturaElettronicaPA.WebServices
</code></pre>
<p>dalla Package Console, oppure usare il comando equivalente in Visual Studio.</p>
<p>La libreria è una portable class library e gira senza modifiche sui seguenti ambienti: .NET Framework 4.0 e superiori; Xamarin.iOS; Xamarin.Android; Windows Phone 8; Windows Store apps (Windows 8); Silverlight 5.0. Enjoy!</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>The Little MongoDB Book 2nd Italian Edition</title>
      <link>https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</link>
      <pubDate>Mon, 04 May 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-little-mongodb-book-2nd-italian-edition/</guid>
      <description>&lt;p&gt;The second edition of the &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34;&gt;Little MongoDB Book Italian Edition&lt;/a&gt; is finally up. It is aligned to MongoDB 2.6 and includes a much needed introduction to the Aggregation Frameworks. Enjoy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The second edition of the <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/">Little MongoDB Book Italian Edition</a> is finally up. It is aligned to MongoDB 2.6 and includes a much needed introduction to the Aggregation Frameworks. Enjoy.</p>
]]></content:encoded>
    </item>
    <item>
      <title>F# Vs C#</title>
      <link>https://nicolaiarocci.com/f-vs-c/</link>
      <pubDate>Mon, 20 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/f-vs-c/</guid>
      <description>&lt;p&gt;I have another guest post up at the official MSDN Team Blog. Titled &lt;a href=&#34;http://blogs.msdn.com/b/italy/archive/2015/04/17/f-vs-c.aspx&#34;&gt;F# Versus C#&lt;/a&gt;, it is an attempt at a gentle introduction to F# for the Italian C# developer.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have another guest post up at the official MSDN Team Blog. Titled <a href="http://blogs.msdn.com/b/italy/archive/2015/04/17/f-vs-c.aspx">F# Versus C#</a>, it is an attempt at a gentle introduction to F# for the Italian C# developer.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source Update</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source-update/</link>
      <pubDate>Fri, 17 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source-update/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://fatturaelettronicaopensource.org/&#34;&gt;Fattura Elettronica Open Source&lt;/a&gt; has been updated to v0.1.3 a few days ago and is available on &lt;a href=&#34;https://www.nuget.org/packages/FatturaElettronicaPA/&#34;&gt;NuGet&lt;/a&gt;. Sources are on &lt;a href=&#34;https://github.com/FatturaElettronicaPA/FatturaElettronicaPA&#34;&gt;GitHub&lt;/a&gt;. It fixes a deserialization issue with the &lt;code&gt;ReadXML&lt;/code&gt; method.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://fatturaelettronicaopensource.org/">Fattura Elettronica Open Source</a> has been updated to v0.1.3 a few days ago and is available on <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. Sources are on <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA">GitHub</a>. It fixes a deserialization issue with the <code>ReadXML</code> method.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Talk Python To Me Podcast Episode #1: EVE RESTful APIs for Humans</title>
      <link>https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</link>
      <pubDate>Wed, 01 Apr 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/talk-python-to-me-podcast-episode-1-eve-restful-apis-for-humans/</guid>
      <description>&lt;p&gt;I was lucky enough be the first guest for the shiny new &lt;a href=&#34;http://www.talkpythontome.com&#34;&gt;Talk Python To Me Podcast&lt;/a&gt; hosted by Michael Kennedy. In this episode we talk about Eve an my other open source releases, which gives us an excuse to touch on a variety of topics such as Polyglot Programming, New Microsoft and the .NET evolution, MongoDB and the Open Source eco-system as seen from the point of view of an old fart who has been spending most of his career in closed systems.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I was lucky enough be the first guest for the shiny new <a href="http://www.talkpythontome.com">Talk Python To Me Podcast</a> hosted by Michael Kennedy. In this episode we talk about Eve an my other open source releases, which gives us an excuse to touch on a variety of topics such as Polyglot Programming, New Microsoft and the .NET evolution, MongoDB and the Open Source eco-system as seen from the point of view of an old fart who has been spending most of his career in closed systems.</p>
<p><a href="http://www.talkpythontome.com/episodes/show/1/eve-restful-apis-for-humans"><img alt="Talk Python To Me" loading="lazy" src="/images/Screen-Shot-2015-04-01-at-10.16.08.png"></a></p>
<p>Michael has a great lineup ready for the next episodes, so make sure you subscribe to his show. It is also available on <a href="https://itunes.apple.com/us/podcast/talk-python-to-me-python-conversations/id979020229">iTunes</a>.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>New Releases for Cerberus and Eve</title>
      <link>https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</link>
      <pubDate>Tue, 17 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/new-releases-for-cerberus-and-eve/</guid>
      <description>&lt;p&gt;Yesterday &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus 0.8.1&lt;/a&gt; was released with a few little &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus/blob/master/CHANGES&#34;&gt;fixes&lt;/a&gt;, one of them being more a new feature than a fix really: sub-document fields can now be set as field dependencies by using a ‘dotted’ notation.&lt;/p&gt;
&lt;p&gt;So, suppose we set the following validation schema:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;schema = {
  &#39;test_field&#39;: {
    &#39;dependencies&#39;: [
      &#39;a_dict.foo&#39;, 
      &#39;a_dict.bar&#39;
    ]
  },
  &#39;a_dict&#39;: {
    &#39;type&#39;: &#39;dict&#39;,
      &#39;schema&#39;: {
        &#39;foo&#39;: {&#39;type&#39;: &#39;string&#39;},
        &#39;bar&#39;: {&#39;type&#39;: &#39;string&#39;}
      }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, we can validate a document like this:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday <a href="https://github.com/nicolaiarocci/cerberus">Cerberus 0.8.1</a> was released with a few little <a href="https://github.com/nicolaiarocci/cerberus/blob/master/CHANGES">fixes</a>, one of them being more a new feature than a fix really: sub-document fields can now be set as field dependencies by using a ‘dotted’ notation.</p>
<p>So, suppose we set the following validation schema:</p>
<pre><code>schema = {
  'test_field': {
    'dependencies': [
      'a_dict.foo', 
      'a_dict.bar'
    ]
  },
  'a_dict': {
    'type': 'dict',
      'schema': {
        'foo': {'type': 'string'},
        'bar': {'type': 'string'}
      }
  }
}
</code></pre>
<p>Then, we can validate a document like this:</p>
<pre><code>&gt;&gt;&gt; v = Validator(schema)
&gt;&gt;&gt; document = {
      'test_field': 'foobar', 
      'a_dict': {'foo': 'foo'}
    }

&gt;&gt;&gt; v.validate(document, schema)
False

&gt;&gt;&gt; v.errors
{'test_field': &quot;field 'a_dict.bar' is required&quot;}
</code></pre>
<p>This release will not work with Eve 0.5.2 or less so if you want to use Cerberus 0.8.1 with Eve make sure you upgrade to <a href="https://pypi.python.org/pypi/Eve">Eve 0.5.3</a>, released today. By the way, yesterday we hit 2K stargazers and 70 contributors on the <a href="https://github.com/nicolaiarocci/eve">Eve repository</a>, quite the milestone!</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>I wrote a thing about New Microsoft</title>
      <link>https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</link>
      <pubDate>Wed, 04 Mar 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/i-wrote-a-thing-about-new-microsoft/</guid>
      <description>&lt;p&gt;I have a guest post up at the official Italian &lt;a href=&#34;http://blogs.msdn.com/b/italy/archive/2015/03/03/guest-post-una-giornata-all-azure-open-day-in-compagnia-di-una-nuova-microsoft.aspx&#34;&gt;MSDN Team Blog&lt;/a&gt;. It’s about the new Microsoft I met last Wednesday at the Azure Open Day in Milan.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I have a guest post up at the official Italian <a href="http://blogs.msdn.com/b/italy/archive/2015/03/03/guest-post-una-giornata-all-azure-open-day-in-compagnia-di-una-nuova-microsoft.aspx">MSDN Team Blog</a>. It’s about the new Microsoft I met last Wednesday at the Azure Open Day in Milan.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5.2 ‘Giulia’ is Out</title>
      <link>https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</link>
      <pubDate>Mon, 23 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-2-giulia-is-out/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve 0.5.2&lt;/a&gt; has just been released with a bunch of interesting fixes and documentation updates. See the &lt;a href=&#34;http://python-eve.org/changelog#version-0-5-2&#34;&gt;changelog&lt;/a&gt; for details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.python.org/pypi/Eve">Eve 0.5.2</a> has just been released with a bunch of interesting fixes and documentation updates. See the <a href="http://python-eve.org/changelog#version-0-5-2">changelog</a> for details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Fattura Elettronica Open Source</title>
      <link>https://nicolaiarocci.com/fattura-elettronica-open-source/</link>
      <pubDate>Tue, 10 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/fattura-elettronica-open-source/</guid>
      <description>&lt;p&gt;&lt;em&gt;this post is about an all-italian open source release, so it’s going to be in italian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/FatturaElettronicaPA&#34;&gt;FatturaElettronicaPA&lt;/a&gt; è un nuovo progetto open source che ho rilasciato qualche giorno fa assieme alla &lt;a href=&#34;http://gestionaleamica.com&#34;&gt;mia azienda&lt;/a&gt;. Si tratta di una libreria C# che permette di leggere, scrivere e convalidare le Fatture Elettroniche aderenti alle specifiche del &lt;a href=&#34;http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_del_formato_FatturaPA_V1.1.pdf&#34;&gt;sistema di interscambio&lt;/a&gt; della Pubblica Amministrazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>this post is about an all-italian open source release, so it’s going to be in italian</em></p>
<p><a href="https://github.com/FatturaElettronicaPA">FatturaElettronicaPA</a> è un nuovo progetto open source che ho rilasciato qualche giorno fa assieme alla <a href="http://gestionaleamica.com">mia azienda</a>. Si tratta di una libreria C# che permette di leggere, scrivere e convalidare le Fatture Elettroniche aderenti alle specifiche del <a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/Specifiche_tecniche_del_formato_FatturaPA_V1.1.pdf">sistema di interscambio</a> della Pubblica Amministrazione.</p>
<p>Rilasciata come <a href="https://msdn.microsoft.com/en-us/library/gg597391%28v=vs.110%29.aspx">Portable Class Library</a>, FatturaElettronicaPA gira senza modifiche sui seguenti ambienti:</p>
<ul>
<li>.NET Framework 4.0 e superiori,</li>
<li>Xamarin.iOS</li>
<li>Xamarin.Android</li>
<li>Windows Phone 8</li>
<li>Windows Store apps (Windows 8)</li>
<li>Silverlight 5.0</li>
</ul>
<h2 id="come-usare-la-fattura-elettronica-pa">Come usare la Fattura Elettronica PA</h2>
<p>Usarla è molto semplice. Prima creiamo una istanza di <code>FatturaElettronica</code>:</p>
<pre><code>// instanzia una nuova fattura elettronica
FatturaElettronica fattura = new FatturaElettronica();
</code></pre>
<p>Quindi leggiamo da un file standard SDI. E’ sufficiente passare un <code>XmlReader</code> attivo al metodo <code>FatturaElettronica.ReadXml()</code>:</p>
<pre><code>// lettura da file XML compatibile con formato SDI1.1
var s = new XmlReaderSettings {IgnoreWhitespace = true};
var r = XmlReader.Create(&quot;IT01234567890_11111.xml&quot;, s);
fattura.ReadXml(r);
</code></pre>
<p>La fattura si aggiorna cambiando i valori delle sue proprietà. Qui aggiorniamo il regime fiscale del mittente. Basterebbe una sola riga di codice; usiamo tre linee per una migliore leggibilità:</p>
<pre><code>// modifica valore
var header = fattura.FatturaElettronicaHeader
var prestatore = header.CedentePrestatore
prestatore.DatiAnagrafici.RegimeFiscale = &quot;RF11&quot;;
</code></pre>
<p>Convalidare una fattura è un gioco da ragazzi. La proprietà <code>Error</code> conterrà tutti gli errori eventualmente riscontrati.</p>
<pre><code>// convalida documento
if (!fattura.IsValid) {
    Debug.WriteLine(fattura.Error);
}
</code></pre>
<p>Stampiano la fattura come flusso JSON:</p>
<pre><code>// serializzazione JSON
var json = fattura.ToJson(JsonOptions.Indented);
Debug.WriteLine(json);
</code></pre>
<p>Infine, salvarla su file standard SDI è solo questione di aprire un file con <code>XmlWriter</code> e passarlo al metodo <code>WriteXml</code>:</p>
<pre><code>// serializzazione XML secondo lo standard SDI 1.1
var s = new XmlWriterSettings { Indent = true };

XmlWriter w;
var fileName = &quot;IT01234567890_11111.xml&quot;
using (w = XmlWriter.Create(fileName, s)) {
    fattura.WriteXml(w);
}
</code></pre>
<h2 id="installazione">Installazione</h2>
<p>FatturaElettronicaPA è un package <a href="https://www.nuget.org/packages/FatturaElettronicaPA/">NuGet</a>. Per installarlo è sufficiente usare la Package Console manualmente:</p>
<pre><code>PM&gt; Install-Package FatturaElettronicaPA
</code></pre>
<p>oppure usare la interfaccia di Visual Studio.</p>
<h2 id="progetti-satellite">Progetti satellite</h2>
<p><code>FatturaElettronica</code> deriva a sua volta da <a href="https://github.com/FatturaElettronicaPA/BusinessObjects">BusinessObjects</a>, una classe che implementa la (de)serializzazione e la convalida base.</p>
<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.Forms">FatturaElettronica.Forms</a> è invece una libreria WinForms che provvede una UI per l’editing e la segnalazione degli errori di convalida. Al momento supporta l’intestazione (header) e viene già usato in produzione nel nostro software gestionale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In futuro sarebbe utile aggiungere supporto per la visualizzazione e convalida del corpo fattura (Body).</p>
<p><a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA.WebServices">FatturaElettronica.WebServices</a> consente di interrogare i diversi Web Service della Pubblica Amministrazione dedicati alla fatturazione elettronica. Tutti i progetti relativi alla fatturazione elettronica sono disponibili su <a href="https://github.com/FatturaElettronicaPA">GitHub</a>.</p>
<h2 id="perché-la-fattura-elettronica-open-source">Perché la Fattura Elettronica Open Source?</h2>
<p>Dallo scorso 6 Giugno 2014 i Ministeri, le Agenzie fiscali, le scuole e gli enti nazionali di previdenza non accettano più fatture emesse o trasmesse in forma cartacea. A partire dal 31 marzo 2015 la stessa disposizione è estesa agli altri Enti a carattere Nazionale ed a tutte le amministrazioni locali.</p>
<p>L’adozione delle fatture elettroniche è in pieno svolgimento e non crediamo di sbagliarci immaginando un futuro non troppo remoto in cui questo formato verrà adottato (per imposizione, come ci pare probabile, o per comodità) anche dal settore privato, diventando di fatto lo standard di riferimento.</p>
<p>Noi ci siamo trovati a dover implementare il supporto per la fatturazione elettronica per gli utenti di <a href="http://gestionaleamica.com">Amica 10</a>, il nostro software gestionale. Abbiamo pensato che questa fosse una buona occasione per rendere libero il nostro lavoro così che chiunque possa utilizzarlo per mettersi rapidamente al passo e magari decidere di dare una mano in uno dei tanti modi possibili: <a href="https://github.com/FatturaElettronicaPA/FatturaElettronicaPA/issues">segnalando problemi</a>, <a href="https://github.com/FatturaElettronicaPA">contribuendo direttamente</a> al progetto, o semplicemente parlandone in giro.</p>
<p>Il software è migliore quando è condiviso.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>How about a Sentinel for your Flask Application?</title>
      <link>https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</link>
      <pubDate>Wed, 04 Feb 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-sentinel-for-your-flask-applications/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/flask-sentinel&#34;&gt;Flask-Sentinel&lt;/a&gt; is a OAuth2 Server implementation of the Resource Owner Password Credentials Grant pattern described in &lt;a href=&#34;http://tools.ietf.org/html/rfc6749#section-1.3.3&#34;&gt;Section 1.3.3 of RFC 6749&lt;/a&gt;. It is powered by Flask-Oauthlib, Redis and MongoDB and is bundled as a Flask extension so it can be used to add OAuth2 capabilities to an existing application.&lt;/p&gt;
&lt;p&gt;So what is the Resource Owner Password Credentials Grant pattern? According to the official RFC:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The resource owner password credentials (i.e., username and password) can be used directly as an authorization grant to obtain an access token. The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g., the client is part of the device operating system or a highly privileged application).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/flask-sentinel">Flask-Sentinel</a> is a OAuth2 Server implementation of the Resource Owner Password Credentials Grant pattern described in <a href="http://tools.ietf.org/html/rfc6749#section-1.3.3">Section 1.3.3 of RFC 6749</a>. It is powered by Flask-Oauthlib, Redis and MongoDB and is bundled as a Flask extension so it can be used to add OAuth2 capabilities to an existing application.</p>
<p>So what is the Resource Owner Password Credentials Grant pattern? According to the official RFC:</p>
<blockquote>
<p>The resource owner password credentials (i.e., username and password) can be used directly as an authorization grant to obtain an access token. The credentials should only be used when there is a high degree of trust between the resource owner and the client (e.g., the client is part of the device operating system or a highly privileged application).</p></blockquote>
<p>A typical use case would be when the remote API maintainer controls the client application. Say that you have a REST API being consumed by your own iOS, Android, WinPhone, desktop or web applications. Users register to your service by creating their accounts. Then, they consume the service using your applications.</p>
<blockquote>
<p>Even though this grant type requires direct client access to the resource owner credentials, the resource owner credentials are used for a single request and are exchanged for an access token. This grant type can eliminate the need for the client to store the resource owner credentials for future use, by exchanging the credentials with a long-lived access token or refresh token.</p></blockquote>
<p>So let’s get back at the proprietary client scenario. The user has just installed the application on his/her device. On first run he/she is asked to provide his/her username and password. These are sent to the OAuth2 server through a SSL/TLS encrypted channel. If the user is registered for the service and the client id, which has also been sent along with the user credentials, is recognised, then the server sends back a valid access token. Otherwise responds with a <code>401 Unhautorized</code>.</p>
<p>From now on the application will only be using the access token for all requests until, eventually, the token expires. If that happens, the cycle repeats. Please note that in this scenario the client does not need to (and probably should not) store the username and/or password on the local cache. The User Credentials pattern usually relies on long lived tokens so asking again for username and password is not a big deal (you could also opt for permanent, revokable tokens.)</p>
<p>Flask-Sentinel provides two endpoints: one for token creation which defaults to <code>/oauth/token</code> and is consumed by clients, and another for users and clients management, accessible at <code>/oauth/management</code>:</p>
<!-- raw HTML omitted -->
<p>Note that the password is hashed and salted on the server, so no plain password is stored on either sides of the channel.</p>
<p>Only existing users and recognised clients will be provided an access token. A typical token request would be as follows:</p>
<pre><code>$ curl -k -X POST -d \
  &quot;client_id=9qFbZD4udTzFVYo0u5UzkZX9iuzbdcJDRAquTfRk&amp;
   grant_type=password&amp;
   username=jonas&amp;
   password=pass&quot; \
   &lt;api_url&gt;/oauth/token
</code></pre>
<p>And the response would be like so:</p>
<pre><code>{
    &quot;access_token&quot;: &quot;NYODXSR8KalTPnWUib47t5E8Pi8mo4&quot;, 
    &quot;token_type&quot;: &quot;Bearer&quot;, 
    &quot;refresh_token&quot;: &quot;s6L6OPL2bnKSRSbgQM3g0wbFkJB4ML&quot;, 
    &quot;scope&quot;: &quot;&quot;
}
</code></pre>
<p>The client can now use the access token to access protected API endpoints:</p>
<pre><code>$ curl -k -H \
  &quot;Authorization:Bearer NYODXSR8KalTPnWUib47t5E8Pi8mo4&quot; \
  &lt;api_url&gt;/endpoint

200 OK
</code></pre>
<p>There are a number of configuration options of course, for example you can change the url of token and management endpoints, set token expiration, setup database connection, stuff like that. Redis is used to store active access tokens, allows for optimal performance.</p>
<p>While you can use Flask-Sentinel to extend an existing API, you might want to instance it as a stand-alone Flask application to optimize for scalability. You would end up with a distributed network of three different (micro)services: the OAuth2 server, the resouces API with protected endpoints as needed, and the Redis instance bridging the two. Check out the <a href="https://github.com/nicolaiarocci/flask-sentinel">project page</a> on GitHub for details.</p>
<p>Of course Flask-Sentinel integrates seamlessly with any <a href="http://python-eve.org">Eve</a> powered REST API. Check out the <a href="https://github.com/nicolaiarocci/eve-oauth2">Eve-OAuth2</a> sample, a fork of the original Eve-Demo project with a couple protected endpoints and a static HTML page, also protected.</p>
<p>The project is very new and lacks a few little things, but I suspect it is already usable even at this stage. Enjoy!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5.1 Released</title>
      <link>https://nicolaiarocci.com/eve-0-5-1-released/</link>
      <pubDate>Fri, 16 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-1-released/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve 0.5.1&lt;/a&gt; was just released with a &lt;a href=&#34;http://python-eve.org/changelog#version-0-5-1&#34;&gt;couple fixes&lt;/a&gt; to 0.5 (which was released earlier this week.) Don’t be surprised. Going forward I’m striving for a much faster release cycle, especially so when it comes to fixes.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://pypi.python.org/pypi/Eve">Eve 0.5.1</a> was just released with a <a href="http://python-eve.org/changelog#version-0-5-1">couple fixes</a> to 0.5 (which was released earlier this week.) Don’t be surprised. Going forward I’m striving for a much faster release cycle, especially so when it comes to fixes.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Announcing Eve-SQLAlchemy the official SQL extension for the Eve REST Framework</title>
      <link>https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</link>
      <pubDate>Tue, 13 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/announcing-eve-sqlalchemy-the-official-sql-extension-for-the-eve-rest-framework/</guid>
      <description>&lt;p&gt;Powered by SQLAlchemy and good intentions, &lt;a href=&#34;https://github.com/RedTurtle/eve-sqlalchemy&#34;&gt;Eve-SQLAlchemy&lt;/a&gt; is an official &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; extension which allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services with SQL backends.&lt;/p&gt;
&lt;p&gt;As with all Eve extensions, once installed with&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ pip install eve-sqlalchemy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;using Eve-SQLAlchemy is very simple:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from eve import Eve
from eve_sqlalchemy import SQL

app = Eve(data=SQL)
app.run()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On a fresh virtualenv (of course you are using virtualenvs, right?) the install will also setup Eve and all its dependencies for you. For a complete tutorial you can visit the Eve-SQLAlchemy &lt;a href=&#34;http://eve-sqlalchemy.readthedocs.org/&#34;&gt;Support Website&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Powered by SQLAlchemy and good intentions, <a href="https://github.com/RedTurtle/eve-sqlalchemy">Eve-SQLAlchemy</a> is an official <a href="http://python-eve.org">Eve</a> extension which allows to effortlessly build and deploy highly customizable, fully featured RESTful Web Services with SQL backends.</p>
<p>As with all Eve extensions, once installed with</p>
<pre><code>$ pip install eve-sqlalchemy
</code></pre>
<p>using Eve-SQLAlchemy is very simple:</p>
<pre><code>from eve import Eve
from eve_sqlalchemy import SQL

app = Eve(data=SQL)
app.run()
</code></pre>
<p>On a fresh virtualenv (of course you are using virtualenvs, right?) the install will also setup Eve and all its dependencies for you. For a complete tutorial you can visit the Eve-SQLAlchemy <a href="http://eve-sqlalchemy.readthedocs.org/">Support Website</a>.</p>
<p>If you have been following the Eve development you probably know that the original plan was to release SQL support within the Eve core, alongside with the native MongoDB layer. In fact, in a <a href="http://nicolaiarocci.com/open-source-and-code-responsibility/">long rant</a> on open source and code responsibility I took the chance to outline the path forward.</p>
<p>However, if you check the discussion which spread in the comments below that post you can see how both my friend and fellow MongoDB Master <a href="http://www.flaper87.com/">Flavio</a> and the main contributor to the sqlalchemy branch <a href="https://github.com/amleczko">Andrew</a> were suggesting that a plugin system for data layers might be more appropriate. Not coincidentally that was easy to accomplish since the Eve data layer system was designed precisely with that goal in mind, right from the start.</p>
<p>So, to make a long story short, in agreement with Andrew who volountereed for the task, we changed plans. He refactored the sqlalchemy branch into a separate repository… and then the official Eve SQL extension was born. This approach also allows the extension and Eve to develop asynchronously which is ideal for a faster release cycle.</p>
<p>I like this setup so much that, if in time it shows to be as good as I think it will be, I will probably want to experiment with taking the MongoDB layer out of Eve core too. So with Eve 0.6 MongoDB support would still be preinstalled along with core (so nothing changes as first time user experience) but, being a separate package, users could easily switch to a different driver as they need, still keeping their Eve setup as light as possible.</p>
<p>So if you are willing to help with the development of a mature SQL driver please feel free to join Andrew and other contributors. Your help is more than welcome. Allow me thank them all individually, for the work they’ve been doing on the SQL code is absolutely amazing: Andrew Mleczko, Tomasz Jezierski (Tefnet), Bruce Frederiksen, Jacopo Sabbatini and Peter Zinng.</p>
<p>Get <a href="https://pypi.python.org/pypi/Eve-SQLAlchemy/0.1">Eve-SQLAlchemy v0.1</a> while it’s hot!</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.5 released today</title>
      <link>https://nicolaiarocci.com/eve-0-5-released-today/</link>
      <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-5-released-today/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; v0.5 was released today. &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus&lt;/a&gt; v0.8 only a few days ago. A whole lot of new features, changes and fixes are coming with these releases so make sure to check the &lt;a href=&#34;http://blog.python-eve.org/eve-05-released&#34;&gt;official release post&lt;/a&gt; to gather all the news.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-eve.org">Eve</a> v0.5 was released today. <a href="https://github.com/nicolaiarocci/cerberus">Cerberus</a> v0.8 only a few days ago. A whole lot of new features, changes and fixes are coming with these releases so make sure to check the <a href="http://blog.python-eve.org/eve-05-released">official release post</a> to gather all the news.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How to: Add custom JeSuisCharlie header to API responses</title>
      <link>https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</link>
      <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/how-to-add-a-je-suis-charlie-header-to-api-responses/</guid>
      <description>&lt;p&gt;A lot of servers have been including a &lt;code&gt;JeSuisCharlie&lt;/code&gt; header with their responses. If you haven’t already, try with Charlie Hebdo site itself:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ curl -I charliehebdo.fr
Date: Mon, 12 Jan 2015 15:56:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 221
Connection: keep-alive
Location: http://www.charliehebdo.fr/index.html
Vary: Accept-Encoding
X-Charlie-fr: Je suis toujours Charlie.
X-Charlie-en: I am still Charlie.
X-Charlie-es: Todavia soy Charlie.
X-Charlie-de: Ich bin immer Charlie.
X-Charlie-ro: Inca sunt Charlie.
X-Charlie-cz: Jsem stale Charlie.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I find this to be a great way for us techies to somehow contribute and show support for the ongoing anti-terrorism campaign. So if you feel like doing it here is a quick rundown on how to serve custom headers with your Eve-powered REST API. It is actually a very easy task to accomplish.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A lot of servers have been including a <code>JeSuisCharlie</code> header with their responses. If you haven’t already, try with Charlie Hebdo site itself:</p>
<pre><code>$ curl -I charliehebdo.fr
Date: Mon, 12 Jan 2015 15:56:13 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 221
Connection: keep-alive
Location: http://www.charliehebdo.fr/index.html
Vary: Accept-Encoding
X-Charlie-fr: Je suis toujours Charlie.
X-Charlie-en: I am still Charlie.
X-Charlie-es: Todavia soy Charlie.
X-Charlie-de: Ich bin immer Charlie.
X-Charlie-ro: Inca sunt Charlie.
X-Charlie-cz: Jsem stale Charlie.
</code></pre>
<p>I find this to be a great way for us techies to somehow contribute and show support for the ongoing anti-terrorism campaign. So if you feel like doing it here is a quick rundown on how to serve custom headers with your Eve-powered REST API. It is actually a very easy task to accomplish.</p>
<p>Eve provides <a href="http://python-eve.org/features.html#event-hooks">its own set</a> of callback hooks but since we don’t need fine-grained control (we are good with including the new header with all responses), this time we will leverage Flask’s <a href="http://flask.pocoo.org/snippets/53/">native</a> callback system instead.</p>
<pre><code>@app.after_request
def after_request(response):
    response.headers.add('X-Charlie', 'Je Suis Charlie.')
    response.headers.add('X-Ahmed', 'Je Suis Ahmed.')
    return response
</code></pre>
<p>A simple run script would then look something like:</p>
<pre><code>from eve import Eve
app = Eve()

@app.after_request
def after_request(response):
    response.headers.add('X-Charlie', 'Je Suis Charlie.')
    response.headers.add('X-Ahmed', 'Je Suis Ahmed.')
    return response

if __name__ == '__main__':
    app.run()
</code></pre>
<p>All API responses now include the custom headers:</p>
<pre><code>$ curl http://localhost:5000
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 141
Server: Eve/0.5 Werkzeug/0.9.6 Python/2.7.8
Date: Mon, 12 Jan 2015 15:39:36 GMT
X-Charlie: Je Suis Charlie.
X-Ahmed: Je Suis Ahmed.
</code></pre>
<p>If you want to see it in action try sending a GET request with <code>curl</code>, <code>Postman</code> or similar tool to the Eve <a href="http://eve-demo.herokuapp.com/">demo instance</a> (<a href="https://github.com/nicolaiarocci/eve-demo/blob/master/run.py">source</a>). Remember Eve is a Flask subclass so whatever works with Flask generally works with Eve too.</p>
<p>If you want to get in touch, I am <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Validating user objects with Cerberus</title>
      <link>https://nicolaiarocci.com/validating-user-objects-cerberus/</link>
      <pubDate>Mon, 05 Jan 2015 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/validating-user-objects-cerberus/</guid>
      <description>&lt;p&gt;People keep telling me that they want to validate class and instance attributes (object properties) with &lt;a href=&#34;https://github.com/nicolaiarocci/cerberus&#34;&gt;Cerberus&lt;/a&gt;. While it certainly wasn’t conceived with that goal in mind, it is actually very possible to leverage both the Python &lt;a href=&#34;https://docs.python.org/2/reference/datamodel.html&#34;&gt;data model&lt;/a&gt; and Cerberus &lt;a href=&#34;http://cerberus.readthedocs.org/en/latest/#custom-validators&#34;&gt;extensibility&lt;/a&gt; to achieve object validation.&lt;/p&gt;
&lt;h2 id=&#34;nuts--bolts&#34;&gt;Nuts &amp;amp; Bolts&lt;/h2&gt;
&lt;p&gt;Let’s say that we have a simple class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; class Person(object):
...     pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We create a &lt;code&gt;Person&lt;/code&gt; instance and add a few properties and values:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>People keep telling me that they want to validate class and instance attributes (object properties) with <a href="https://github.com/nicolaiarocci/cerberus">Cerberus</a>. While it certainly wasn’t conceived with that goal in mind, it is actually very possible to leverage both the Python <a href="https://docs.python.org/2/reference/datamodel.html">data model</a> and Cerberus <a href="http://cerberus.readthedocs.org/en/latest/#custom-validators">extensibility</a> to achieve object validation.</p>
<h2 id="nuts--bolts">Nuts &amp; Bolts</h2>
<p>Let’s say that we have a simple class:</p>
<pre><code>&gt;&gt;&gt; class Person(object):
...     pass
</code></pre>
<p>We create a <code>Person</code> instance and add a few properties and values:</p>
<pre><code>&gt;&gt;&gt; p = Person()
&gt;&gt;&gt; p.name = &quot;bill&quot;
&gt;&gt;&gt; p.age = 44
</code></pre>
<p>Now let’s instance a Cerberus Validator and set up some validation rules for it:</p>
<pre><code>&gt;&gt;&gt; from Cerberus import Validator
&gt;&gt;&gt; schema = {
...     'name': {'type': 'string'},
...     'age': {'type': 'integer', 'min': 0}
... }
&gt;&gt;&gt; v = Validator(schema)
</code></pre>
<p>As you probably know already, all Python user objects have a <code>__dict__</code> magic method which exposes class and instance attributes as a dictionary. This means that we can also query our class like this:</p>
<pre><code>&gt;&gt;&gt; p.__dict__
{'name': 'bill', 'age': 44}

&gt;&gt;&gt; p.__dict__['age']
44
</code></pre>
<p>You see where we are going with this: we can exploit the <code>__dict__</code> method in order to let Cerberus perform validation on our object:</p>
<pre><code>&gt;&gt;&gt; v.validate(p.__dict__)
True
</code></pre>
<p>Validation succeeds because current attribute values do not break any rule. However, if we break the rules we do get what we deserve:</p>
<pre><code>&gt;&gt;&gt; p.age = -1
&gt;&gt;&gt; v.validate(p.__dict__)
False

&gt;&gt;&gt; v.errors
{'age': 'min value is 0'}
</code></pre>
<p>This works, but is somewhat clumsy. We can do better.</p>
<h2 id="a-custom-object-validator">A Custom Object Validator</h2>
<p>How about letting the Validator do the work for us? We could subclass the standard Validator and extend it to natively support object validation.</p>
<pre><code>&gt;&gt;&gt; class ObjectValidator(Validator):
...     def validate_object(self, obj):
...         return self.validate(obj.__dict__)
...

&gt;&gt;&gt; v = ObjectValidator(schema)
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'age': 'min value is 0'}

&gt;&gt;&gt; p.age = 44
&gt;&gt;&gt; v.validate_object(p)
True
</code></pre>
<p>Much better. But what happens if we add a new property and then validate the object?</p>
<pre><code>&gt;&gt;&gt; p.lastname = 'white'
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'lastname': 'unknown field'}
</code></pre>
<p>Validation fails because by default unknown fields are not allowed. This might not be the desired behaviour. If this is the case, we simply need to update the helper method in our custom validator class:</p>
<pre><code>&gt;&gt;&gt; class ObjectValidator(Validator):
...     def validate_object(self, obj):
...         self.allow_unknown = True
...         return self.validate(obj.__dict__)

&gt;&gt;&gt; v.validate_object(p)
True
</code></pre>
<p>By setting <code>allow_unknown</code> to <code>True</code> we <a href="http://cerberus.readthedocs.org/en/latest/#allowing-the-unknown">let unknown fields be ignored</a> by validation. If we are not concerned by state changes between calls we might conveniently choose to move the setting of <code>allow_unknown</code> to the <code>__init__</code> method so it gets executed only once.</p>
<p>Looks good so far. We can validate simple objects. But what about complex ones like those exposing other objects as attributes? This is going to require some more tinkering.</p>
<h2 id="validating-complex-objects">Validating Complex Objects</h2>
<p>It would be super handy if we could add support for an <code>object</code> data type and then provide a validation schema for it, like we already do with the <code>dict</code> and <code>list</code> types. A revised validation schema would then look like this:</p>
<pre><code>&gt;&gt;&gt; schema = {
...     'name': {'type': 'string'},
...     'age': {'type': 'integer', 'min': 0},
...     'address': {
...         'type': 'object',
            'schema': {
...             'street': {'type': 'string'},
...             'zip': {'type': 'integer'}
...         }
...     }
... }
</code></pre>
<p>We could then validate it like so:</p>
<pre><code>&gt;&gt;&gt; class Address
...     pass

&gt;&gt;&gt; addr = Address()
&gt;&gt;&gt; addr.street = 'Lexington'
&gt;&gt;&gt; addr.zip = 50238
&gt;&gt;&gt; p.address = addr

&gt;&gt;&gt; v.validate_object(p)
True

&gt;&gt;&gt; p.address.zip = 'not a number'
&gt;&gt;&gt; v.validate_object(p)
False

&gt;&gt;&gt; v.errors
{'address': {'zip': 'must be of integer type'}}
</code></pre>
<p>It turns out this is also very achievable. We can leverage Cerberus <a href="http://cerberus.readthedocs.org/en/latest/#adding-new-data-types">data type extensibility model</a> to add support for the <code>object</code> type. Then it is just a matter of handling the new type when validating the <code>schema</code> rule. I’m not going into details here but you can check <a href="https://gist.github.com/nicolaiarocci/829c98eb5f8b4e9c96c1">Validating complex objects with Cerberus</a>, a trivial implementation I posted as a GitHub gist.</p>
<h2 id="closing-note">Closing note</h2>
<p>You might be wondering why don’t I add object validation to Cerberus core. Actually, I don’t rule out this possibility but see I like to keep tools as simple, targeted and focused as possible. Besides, there are other object validation tools out there, so adding a new flavour does not seem very useful to me (but let me know if you feel otherwise.) Though as we have seen, if you want to validate user objects with Cerberus, you can do that easily enough.</p>
<p>If you want to get in touch, I am @<a href="http://twitter.com/nicolaiarocci">nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Some Thoughts on the new .NET (Redux)</title>
      <link>https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</link>
      <pubDate>Thu, 04 Dec 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/some-thoughts-on-the-new-net-redux/</guid>
      <description>&lt;p&gt;Like all those involved with the .NET ecosystem I’ve been slowly digesting the recent news on the whole thing going open source and cross platform. I’ve been jogging down a few notes in light of a future blog post, but then Jeremy Miller came out with his own &lt;a href=&#34;http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/&#34;&gt;Some Thoughts on the New .NET&lt;/a&gt; which is almost exactly the post I wanted to write. So when he writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ve started to associate .Net “classic” with seemingly constant aggravations like strong naming conflicts, csproj file merge hell, slow compilation, slow nuget restores, and how absurdly heavyweight and bloated that Visual Studio.Net has become over the years.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Like all those involved with the .NET ecosystem I’ve been slowly digesting the recent news on the whole thing going open source and cross platform. I’ve been jogging down a few notes in light of a future blog post, but then Jeremy Miller came out with his own <a href="http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/">Some Thoughts on the New .NET</a> which is almost exactly the post I wanted to write. So when he writes:</p>
<blockquote>
<p>I’ve started to associate .Net “classic” with seemingly constant aggravations like strong naming conflicts, csproj file merge hell, slow compilation, slow nuget restores, and how absurdly heavyweight and bloated that Visual Studio.Net has become over the years.</p></blockquote>
<p>It is me. No it’s actually Jeremy but really it’s me. I also share his concerns on the future OSS .NET community him:</p>
<blockquote>
<p>So much of .Net is open source now and they even take contributions. Awesome, great, but my very first reaction was that it doesn’t matter much because <strong>the .Net community as a whole isn’t as participatory as other communities</strong> and that would have to change before ASP.Net vNext being OSS matters. It’ll be interesting to me to see if that changes over time.</p></blockquote>
<p>I’m very involved with the Python language and its community. I released <a href="http://nicolaiarocci.com/opensource/">open source projects</a> for both platforms and frankly I’ve been shocked by the difference in culture between the two communities. I am really hoping that, in due time, .NET going open source will also cause its community to evolve as a whole.</p>
<p>And what about coding on a Mac (or Linux for the matter)? He goes on with:</p>
<blockquote>
<p>After a couple years now of using a Mac, I’d really prefer to stay on that side of things and hopefully give my Windows VM much more time off. Mac OS being a first class citizen for the new .Net and the progress on the OmniSharp tools for Sublime or MacVim is going to make the new ASP.Net vNext runtime a much easier sell in my shop.</p></blockquote>
<p>I’ve been working on a Mac for years, confining Windows on a VM, doing Python with Vim as much as possible. My God I love Vim. My Visual Studio runs VsVim (which is open source by the way). Even my Xamarin Studio on OSX runs in vi mode (which sucks unfortunately). I would never go back to a Windows machine but that does not mean that I don’ want to use C# or F#. Even these days most of my coding is C# in XS/OSX or Vim with OmniSharp, a project I’ve been experimenting with since when the plugin for Vim was released. So native .NET on OSX and Unix? Yes please.</p>
<p>I am in the process of writing a C# iOS application. The data layer is SQLite encapsulated in a Portable Class so we can use it on both Windows and iOS. The HTTP/REST client is also portable, <a href="http://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/">open source</a> and consumed on both platforms. And now even the mobile UI is C# and portable between Android, iOS and Windows Phone thanks to Xamarin.Forms. If you ask me, the future looks bright.</p>
<p>You should read Jeremy post on <a href="http://jeremydmiller.com/2014/12/02/some-thoughts-on-the-new-net/">his site</a>.</p>
<p>If you want to get in touch, I am <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introducing Eve.NET the HTTP/REST Client for Humans™</title>
      <link>https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</link>
      <pubDate>Thu, 27 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introducing-eve-net-httprest-client-humans/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/nicolaiarocci/Eve.NET&#34;&gt;Eve.NET&lt;/a&gt; is a simple HTTP and REST client for Web Services powered by the &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve Framework&lt;/a&gt;. It leverages both &lt;code&gt;System.Net.HttpClient&lt;/code&gt; and &lt;code&gt;Json.NET&lt;/code&gt; to provide the best possible Eve experience on the .NET platform.&lt;/p&gt;
&lt;p&gt;Written and maintained by the same author of the Eve Framework itself, Eve.NET is delivered as a portable library (PCL) and runs seamlessly on .NET4, Mono, Xamarin.iOS, Xamarin.Android, Windows Phone 8 and Windows 8. We use Eve.NET internally to power our iOS, Web and Windows applications.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://github.com/nicolaiarocci/Eve.NET">Eve.NET</a> is a simple HTTP and REST client for Web Services powered by the <a href="http://python-eve.org">Eve Framework</a>. It leverages both <code>System.Net.HttpClient</code> and <code>Json.NET</code> to provide the best possible Eve experience on the .NET platform.</p>
<p>Written and maintained by the same author of the Eve Framework itself, Eve.NET is delivered as a portable library (PCL) and runs seamlessly on .NET4, Mono, Xamarin.iOS, Xamarin.Android, Windows Phone 8 and Windows 8. We use Eve.NET internally to power our iOS, Web and Windows applications.</p>
<p><em>And now please forgive me while I take you on a quick motivational, strongly opinionated, probably boring and overzealous detour</em></p>
<hr>
<h2 id="python-and-c-motherfucker-do-you-speak-it-">Python and C# Motherfucker, Do You Speak It? *</h2>
<p>If you don’t then well, you should consider doing just that. Especially so these days, with C# and the whole .NET platform going open source and cross platform. Actually, thanks to technologies like Mono and Xamarin (also based on Mono) we have been able to run C# code on all major platforms for a while: iOS, Android, OSX, Linux, Windows, Windows Phone, you-name-it. And what’s even better, on mobile platforms C# is compiled to native so performance is a non-issue.</p>
<p>What makes C# a perfect match for a REST API is precisely that: it’s ubiquity. You can have a portable client library like Eve.NET which runs seamlessly (and untouched) on all these mobile desktop and server platforms.</p>
<p>If you already have a Web Service running on Eve and are now looking at the client side of things then well, you should consider C# and Eve.NET because you know, you can’t have a native iOS app written in Python anyway. On the other hand if you are a C#/.NET shop consider this: you can have a powerful Web Service up and running in minutes (even if you don’t grok Python yet – trust me on that) <em>and</em> a complete out-of-the-box, cross platform client library ready to go with it.</p>
<p>A few years ago I gave a talk about leaving my Comfort Zone (**) and getting out of my .NET nest. That opened the path to Python, MongoDB, Node and so many other technologies and best practices and, what’s even more relevant, most of what I learned down that path I ended up using in my .NET projects in the long run. But the point I’m trying to make is don’t be afraid of change, it can only improve your skills making you a better all-around professional programmer.</p>
<p>Never mind the naysayers. Polyglot is the way.</p>
<hr>
<p>(*) I’m paraphrasing Zed A. Shaw’s <a href="http://programming-motherfucker.com/">Programming, Motherfucker</a>. You should get a T-Shirt by the way. They are so cool.</p>
<p>(**) Since then there have been plenty of talks on the same subject. Mine was an 5 minutes ignite talk and was in Italian, so you probably don’t care (it’s on my <a href="http//nicolaiarocci.com/talks">Talks</a> page anyway).</p>
<hr>
<p><em>Back to business now</em>.</p>
<h2 id="usage">Usage</h2>
<p>Initialization is as simple as instantiating a new client and providing it with the web service entry point.</p>
<pre><code>// Initialize and set API address.
var client = new EveClient();
client.BaseAddress = new Uri(&quot;http://api.com&quot;);

// Set target resource for subsequent requests.
client.ResourceName = &quot;companies&quot;;
</code></pre>
<p>Getting a list of objects is pretty straightforward:</p>
<pre><code>// List&lt;T&gt;
companies = await client.GetAsync&lt;Company&gt;();

// Objects changed since DateTime.
var ifModifiedSince = DateTime.Now.AddDays(-1);
companies = await 
  client.GetAsync&lt;Company&gt;(ifModifiedSince);

// Refresh an object
company = await client.GetAsync&lt;Company&gt;(company);

// Raw, conditional GET request
var companyId = &quot;507c7f79bcf86cd7994f6c0e&quot;;
var eTag = &quot;7776cdb01f44354af8bfa4db0c56eebcb1378975&quot;;

company = await 
  client.GetAsync&lt;Company&gt;(&quot;companies&quot;, companyId, eTag);
</code></pre>
<p>Other CRUD operations are easy too:</p>
<pre><code>// Create (POST)
company = await 
  client.PostAsync&lt;Company&gt;(
    new Company { Name = &quot;MyCompany&quot; }
  );

// Update (PUT)
company.Name = &quot;YourCompany&quot;;
var result = await client.PutAsync&lt;Company&gt;(company);

// Delete (DELETE)
var result = await client.DeleteAsync(company);
</code></pre>
<p>As you can see all methods are Async and return full object instances parsing JSON in and out on for you. If you need more control you can query the <code>HttpResponse</code> property to inspect the original JSON, response headers, status code, etc.</p>
<p>Behind the scenes <a href="http://python-eve.org/features#data-integrity-and-concurrency-control">data integrity and concurrency control</a> are transparently handled so for example <code>PutAsync</code> performs a <code>If-Match</code> check and same happens with <code>DeleteAsync</code>. On <code>PostAsync</code> new objects are returned with fresh meta-fields such as <code>ETag</code>, <code>DateCreated</code>, <code>DateUpdated</code> and <code>UniqueId</code>. Mapping object properties to JSON fields and Eve metafields is just a matter of setting the <code>JSonPropertyAttribute</code> and <code>RemoteAttribute</code>:</p>
<pre><code>public abstract class BaseClass
{
  [JsonProperty(&quot;_id&quot;)]
  [Remote(Meta.DocumentId)]
  public string UniqueId { get; set; }

  [JsonProperty(&quot;_etag&quot;)]
  [Remote(Meta.ETag)]
  public string ETag { get; set; }

  [JsonProperty(&quot;_updated&quot;)]
  [Remote(Meta.LastUpdated)]
  public DateTime Updated { get; set; }

  [JsonProperty(&quot;_created&quot;)]
  [Remote(Meta.DateCreated)]
  public DateTime Created { get; set; }   
}

public class Company : BaseClass
{
  [JsonProperty(&quot;n&quot;)]
  public string Name { get; set; }

  [JsonProperty(&quot;p&quot;)]
  public string Password { get; set; }
}
</code></pre>
<p>For a complete list of usage examples see the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/README.md">README</a></p>
<h2 id="current-status-and-license">Current Status and License</h2>
<p>Eve.NET is a <a href="http://nicolaiarocci.com">Nicola Iarocci</a> and <a href="http://gestionaleamica.com">Gestionali Amica</a> open source project distributed under the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/LICENSE.txt">BSD license</a>. It is a work in progress but it’s pretty stable already. It is <a href="https://www.nuget.org/packages/Eve.NET/">available on NuGet</a> as a pre-release package. The test suite can be run against a local Eve instance or, if you don’t grok Python yet, you can use a free test instance which is available online, see the <a href="https://github.com/nicolaiarocci/Eve.NET/blob/master/README.md">README</a> for details.</p>
<p>Did you read this far? Well thank you! And please, consider showing your appreciation by starring the project on <a href="https://github.com/nicolaiarocci/Eve.NET">GitHub</a>. It feels so lonely out there.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>The Obligation of The Programmer</title>
      <link>https://nicolaiarocci.com/obligation-programmer/</link>
      <pubDate>Tue, 18 Nov 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/obligation-programmer/</guid>
      <description>&lt;p&gt;Robert C.Martin, of &lt;!-- raw HTML omitted --&gt;Clean Code&lt;!-- raw HTML omitted --&gt; fame, has something to say on the role of we programmers in today’s society.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We rule the world.&lt;/p&gt;
&lt;p&gt;We don’t quite understand this yet. More importantly, the world doesn’t quite understand it yet. Our civilization doesn’t quite realize how dependent it has become on software — on us.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;He goes as far as suggesting a programmer’s code of conduct of sorts. Food for thought I guess, although I suspect we’re too much of a wild and scattered bunch for something like that to really stick.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Robert C.Martin, of <!-- raw HTML omitted -->Clean Code<!-- raw HTML omitted --> fame, has something to say on the role of we programmers in today’s society.</p>
<blockquote>
<p>We rule the world.</p>
<p>We don’t quite understand this yet. More importantly, the world doesn’t quite understand it yet. Our civilization doesn’t quite realize how dependent it has become on software — on us.</p></blockquote>
<p>He goes as far as suggesting a programmer’s code of conduct of sorts. Food for thought I guess, although I suspect we’re too much of a wild and scattered bunch for something like that to really stick.</p>
<p>Nonetheless, he raises a very good point about the predominance of software in our society and the risk that soon or later someone will wake up and attempt to impose some sort of regulation on the profession.</p>
<p>Read it all at the <a href="http://blog.cleancoder.com/uncle-bob/2014/11/15/WeRuleTheWorld.html">Clean Coder Blog</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Open Source and Code Responsibility</title>
      <link>https://nicolaiarocci.com/open-source-and-code-responsibility/</link>
      <pubDate>Tue, 21 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/open-source-and-code-responsibility/</guid>
      <description>&lt;p&gt;Last week I was speaking at an Open Source panel at &lt;a href=&#34;http://www.bettersoftware.it&#34;&gt;Better Software 2014&lt;/a&gt;, and one of the topics that we touched was code responsibility. This is an important topic for anyone who is maintaining an open source project, especially when it comes to the process of reviewing and accepting code contributions.&lt;/p&gt;
&lt;p&gt;At some point during the debate, I argued that when a maintainer merges a pull request, he (or she) implicitly agrees on being responsible for that code. That seemed to strike some surprise into most attendees.&lt;/p&gt;
&lt;p&gt;Yes, in theory any contributor is just a ping away so in case trouble arises one can always reach him, or her. Unfortunately this is not always the case. While some contributors will fully embrace your project and keep helping after their initial contribution, truth is that a good number of them will just move on, never to be seen again.&lt;/p&gt;
&lt;p&gt;There’s nothing wrong with that. Not everyone has spare time to devote to your project, which is perfectly fine. It is natural for most people to contribute what they need to a project and then go on their way. Actually, one could argue that most projects grow and prosper precisely thanks to this kind of contributions.&lt;/p&gt;
&lt;p&gt;However this attitude can become an incumbent when big chunks of code get merged, usually as new (big) features. Good practices advice against merging huge pull requests. In fact they are rare and when they do come, it is a good idea to ask for them to be split into smaller ones. But no matter the format, a huge contribution is likely to hit a project one day or another. It might even come from more than one person: a disconnected and distributed team of contributors who have been patiently tinkering on a side branch or a fork for example. When this happens, and provided that the contribution is worth merging, the maintainer should then ask him/herself the obvious question: &lt;em&gt;am I willing to deal with the consequences of this merge?&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Last week I was speaking at an Open Source panel at <a href="http://www.bettersoftware.it">Better Software 2014</a>, and one of the topics that we touched was code responsibility. This is an important topic for anyone who is maintaining an open source project, especially when it comes to the process of reviewing and accepting code contributions.</p>
<p>At some point during the debate, I argued that when a maintainer merges a pull request, he (or she) implicitly agrees on being responsible for that code. That seemed to strike some surprise into most attendees.</p>
<p>Yes, in theory any contributor is just a ping away so in case trouble arises one can always reach him, or her. Unfortunately this is not always the case. While some contributors will fully embrace your project and keep helping after their initial contribution, truth is that a good number of them will just move on, never to be seen again.</p>
<p>There’s nothing wrong with that. Not everyone has spare time to devote to your project, which is perfectly fine. It is natural for most people to contribute what they need to a project and then go on their way. Actually, one could argue that most projects grow and prosper precisely thanks to this kind of contributions.</p>
<p>However this attitude can become an incumbent when big chunks of code get merged, usually as new (big) features. Good practices advice against merging huge pull requests. In fact they are rare and when they do come, it is a good idea to ask for them to be split into smaller ones. But no matter the format, a huge contribution is likely to hit a project one day or another. It might even come from more than one person: a disconnected and distributed team of contributors who have been patiently tinkering on a side branch or a fork for example. When this happens, and provided that the contribution is worth merging, the maintainer should then ask him/herself the obvious question: <em>am I willing to deal with the consequences of this merge?</em></p>
<p>In fact this is the exact scenario I’m dealing with right now. The <a href="http://python-eve.org">Eve</a> project has always been a MongoDB shop. Since its inception however people have been asking if (when) SQL support was going to be added. I think we were in Alpha when someone started contributing SQL code. Over time I ended up devoting a specific branch to this feature. Several people have been hacking at it since then, and what a splendid job they did! To say that it was a huge commitment is an understatement but, in time, they managed to deliver. So now we have this awesome <a href="https://github.com/nicolaiarocci/eve/tree/sqlalchemy">sqlalchemy branch</a> which is feature complete and ready to be merged ahead of the new Eve release. We’re talking 4K+ lines of code and 44 files changed. Code quality is not under discussion. I know that several companies and individuals have been using that branch in production with good success, even when it still was at its early stages.</p>
<p>This is very exciting as adding SQL support has a good chance to greatly improve the audience of the project. At the same time however, I’m a little bit nervous if not scared, and I have been for a while. Am I ready to deal with the consequences of this supermerge? Inevitably SQLAlchemy tickets will be opened and Stack Overflow questions will be asked. SQL-related pull requests will come in and mailing list posts will flock. To be honest I don’t think I can handle that, let alone allocate more of my free time to the project. Also, I’m not very confident with SQLAlchemy itself so I would not be the best person deal with that code anyway. In the recent past while discussing SQLAlchemy support on the mailing list, I have been <a href="https://groups.google.com/forum/?hl=en#!topic/python-eve/11t1usVH2EY">very clear about my concerns</a>, so much that I probably scared a few people away. What worries me the most, I suspect, is the risk of new code becoming stale one day or another. In time that would probably impact the reputation of the whole project.</p>
<p>To think about it, we already had something similar happen in the past, although for a smaller feature. The <a href="http://python-eve.org/extensions">Document Versioning</a> pull request, contributed by the amazing <a href="https://github.com/joshvillbrandt">Josh Villbrandt</a>, had been daunting me with similar thoughts. New code was going to be be quite intrusive, adding a good deal of complexity to an otherwise relatively simple codebase. Everything went amazingly well though. Josh is still an active contributor. He helps with improving his own feature and, even more importantly, other contributors are now helping with Document Versioning <a href="https://github.com/nicolaiarocci/eve/pull/486">as we speak</a>. Overall, the Eve project as a whole as been enjoying a growing number of skilled contributors and adopters. It’s been a joy to see people commenting on open tickets, offer support on the mailing list and even on Stack Overflow. So that should be encouraging.</p>
<p>So here I sit, with 4K LOCs ready to be merged. What do I do with them? I considered a few options. One is leaving the SQL feature in a separate branch. Another is to ask the team to refactor the whole thing into an external extension (we have <a href="http://python-eve.org/features.html#document-versioning">a few</a> already). By doing any of these Eve-core would remain MongoDB only and I could keep managing it on my own. But then again, none of these options would add native SQL support to Eve. Also, an extension or a branch would run even a greater danger of becoming stale.</p>
<p>At some point I guess even mildly successful projects like Eve have to decide wether they want to outgrow their author. I strongly believe that growing and trusting communities is all that open source is about. You release your work out there and, even at that early stage, you are already entrusting people. You trust that they will take notice and then that they will validate your project (or not). Eventually, someone will review your code, adopt it and, in time, contribute. The project then grows up to a point where its community becomes so predominant that you, as the author and maintainer, just have to let some control go.</p>
<p>So yes, SQL support is coming to Eve, and as a native feature. I trust that the contributors to the SQLAlchemy backend will stay around and, if they won’t, that someone else will stand up and take the torch. I am also confident that the community as a whole will adopt the feature, make it grow and well… we’ll see what happens next.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Feature Overview: The Eve OpLog</title>
      <link>https://nicolaiarocci.com/feature-overview-the-eve-oplog/</link>
      <pubDate>Mon, 06 Oct 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/feature-overview-the-eve-oplog/</guid>
      <description>&lt;p&gt;The operations log or OpLog is a new &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt; feature that I’m currently developing on the &lt;a href=&#34;https://github.com/nicolaiarocci/eve/tree/oplog&#34;&gt;&lt;code&gt;oplog&lt;/code&gt;&lt;/a&gt; experimental branch. It’s supposed to help in addressing a subtle issue that we’ve been dealing with, but I believe it can also emerge as a very useful all-around tool. I am posting about it in the hope of gathering some feedback from Eve contributors and users, so that I can better pinpoint design and implementation before I merge it to the main development branch.&lt;/p&gt;
&lt;h2 id=&#34;what-is-the-oplog&#34;&gt;What is the OpLog?&lt;/h2&gt;
&lt;p&gt;The OpLog is a special resource that keeps a record of operations that modify the data stored by the API. Every &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PATCH&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;DELETE&lt;/code&gt; operation can eventually be recorded by the oplog.&lt;/p&gt;
&lt;p&gt;At its core the oplog is simply a server log, something that’s always been on the Eve roadmap. What makes it a little bit different is its ability to be exposed as a read-only API endpoint. This would in turn allow clients to query it as they would with any other standard endpoint.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The operations log or OpLog is a new <a href="http://python-eve.org">Eve</a> feature that I’m currently developing on the <a href="https://github.com/nicolaiarocci/eve/tree/oplog"><code>oplog</code></a> experimental branch. It’s supposed to help in addressing a subtle issue that we’ve been dealing with, but I believe it can also emerge as a very useful all-around tool. I am posting about it in the hope of gathering some feedback from Eve contributors and users, so that I can better pinpoint design and implementation before I merge it to the main development branch.</p>
<h2 id="what-is-the-oplog">What is the OpLog?</h2>
<p>The OpLog is a special resource that keeps a record of operations that modify the data stored by the API. Every <code>POST</code>, <code>PATCH</code>, <code>PUT</code> and <code>DELETE</code> operation can eventually be recorded by the oplog.</p>
<p>At its core the oplog is simply a server log, something that’s always been on the Eve roadmap. What makes it a little bit different is its ability to be exposed as a read-only API endpoint. This would in turn allow clients to query it as they would with any other standard endpoint.</p>
<p>Every oplog entry contains few important informations about the document</p>
<p>involved with the edit operation:</p>
<ul>
<li>URL of the endpoint hit by the operation.</li>
<li>Kind of operation performed.</li>
<li>Unique ID of the document.</li>
<li>Date when the document was updated.</li>
<li>Date when the document as created.</li>
<li>User token, if <a href="http://python-eve.org/authentication.html#user-restricted-resource-access">User Restricted Resource Access</a> is enabled for the endpoint</li>
</ul>
<p>Like any other API-maintained documents, oplog entries also contain:</p>
<ul>
<li>Unique ID</li>
<li>ETag</li>
<li><a href="http://python-eve.org/features.html#hateoas">HATEOAS</a> meta fields, if enabled.</li>
</ul>
<p>A typical oplog entry would look something like this:</p>
<pre><code>{
    &quot;o&quot;: &quot;DELETE&quot;, 
    &quot;r&quot;: &quot;people&quot;, 
    &quot;i&quot;: &quot;542d118938345b614ea75b3c&quot;,
    &quot;_updated&quot;: &quot;Fri, 03 Oct 2014 08:16:52 GMT&quot;, 
    &quot;_created&quot;: &quot;Fri, 03 Oct 2014 08:16:52 GMT&quot;,
    &quot;_id&quot;: &quot;542e5b7438345b6dadf95ba5&quot;, 
    &quot;_etag&quot;: &quot;e17218fbca41cb0ee6a5a5933fb9ee4f4ca7e5d6&quot;
    &quot;_links&quot;: {...},
}
</code></pre>
<p>To save a little storing space field names have been shortened when possible (what can I say, I’m a MongoDB guy): <code>o</code> stands for operation, <code>r</code> stands for resource, <code>i</code> stands for unique ID and <code>c</code> stands for changes. Other keys are defined by the configuration settings, and their default names are shown here.</p>
<h2 id="how-is-the-oplog-operated">How is the oplog operated?</h2>
<p>Three new settings keywords are available:</p>
<ul>
<li>
<p><code>OPLOG</code></p>
<p>Sets the oplog name and defaults to <code>oplog</code>. This is the name of the collection on the database and also the default url for the oplog endpoint.<!-- raw HTML omitted --></p>
</li>
<li>
<p><code>OPLOG_METHODS</code></p>
<p>A list of HTTP methods for which oplog entries are to be recorded. Defaults to <code>['DELETE']</code>.<!-- raw HTML omitted --></p>
</li>
<li>
<p><code>OPLOG_ENDPOINT</code></p>
<p>Set it to <code>True</code> if an oplog endpoint should be made available by the API. Defaults to <code>False</code>.</p>
</li>
<li>
<p><code>OPLOG_AUDIT</code></p>
<p>If enabled, IP addresses and changes introduced with <code>PATCH</code> and <code>PUT</code> methods are also logged. Defaults to <code>True</code>.</p>
</li>
</ul>
<p>So by default the oplog is stored on a conveniently named <code>oplog</code> collection, it only stores informations about deleted documents.</p>
<p>Since the eventual oplog endpoint is a standard API endpoint, if it is enabled the API maintainer can also fiddle with the endpoint settings as he/she would do with any other Eve endpoint. This allows for setting custom authentication (you probably want this resource to be only accessible for administrative purposes), changing the url, etc. Just add an <code>oplog</code> entry to the <a href="http://python-eve.org/config#domain-configuration">API domain</a>, like so:</p>
<pre><code>'oplog': {
    'url': 'log',
    'auth': my_custom_auth_class,
    'datasource': {'source': 'myapilog'}
}
</code></pre>
<p>Note that while you can change most settings, the endpoint will always be read-only, so setting either <code>resource_methods</code> or <code>item_methods</code> to something else than <code>['GET']</code> will serve no purpose. Also, unless you need to do so, adding an oplog entry to the API domain is not required as it will be added automatically for you.</p>
<h2 id="why-the-oplog">Why the OpLog?</h2>
<p>Clients have always been able to retrieve changes by simply querying an endpoint with a <code>If-Modified-Since</code> request. So why do we need an operations log? Of course because server-side logging is cool, and so is auditing, but it’s not only about that.</p>
<h3 id="single-entry-point-for-all-api-updates">Single entry point for all API updates</h3>
<p>From the client perspective and for most use cases logging inserted, edited and replaced documents is probably a waste of both space and time, and this is the main reason why only <code>DELETE</code> operations are logged by default. However, I believe there are scenarios where remote access to a full activity log can be useful.</p>
<p>Imagine an API which is accessed by multiple apps (say phone, tablet, web and desktop applications) and all of them need to stay in sync with each other and the server. Instead of hitting every single endpoint with a <code>IMS</code> request they could just access the oplog. That’s a single request vs several, and since the oplog itself is a standard API endpoint, they could also perform <code>IMS</code> requests against it for optimal gains:</p>
<blockquote>
<p>Server, please send me all the changes occurred to the API since my last access. Sincerely, Your Client.</p></blockquote>
<p>Again this is not always the best approach a client could take. Sometimes it is probably better to only query for changes when they are really needed, but it seems cool to have both approaches available (and remember, the oplog endpoint is disabled by default).</p>
<h3 id="fixing-304s">Fixing 304s</h3>
<p>And then there are deleted documents which are a completely different beast. With no oplog we would have no way to tell if and when any document has been deleted, let alone inform clients about that. Actually, there is an <a href="https://github.com/nicolaiarocci/eve/issues/334">open ticket</a> precisely about this, and it’s been sitting there for a while.</p>
<p>When a <code>If-Modified-Since</code> request is received, the API is expected to respond with a <code>304 Not Modified</code> status if no changes occurred, so that clients can conveniently fallback to cached data. Up to version 0.4 (the official release at the time of this writing) Eve has been doing exactly that, with one caveat: missing documents were being ignored as, in the contest of the <code>IMS</code> request, there was no way to know about them.</p>
<p>The operations log will allow Eve powered APIs to take deleted documents into account, returning perfectly proper <code>304</code> codes as needed. The impact on performance should be minimal as we will only query the oplog when and if no changes have been detected on the target collection.</p>
<p>This solves only one half of the problem however. What happens when a <code>IMS</code> request comes in and deleted documents are found in the backlog? How do we report them back to the client? Three options come to mind which would address this scenario:</p>
<ol>
<li>
<p>Respond with a <code>200 OK</code> and a the usual “changes since <code>IMS</code> date” payload, which might happen to be empty if only deletions occurred in the time window. The client can then go and query the oplog endpoint with the same <code>IMS</code> date, finally getting the list of deleted documents IDs.</p>
</li>
<li>
<p>Include deleted documents IDs in the standard payload (within the <code>_items</code> list), maybe with a <code>deleted</code> status tag. This status tag is something new though, and for consistency we should probably add it to other objects in the payload.</p>
</li>
<li>
<p>Add support for a new <code>_deleted</code> meta field in resource payloads. When deleted documents are spotted in the backlog the response payload will include them in their own list. Something like this:</p>
</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>First option is so bad I should probably not be listing it at all. It would take two roundtrips to get the whole update down. Also, it would kind of force API maintainers to open the oplog endpoint to their clients.</p>
<p>I’m not convinced #2 would be a good idea either, as objects in the items list would not be homogeneous anymore and we would have to add support for a new meta field anyway (the status tag).</p>
<p>Option #3 on the other hand looks quite good to me. It does not require multiple requests to handle the case of deleted documents on <code>IMS</code> requests, and it is still easy and clean for clients to process. I am going to go with #3 unless feedback is negative and for good reasons, so let your opinion be heard.</p>
<h2 id="closing-concerns">Closing concerns</h2>
<p>I am slightly concerned about the performance impact, not so much on <code>IMS</code> requests but rather on write operations, especially when a complete, all-operations log is being recorded.</p>
<p>In MongoDB world OpLog is probably an ideal candidate for a <a href="http://docs.mongodb.org/manual/core/capped-collections/">capped collection</a>. I’m not entirely convinced about that though, as by its nature a capped collection is bound to lose data over time, which again might lead to inaccurate <code>304</code> handling.</p>
<p>I am not implementing the OpLog at the data layer level however. It is a business layer feature to let other engines take advantage of it. Nothing prevents the MongoDB admin from setting the <code>oplog</code> as a capped collection anyway. Also, keep in mind that like all other resources maintained by the API, indexes are not handled by Eve itself so you will have to do your homework in that field too.</p>
<p>So here you have it. I’m currently done on both configuration and logging parts and will be working on <code>304</code> handling and response payloads in the coming days so that all of this can be included with next version 0.5. Be warned that at the moment the <code>develop</code> branch has no support for <code>IMS</code> requests on resource endpoints. It’s been disabled to avoid providing clients with inaccurate responses (see the ticket above).</p>
<p>If you have any comment or feedback to provide, please let me know in the comments below. I’d really appreciate that.</p>
<p>PS. In case you are wondering yes, the Eve OpLog is heavily inspired by the awesome <a href="http://docs.mongodb.org/manual/core/replica-set-oplog/">MongoDB OpLog</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ordered Dictionaries with Python 2.4-2.6</title>
      <link>https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</link>
      <pubDate>Tue, 16 Sep 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ordered-dictionaries-with-python-2-4-2-6/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://docs.python.org/2/library/collections.html#collections.OrderedDict&#34;&gt;OrderedDict&lt;/a&gt; is a super handy data structure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An OrderedDict is a dict that remembers the order that keys were first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Problem is, this stuff is only available in the standard library since Python 2.7 while &lt;a href=&#34;http://python-eve.org&#34;&gt;my project&lt;/a&gt; also needs to support Python 2.6. Fortunately there’s a back-port available and it is only a pip install away:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# make OrderedDict available on Python 2.6-2.4
$ pip install ordereddict
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&#34;https://pypi.python.org/pypi/ordereddict&#34;&gt;ordereddict&lt;/a&gt; is based on the awesome recipe by &lt;a href=&#34;http://code.activestate.com/recipes/576693&#34;&gt;Raymond Hettinger&lt;/a&gt;, works with Python 2.4-2.6 and, most importantly, is a drop-in replacement for OrderedDict.&lt;/p&gt;
&lt;p&gt;However if you want your code to run seamlessly on all Pythons there’s still some work to be done. First of all you want to make sure that the appropriate OrderedDict is imported, either the standard library version (for Python 2.7 and above) or the back-port release.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://docs.python.org/2/library/collections.html#collections.OrderedDict">OrderedDict</a> is a super handy data structure.</p>
<blockquote>
<p>An OrderedDict is a dict that remembers the order that keys were first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end.</p></blockquote>
<p>Problem is, this stuff is only available in the standard library since Python 2.7 while <a href="http://python-eve.org">my project</a> also needs to support Python 2.6. Fortunately there’s a back-port available and it is only a pip install away:</p>
<pre><code># make OrderedDict available on Python 2.6-2.4
$ pip install ordereddict
</code></pre>
<p><a href="https://pypi.python.org/pypi/ordereddict">ordereddict</a> is based on the awesome recipe by <a href="http://code.activestate.com/recipes/576693">Raymond Hettinger</a>, works with Python 2.4-2.6 and, most importantly, is a drop-in replacement for OrderedDict.</p>
<p>However if you want your code to run seamlessly on all Pythons there’s still some work to be done. First of all you want to make sure that the appropriate OrderedDict is imported, either the standard library version (for Python 2.7 and above) or the back-port release.</p>
<p>This is easily accomplished, and in a very pythonic way:</p>
<pre><code>try:
    # try with the standard library
    from collections import OrderedDict
except ImportError:
    # fallback to Python 2.6-2.4 back-port
    from ordereddict import OrderedDict
</code></pre>
<h2 id="fixing-setuppy">Fixing setup.py</h2>
<p>If you are shipping your code as a package then you also want to make sure that setup.py properly handles the different Python versions. Since setup.py itself is nothing but standard Python module, we can make it more dynamic by applying the same technique above.</p>
<pre><code>#!/usr/bin/env python
from setuptools import setup, find_packages

# your standard required modules
install_requires = [
    'simplejson',
    'cerberus',
    'events',
    ...
]

try:
    from collections import OrderedDict
except ImportError:
    # add backport to list of required modules
    install_requires.append('ordereddict')

setup(
    name='appname',
    version='0.1',
    packages=find_packages(),
    ...
    # no matter which Python, we're now good to go
    install_requires = install_requires,
    ...
)
</code></pre>
<h2 id="handling-requirementstxt">Handling requirements.txt</h2>
<p>When it comes to pip’s requirements.txt, what I think works best is to simply add a <em>diff file</em> which targets old Python versions like so:</p>
<pre><code># py26-requirements.txt
# install from 'canonical' requirements.txt first (DRY)
-r requirements.txt
# add specific Python 2.6 dependencies
ordereddict
</code></pre>
<p>A developer using Python 2.6 would then go with</p>
<pre><code>$ pip install -r py26-requirements.txt
</code></pre>
<p>Whereas someone on a recent Python would simply run</p>
<pre><code>$ pip install -r requirements.txt
</code></pre>
<p>Since py26-requirements.txt explicitly lists Python 2.6 dependencies only and then relies on requirements.txt, most likely you will only need to update the main requirements when/if new dependencies are needed.</p>
<p>You can check out the <a href="https://github.com/nicolaiarocci/eve/commit/ae292f42a6ea92a447b194aaf17d8447b859b0ab">commit</a> where Python 2.6 support for OrderDict has been introduced.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Taming Portable Class Libraries and .NET Framework 4</title>
      <link>https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</link>
      <pubDate>Thu, 28 Aug 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/taming-portable-class-libraries-and-net-framework-4/</guid>
      <description>&lt;p&gt;If your project is a Portable Class Library and you want it to run with the .NET Framework 4 well, you are in for a few surprises. Especially so if you are using InstallShield for building your deployment package. We’ve been going through this a few days ago and it’s been kind of a wild ride. I thought I could pin the whole thing down so that others might enjoy a painless journey through all this mess.&lt;/p&gt;
&lt;h2 id=&#34;portable-class-libraries-and-net-framework-4&#34;&gt;Portable Class Libraries and .NET Framework 4&lt;/h2&gt;
&lt;p&gt;The first thing you should know is that while the .NET Framework 4 does support PCLs, in fact it won’t run them without a patch. For whatever reason, Microsoft decided that PCL compatibility wasn’t a worth a 4.0.4 update. That leaves us with the need to not only make sure that target machines are running the up-to-date .NET4 release (v4.0.3) but also that they’ve been updated with &lt;!-- raw HTML omitted --&gt;KB2468871&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;You might be wondering why this is an issue in the first place. We could simply install the .NET Framework 4.5 which is backward compatible with the .NET4 and includes the afore mentioned KB2468871. Even better, we could just target the .NET 4.5 on our PCL. Problem is that besides iOS, Android, WinPhone and Silverlight we also want our libraries to run seamlessly on as many Windows editions as possible, Windows XP included. Here is the catch: &lt;!-- raw HTML omitted --&gt;.NET4 is the last framework version to run on Windows XP&lt;!-- raw HTML omitted --&gt;. And yes, we got the memo, Microsoft officially abandoned Windows XP a while ago so why bother? Well it turns out that millions of users are still running XP, especially so in the enterprise and SMB. These PCL are targeting exactly that, precisely the accounting software segment, and believe me there’s a huge number of users happily invoicing and accounting on their &lt;em&gt;old-fart-but-still-splendidly-doing-its-job-for-cheap&lt;/em&gt; boxes. Oh and the .NET Framework 3.5 is not an option as it doesn’t support Portable Classes at all.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>If your project is a Portable Class Library and you want it to run with the .NET Framework 4 well, you are in for a few surprises. Especially so if you are using InstallShield for building your deployment package. We’ve been going through this a few days ago and it’s been kind of a wild ride. I thought I could pin the whole thing down so that others might enjoy a painless journey through all this mess.</p>
<h2 id="portable-class-libraries-and-net-framework-4">Portable Class Libraries and .NET Framework 4</h2>
<p>The first thing you should know is that while the .NET Framework 4 does support PCLs, in fact it won’t run them without a patch. For whatever reason, Microsoft decided that PCL compatibility wasn’t a worth a 4.0.4 update. That leaves us with the need to not only make sure that target machines are running the up-to-date .NET4 release (v4.0.3) but also that they’ve been updated with <!-- raw HTML omitted -->KB2468871<!-- raw HTML omitted -->.</p>
<p>You might be wondering why this is an issue in the first place. We could simply install the .NET Framework 4.5 which is backward compatible with the .NET4 and includes the afore mentioned KB2468871. Even better, we could just target the .NET 4.5 on our PCL. Problem is that besides iOS, Android, WinPhone and Silverlight we also want our libraries to run seamlessly on as many Windows editions as possible, Windows XP included. Here is the catch: <!-- raw HTML omitted -->.NET4 is the last framework version to run on Windows XP<!-- raw HTML omitted -->. And yes, we got the memo, Microsoft officially abandoned Windows XP a while ago so why bother? Well it turns out that millions of users are still running XP, especially so in the enterprise and SMB. These PCL are targeting exactly that, precisely the accounting software segment, and believe me there’s a huge number of users happily invoicing and accounting on their <em>old-fart-but-still-splendidly-doing-its-job-for-cheap</em> boxes. Oh and the .NET Framework 3.5 is not an option as it doesn’t support Portable Classes at all.</p>
<p>All things considered, it’s still good news. We can build PCL which run everywhere, Windows XP included. We only need to make sure that both the .NET Framework 4 and the KB2468871 are installed on target machines. Easy enough, right?</p>
<h2 id="the-strange-story-about-kb2468871-installshield-prerequisite">The strange story about KB2468871 InstallShield Prerequisite</h2>
<p>We rely on InstallShield for building our distributions, so I was delighted to find that it comes with a KB2468871 Setup Prerequisite out of the box. All we had to do was add the prerequisite to our setup and we would be done. In fact, our first test was encouraging. We ran the setup on a pristine Windows XP. It installed the .NET Framework 4, then the KB patch and then, finally, our own application which included the PCL libraries. Everything was running smoothly. We then moved on to test the same identical build on a fresh Windows 7 machine. Again, it installed the .NET4 just fine… and then it crashed. Actually, the setup itself did not crash. It was the KB2468871 which was crashing while the main setup itself was left idle, waiting for the KB install to complete. So, what was going on there?</p>
<h3 id="cpu-architecture-does-matter">CPU Architecture Does Matter</h3>
<p>To make a long story short, after a lot of investigation and an embarrassingly high number of tests we found that our setup was only crashing on 64bit editions of Windows. It turned out that the issue was with the InstallShield Prerequisite itself. It was broken. In a bad way.</p>
<p>The KB2468871 comes in three flavors:</p>
<ul>
<li>NDP40-KB2468871-v2-x86.exe</li>
<li>NDP40-KB2468871-v2-IA64.exe</li>
<li>NDP40-KB2468871-v2-x64.exe</li>
</ul>
<p>Three executables, each one targeting a different architecture. Upon inspection of the stock prerequisite however, we discovered that it was launching the x86 executable no matter what the target edition of Windows was. That explained the crashes on x64 systems.</p>
<p>The solution was to create a new custom prerequisite which would download and launch the x64 KB edition on 64bit systems. We then had to update the stock prerequisite too, so that it would only run on x86 systems. So we now had two specialized KB2468871 prerequisites. One for 32 and another for 64 bit systems. They would be launched alternatively depending on the target system. We proceeded to add them both to our InstallShield project and rebuild it. Then we went and tested it against freshly installed Windows. It installed the .NET Framework 4, then totally skipped the KB (like the prerequisite didn’t even exist) and finally proceeded to install both PCL and main application – which of course would crash on execution as there was no KB on the system.</p>
<p>Beaten, but not ready to admit defeat yet, we went back to the drawing board.</p>
<h3 id="execution-order-does-matter-or-not">Execution Order Does Matter. Or Not.</h3>
<p>Our custom launch conditions for both our KB prerequisites were there, and they looked good. Then there was this other conditional triplet. It was validating two registry keys and then making sure that mscorlib.dll existed in .NET4 folder. So, the idea was that the KB installation should only be executed if the .NET4 was on the target system. That sounded perfectly reasonable. As we could configure the order in which prerequisites were executed, we just had to make sure that the .NET4 prerequisite was assigned a higher priority, so it would run before the KB prerequisites themselves. The prerequisites order was fixed, a new setup was built and… nothing changed. KB were still not being installed.</p>
<p>Prerequistes order did not seem to matter. In fact, if we removed that check-if-net4-is-there conditional triplet the KB would install. However that was not an acceptable solution because then the KB would <em>always</em> be installed, causing a reinstall (and a waste of time and resources) on most systems.</p>
<p>Then I had my epiphany. Maybe launch conditions were being evaluated all together at boot time, for all prerequisites, before they were installed and regardless of their execution order? Non-sense you might think (I did). Why allow me to set an execution order in the first place, if launch conditions for each item are not going to be evaluated in <em>that</em> order? Luckily, validating this theory was going to be quick and easy. We just had to reboot the system after the faulty installation was completed, then run the setup again. And guess what? On second run, after the reboot, the KB installation would be executed without a glitch. Bingo. Since the .NET4 had been installed on the previous run, now registry keys were there and the mscorlib.dll was in the right place, so the KB launch conditions were finally met.</p>
<p>We ended up replacing that bogus conditional triplet completely and changing the validation logic. Instead of checking if the .NET4 was installed (on pristine XP and Windows 7 systems, which don’t have the .NET Framework 4 preinstalled, <em>it just could not be there</em> <em>yet</em>), we were now simply checking if KB itself was installed. After all it just needs to be there, no matter the Windows or framework version (on .NET 4.5+ the KB will be installed by default).</p>
<p>So now, armed with our brand new custom KB2468871-x64 prerequisite and a totally re-imaginated set of launch conditions we were finally able to build a setup that would deliver a fully functional Portable Class Library which would run on all possible Windows: XP, Windows 7, Windows 8… independently of the CPU architecture. Victory!</p>
<p>If you read this far you probably noticed that I didn’t include instructions on how to apply these changes to the stock prerequisite, let alone create a new one. You can find those instructions on the InstallShield website, or you can simply use <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a">our modified prerequisites</a>. Of course we are providing them without any guarantee that they will work for you. They did for us, and that’s it.</p>
<h2 id="too-long-didn8217t-read">Too long; didn’t read</h2>
<ol>
<li>Portable Class Libraries won’t run on plain vanilla .NET Framework 4.0 unless KB2468871 is installed;</li>
<li>If using InstallShield KB2468871 Setup Prerequiste you’re in for a wild ride;</li>
<li>However, and until an official fix is released, you can opt to use our modified prerequisites instead.</li>
<li>Get the <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a#file-microsoft-net-framework-4-0-kb2468871-x64-prq">custom KB2468871 (64x) InstallShield prerequisite</a>.</li>
<li>Get the <a href="https://gist.github.com/nicolaiarocci/34f9c167a4ec1adf591a#file-microsoft-net-framework-4-0-kb2468871-prq">custom KB2468871 (x86) prerequisite</a>.</li>
</ol>
<h2 id="conclusion">Conclusion</h2>
<p>The stock KB2468871 InstallShield prerequiste has been out for a good while so I’m baffled that to this day I still cannot find any reference about these issues on the internet. Portable Class Libraries are probably still a niche and the fact that most of Macrovision KB resources are hidden behind a wall does not help. Soon or later an official prerequisite update will be released. Until then, feel free to use our mods.</p>
<p>I’ll just add that if we were dealing with an Open Source project, we’d just open a pull request and be done with it.</p>
<p>If you want to get in touch, I’m <a href="https://twitter.com/nicolaiarocci">@nicolaiarocci</a> on Twitter.</p>]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.4 and Cerberus 0.7 Released</title>
      <link>https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</link>
      <pubDate>Thu, 10 Jul 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-4-cerberus-0-7-released/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Eve 0.4 adds cool features like Document Versioning and Coherence Mode. Cerberus 0.7 allows regex validation amongst other niceties. Make sure to check the &lt;a href=&#34;http://blog.python-eve.org/eve-04-released&#34;&gt;official v0.4 announcement&lt;/a&gt; for all the details.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Eve 0.4 adds cool features like Document Versioning and Coherence Mode. Cerberus 0.7 allows regex validation amongst other niceties. Make sure to check the <a href="http://blog.python-eve.org/eve-04-released">official v0.4 announcement</a> for all the details.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve 0.3 Released</title>
      <link>https://nicolaiarocci.com/eve-0-3-released/</link>
      <pubDate>Fri, 14 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-0-3-released/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://python-eve.org&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;Today we released &lt;a href=&#34;https://pypi.python.org/pypi/Eve&#34;&gt;Eve v0.3&lt;/a&gt;. It includes customizable Files Storage support (on GridFS by default), a lot of fixes, several breaking changes and a lot of love. Head over to relevant &lt;a href=&#34;http://blog.python-eve.org/eve-03-released&#34;&gt;blog post&lt;/a&gt; and/or to &lt;a href=&#34;http://python-eve.org/changelog.html&#34;&gt;changelog&lt;/a&gt; to know more about it.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://python-eve.org"><!-- raw HTML omitted --></a>Today we released <a href="https://pypi.python.org/pypi/Eve">Eve v0.3</a>. It includes customizable Files Storage support (on GridFS by default), a lot of fixes, several breaking changes and a lot of love. Head over to relevant <a href="http://blog.python-eve.org/eve-03-released">blog post</a> and/or to <a href="http://python-eve.org/changelog.html">changelog</a> to know more about it.</p>
]]></content:encoded>
    </item>
    <item>
      <title>REST APIs for Humans at FOSDEM</title>
      <link>https://nicolaiarocci.com/rest-apis-humans-fosdem/</link>
      <pubDate>Mon, 03 Feb 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/rest-apis-humans-fosdem/</guid>
      <description>&lt;p&gt;Yesterday I gave a talk at FOSDEM 2014 in Brussels. The conference itself was amazing, with over 5000 attendees literally swarming and taking over the ULB Campus. I was stoked at how smoothly everything was going on despite the incredible number of simultaneous sessions and the number of attendees continuously flowing between buildings and conference rooms. Everybody involved, volunteers and attendees,  has been very welcoming, charming and helpful. In short, I had a blast.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Yesterday I gave a talk at FOSDEM 2014 in Brussels. The conference itself was amazing, with over 5000 attendees literally swarming and taking over the ULB Campus. I was stoked at how smoothly everything was going on despite the incredible number of simultaneous sessions and the number of attendees continuously flowing between buildings and conference rooms. Everybody involved, volunteers and attendees,  has been very welcoming, charming and helpful. In short, I had a blast.</p>
<p>My <a href="https://speakerdeck.com/nicola/eve-rest-api-for-humans">REST APIs for Humans™</a> talk was given in a fully packed Python DevRoom, which granted a lot of smart questions both in the final QA session and later during the day. Thanks everybody for the great feedback!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Giving back to my community</title>
      <link>https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</link>
      <pubDate>Sat, 11 Jan 2014 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/giving-back-to-my-community-with-coderdojo-ravenna/</guid>
      <description>&lt;p&gt;A few days ago I tweeted:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Now the project is &lt;a href=&#34;http://coderdojoravenna.it/&#34;&gt;out in the wild&lt;/a&gt; and I’m very excited about it. It’s all italian yes, but do know that CoderDojo is a &lt;a href=&#34;http://coderdojo.com&#34;&gt;global movement&lt;/a&gt;, and starting a kids coding club in your own town would probably be great idea.&lt;/p&gt;
&lt;p&gt;Come meet me &lt;a href=&#34;http://coderdojoravenna.it/coderdojo-al-workshop-di-agenda-digitale-sul-digital-divide/&#34;&gt;next week&lt;/a&gt;. I will be giving a short talk about CoderDojo Ravenna and, most importantly, we’ll have a good pizza afterwards. Oh, and we’re &lt;a href=&#34;http://coderdojoravenna.it/collabora/&#34;&gt;looking for mentors&lt;/a&gt; to join us.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A few days ago I tweeted:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Now the project is <a href="http://coderdojoravenna.it/">out in the wild</a> and I’m very excited about it. It’s all italian yes, but do know that CoderDojo is a <a href="http://coderdojo.com">global movement</a>, and starting a kids coding club in your own town would probably be great idea.</p>
<p>Come meet me <a href="http://coderdojoravenna.it/coderdojo-al-workshop-di-agenda-digitale-sul-digital-divide/">next week</a>. I will be giving a short talk about CoderDojo Ravenna and, most importantly, we’ll have a good pizza afterwards. Oh, and we’re <a href="http://coderdojoravenna.it/collabora/">looking for mentors</a> to join us.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.5 is out (and it breaks stuff)</title>
      <link>https://nicolaiarocci.com/cerberus-0-5-is-out-and-it-breaks-stuff/</link>
      <pubDate>Tue, 10 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-5-is-out-and-it-breaks-stuff/</guid>
      <description>&lt;p&gt;The new release changes the way validation errors are reported. Please note that these changes will also affect future releases of &lt;a href=&#34;http://python-eve.org&#34;&gt;Eve&lt;/a&gt;, the Python REST API Framework.&lt;/p&gt;
&lt;p&gt;What we had before was basically a list of human-readable errors. Each item in the list, while perfectly fine for human reading, wasn&amp;rsquo;t really ideal for algorithmic parsing. Why would you want to parse the errors with an algorithm? A common case would be when your client is using business objects to represent API resources (think a client-side ORM), and would have a hard time binding validation errors to the objects themselves.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The new release changes the way validation errors are reported. Please note that these changes will also affect future releases of <a href="http://python-eve.org">Eve</a>, the Python REST API Framework.</p>
<p>What we had before was basically a list of human-readable errors. Each item in the list, while perfectly fine for human reading, wasn&rsquo;t really ideal for algorithmic parsing. Why would you want to parse the errors with an algorithm? A common case would be when your client is using business objects to represent API resources (think a client-side ORM), and would have a hard time binding validation errors to the objects themselves.</p>
<p>So for example, previously we had:</p>
<pre><code>[
    &quot;min value for field age is 10&quot;,
    &quot;value of field name must be of string type&quot;
]
</code></pre>
<p>With Cerberus 0.5+ we now have:</p>
<p>{
age: min value is 10,
name: must be of string type
}</p>
<p>Let&rsquo;s look at more complex structures, like lists. Imagine we have a schema defined like this:</p>
<pre><code>schema = {
    'list_of_values': {
        'type': 'list',
        'items': [{'type': 'string'}, {'type': 'integer'}]
    }
}
</code></pre>
<p>And this is the document we want to validate against it:</p>
<pre><code>document = {
    'a_list_of_values': ['a string', 'not an integer']
}
</code></pre>
<p>Validation will of course fail and, given the new dictionary format, inspecting the errors property will return the following:</p>
<pre><code>&gt;&gt;&gt; v = Validator(document, schema)
False

&gt;&gt;&gt; v.errors
{1: 'must be of integer type'}
</code></pre>
<p>Let&rsquo;s look at a document that contains a list of dictionaries instead:</p>
<pre><code>document = {
    rows: [
        {'sku': 1, 'price': 100},
        {'sku': 'hello', 'price': '1'}
    ]
}
</code></pre>
<p>Validation errors will be reported like this:</p>
<pre><code>{
    rows: {
        0: {
            'sku': 'must be of string type',
            'price': 'must be of integer type'
        },
        1: {
            'price': 'must be of integer type'
        }
    }

}
</code></pre>
<p>By contrasts, on top of my memory, any previous Cerberus release would report:</p>
<pre><code>[
    &quot;rows[0]&quot;: 'field &quot;sku&quot; in must be of string type',
    &quot;rows[0]&quot;: 'field &quot;price&quot; in must be of integer type',
    &quot;rows[1]&quot;: 'field &quot;price&quot; in must be of integer type'
]
</code></pre>
<p>As you can easily see, the old implementation was forcing the client to properly parse the list in order to retrieve line number, offending field and the actual error. Overall Im fairly confident that this is an important step forward. Checkout the <a href="http://cerberus.readthedocs.org/en/latest/">documentation</a>, which has been updated to reflect the changes.</p>
<p>Get <a href="https://crate.io/packages/Cerberus/">Cerberus 0.5</a> while its hot.</p>]]></content:encoded>
    </item>
    <item>
      <title>On Why I Still Prefer Traditional Books to eBooks</title>
      <link>https://nicolaiarocci.com/on-why-i-still-prefer-traditional-books-to-ebooks/</link>
      <pubDate>Mon, 02 Dec 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/on-why-i-still-prefer-traditional-books-to-ebooks/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been using a Kindle for a long time now, and I love it. But I keep buying paper books. Lots of them. Actually I buy a &lt;em&gt;lot&lt;/em&gt; more books than ebooks and it doesn&amp;rsquo;t even stop there. Admittedly, I am guilty of repeatedly buying paper editions of ebooks I&amp;rsquo;ve read on the Kindle.&lt;/p&gt;
&lt;p&gt;For a very long time I&amp;rsquo;ve not been able to tell the precise reason why I keep going back to traditional books. It&amp;rsquo;s not about the reading experience or the sexiness of turning physical pages. Well of course that matters too, as I&amp;rsquo;ve always been kind of a book fetishist, but since the very beginning of my love-hate relationship with the Kindle I&amp;rsquo;ve always known there had to be something else, and I couldn&amp;rsquo;t pin it down.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I&rsquo;ve been using a Kindle for a long time now, and I love it. But I keep buying paper books. Lots of them. Actually I buy a <em>lot</em> more books than ebooks and it doesn&rsquo;t even stop there. Admittedly, I am guilty of repeatedly buying paper editions of ebooks I&rsquo;ve read on the Kindle.</p>
<p>For a very long time I&rsquo;ve not been able to tell the precise reason why I keep going back to traditional books. It&rsquo;s not about the reading experience or the sexiness of turning physical pages. Well of course that matters too, as I&rsquo;ve always been kind of a book fetishist, but since the very beginning of my love-hate relationship with the Kindle I&rsquo;ve always known there had to be something else, and I couldn&rsquo;t pin it down.</p>
<p>Then yesterday it finally struck me. I was visiting the awesome <a href="http://www.turismo.ra.it/eng/Events/Events-and-initiatives/Exhibitions/Silent-books.-Destination_-Lampedusa">Silent Books</a> exhibition with the kids, and there was this <a href="http://www.suzyleebooks.com/">Suzy Lee</a> quote pinned on the wall, and I couldn&rsquo;t stop reading it over and over.</p>
<blockquote>
<p>In turning the pages of a book,</p></blockquote>
<blockquote>
<p>a little world opens and closes,</p></blockquote>
<blockquote>
<p>enclosed in a frame.</p></blockquote>
<blockquote>
<p>Story ends, the book closes.</p></blockquote>
<blockquote>
<p>The world closes too.</p></blockquote>
<blockquote>
<p>Then it&rsquo;s quickly placed on a shelf.</p></blockquote>
<blockquote>
<p>Art can be placed on a shelf.</p></blockquote>
<blockquote>
<p>Shelf-sized art.</p></blockquote>
<blockquote>
<p>Isn&rsquo;t that beautiful? (*)</p></blockquote>
<p>So yes, it&rsquo;s about the shelves. It&rsquo;s about surrounding myself with those little worlds I&rsquo;ve been exploring. I suddenly realized that several times every day, while I&rsquo;m furiously coding or when I&rsquo;m just walking around the house or heck, even while I&rsquo;m reading a book, each day my eyes like to indulge on those shelves, the vivid memories of my reading experiences. That&rsquo;s something the files stored on my precious little Kindle can&rsquo;t offer me.</p>
<p>That also explains why I only tend to buy what I call &rsquo;throw away&rsquo; books on the Kindle. These aren&rsquo;t necessarily bad books (or I wouldn&rsquo;t buy them in the first place). They are mostly leisure readings, you know, thrillers and the like: something that&rsquo;s entertaining to read but it isn&rsquo;t likely to leave me with a long lasting memory, or emotion.</p>
<p>(*) turns out the Border Trilogy, Suzy Lee&rsquo;s book from which the quote__ is taken, has not been published in english, which is a shame. This is a (probably poor) translation of mine_.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB and REST API go for a picnic (video and slides)</title>
      <link>https://nicolaiarocci.com/mongodb-rest-api-go-picnic-video-slides/</link>
      <pubDate>Tue, 19 Nov 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-rest-api-go-picnic-video-slides/</guid>
      <description>&lt;p&gt;I had the opportunity to give my &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;RESTful WeB APIs and MongoDB Go For A Picnic&lt;/a&gt; talk at both &lt;a href=&#34;http://www.mongotorino.org/&#34;&gt;MongoTorino&lt;/a&gt; and &lt;a href=&#34;http://2013.nosqlday.it/&#34;&gt;NoSQL Day&lt;/a&gt;. The folks at PUG Friuli where so nice to record all the NoSQL Day sessions, so here you have it: the full length &lt;a href=&#34;http://vimeo.com/79662146&#34;&gt;video of yours truly speaking&lt;/a&gt; to a fully packed room crowded with 120 very attentive attendees.&lt;/p&gt;
&lt;p&gt;Unfortunately audio is horrible and while all MongoTorino talks were in english, NoSQL Day was an italian-only event. The slide deck is in english however, and is available on both &lt;a href=&#34;https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic&#34;&gt;SpeakerDeck&lt;/a&gt; and &lt;a href=&#34;http://www.slideshare.net/nicolaiarocci/rest-web-api-with-mongodb&#34;&gt;SlideShare&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I had the opportunity to give my <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">RESTful WeB APIs and MongoDB Go For A Picnic</a> talk at both <a href="http://www.mongotorino.org/">MongoTorino</a> and <a href="http://2013.nosqlday.it/">NoSQL Day</a>. The folks at PUG Friuli where so nice to record all the NoSQL Day sessions, so here you have it: the full length <a href="http://vimeo.com/79662146">video of yours truly speaking</a> to a fully packed room crowded with 120 very attentive attendees.</p>
<p>Unfortunately audio is horrible and while all MongoTorino talks were in english, NoSQL Day was an italian-only event. The slide deck is in english however, and is available on both <a href="https://speakerdeck.com/nicola/restful-web-api-and-mongodb-go-for-a-pic-nic">SpeakerDeck</a> and <a href="http://www.slideshare.net/nicolaiarocci/rest-web-api-with-mongodb">SlideShare</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My interview on being a MongoDB Master</title>
      <link>https://nicolaiarocci.com/my-interview-on-being-a-mongodb-master/</link>
      <pubDate>Wed, 04 Sep 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/my-interview-on-being-a-mongodb-master/</guid>
      <description>&lt;p&gt;So I’ve been interviewed by Laura Czajkowski on my experience and role as a MongoDB Master. The interview actually covers more angles than that and I guess that, if you &lt;em&gt;really&lt;/em&gt; don’t have anything better to do, you might even want to check it out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;How did you get involved in open source?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’ve been an avid developer delivering desktop applications in the .NET/MSSQL closed source ecosystem for so many years that open source wasn’t even on my radar.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>So I’ve been interviewed by Laura Czajkowski on my experience and role as a MongoDB Master. The interview actually covers more angles than that and I guess that, if you <em>really</em> don’t have anything better to do, you might even want to check it out.</p>
<blockquote>
<p><strong>How did you get involved in open source?</strong></p>
<p>I’ve been an avid developer delivering desktop applications in the .NET/MSSQL closed source ecosystem for so many years that open source wasn’t even on my radar.</p>
<p>Then a few years ago, like everybody else, we found that we needed to get involved with the mobile world. That’s when I thought that it was time to finally to get out of my comfort zone and start looking out of my walled garden. In fact, while historically there always have been little alternative to the Microsoft/.NET/SQL ecosystem for building business Windows applications, now we were about to address a completely different beast.</p>
<p>First step in any mobile strategy is building a proper web infrastructure, like one or more web APIs, remote servers, etc. While .NET was well suited for the task, I knew that there were other valid, robust and mature alternatives out there and that I had to learn more about them before picking any choice.</p>
<p>My involvement with open source, the whole Python language, MongoDB and the NoSQL movement is the direct consequence of that learning process.</p></blockquote>
<p><!-- raw HTML omitted -->Meeting the EMEA MongoDB Masters – Nicola Iarocci<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve with Python 3.3 Support</title>
      <link>https://nicolaiarocci.com/eve-with-python-3-3-support/</link>
      <pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-with-python-3-3-support/</guid>
      <description>&lt;p&gt;Another Eve release is out and I’m particularly proud about it since it brings full Python 3.3 support (among other things). Check out the relevant blog post: &lt;a href=&#34;http://blog.python-eve.org/v009-with-python-33-support&#34;&gt;Eve 0.0.9 is out!&lt;/a&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Another Eve release is out and I’m particularly proud about it since it brings full Python 3.3 support (among other things). Check out the relevant blog post: <a href="http://blog.python-eve.org/v009-with-python-33-support">Eve 0.0.9 is out!</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>The Future of Programming</title>
      <link>https://nicolaiarocci.com/the-future-of-programming/</link>
      <pubDate>Wed, 31 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/the-future-of-programming/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://vimeo.com/worrydream&#34;&gt;Bret Victor&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://vimeo.com/worrydream">Bret Victor</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Excuses for Lazy Coders</title>
      <link>https://nicolaiarocci.com/excuses-for-lazy-coders/</link>
      <pubDate>Tue, 30 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/excuses-for-lazy-coders/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Did you check for a virus on your system?&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;You must have the wrong version.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s a third party application issue.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;That code was written by the last guy.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Programming Excuses&lt;!-- raw HTML omitted --&gt;. We’ve all been there.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Did you check for a virus on your system?</p></blockquote>
<blockquote>
<p>You must have the wrong version.</p></blockquote>
<blockquote>
<p>It’s a third party application issue.</p></blockquote>
<blockquote>
<p>That code was written by the last guy.</p></blockquote>
<p><!-- raw HTML omitted -->Programming Excuses<!-- raw HTML omitted -->. We’ve all been there.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Free Robust Email Validation API</title>
      <link>https://nicolaiarocci.com/free-email-validation-api/</link>
      <pubDate>Mon, 29 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/free-email-validation-api/</guid>
      <description>&lt;p&gt;The guys at Mailgun are taking a &lt;!-- raw HTML omitted --&gt;very interesting approach&lt;!-- raw HTML omitted --&gt; at the ever-lasting problem of proper Email validation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Given an arbitrary address this service validates address based off syntax checks (RFC defined grammar), DNS validation, spell checks, and if available, Email ServiceProvider (ESP) specific local-part grammar.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;They’re relying on &lt;!-- raw HTML omitted --&gt;formal grammar&lt;!-- raw HTML omitted --&gt; and not on regex like the rest of us, which is perhaps the more intriguing aspect of the project. Being Email Service Providers themselves they have good knowledge of most ESPs local-part grammars (the left side of the @ symbol) so when there is a match, they’re validating local-parts too.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>The guys at Mailgun are taking a <!-- raw HTML omitted -->very interesting approach<!-- raw HTML omitted --> at the ever-lasting problem of proper Email validation:</p>
<blockquote>
<p>Given an arbitrary address this service validates address based off syntax checks (RFC defined grammar), DNS validation, spell checks, and if available, Email ServiceProvider (ESP) specific local-part grammar.</p></blockquote>
<p>They’re relying on <!-- raw HTML omitted -->formal grammar<!-- raw HTML omitted --> and not on regex like the rest of us, which is perhaps the more intriguing aspect of the project. Being Email Service Providers themselves they have good knowledge of most ESPs local-part grammars (the left side of the @ symbol) so when there is a match, they’re validating local-parts too.</p>
<p>At the cost of a slight delay DNS, MX and A record validation adds robustness to the process (didn’t really perceive any slowness during my tests). What really shines however, at least in my eyes, is the included “correct address suggestion service”.</p>
<p>At the moment they are providing a <!-- raw HTML omitted -->free API<!-- raw HTML omitted -->  and a <!-- raw HTML omitted -->mail address validation page<!-- raw HTML omitted -->. Here’s the catch: consuming the API requires a free Mailgun account. According to their own statement however they are also going to <a href="http://blog.mailgun.com/post/free-email-validation-api-for-web-forms/#comment-977817227">open source the tool</a> and yes, it’s going to be in Python.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Eve v0.0.8 has been released</title>
      <link>https://nicolaiarocci.com/eve-v0-0-8-has-been-released/</link>
      <pubDate>Thu, 25 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eve-v0-0-8-has-been-released/</guid>
      <description>&lt;p&gt;Most significant features are probably the native support for MongoDB write concern settings, new event hooks allowing for transformation of documents before they are sent to clients, increased handling of both pagination and CORS, and the native validation of float data types.&lt;/p&gt;
&lt;p&gt;Get it on &lt;!-- raw HTML omitted --&gt;PyPI&lt;!-- raw HTML omitted --&gt;, go straight to the &lt;!-- raw HTML omitted --&gt;source code&lt;!-- raw HTML omitted --&gt; or more likely, visit the &lt;!-- raw HTML omitted --&gt;project homepage&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Most significant features are probably the native support for MongoDB write concern settings, new event hooks allowing for transformation of documents before they are sent to clients, increased handling of both pagination and CORS, and the native validation of float data types.</p>
<p>Get it on <!-- raw HTML omitted -->PyPI<!-- raw HTML omitted -->, go straight to the <!-- raw HTML omitted -->source code<!-- raw HTML omitted --> or more likely, visit the <!-- raw HTML omitted -->project homepage<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ORM is an anti-pattern</title>
      <link>https://nicolaiarocci.com/orm-is-an-anti-pattern/</link>
      <pubDate>Wed, 24 Jul 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/orm-is-an-anti-pattern/</guid>
      <description>&lt;p&gt;In &lt;!-- raw HTML omitted --&gt;ORM is an anti-pattern&lt;!-- raw HTML omitted --&gt; Laurie Voss concentrates everything I’ve been saying on the ORM plague in all these years.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your project really does not need any relational data features, then ORM will work perfectly for you, but then you have a different problem: you’re using the wrong datastore. The overhead of a relational datastore is enormous; this is a large part of why NoSQL data stores are so much faster. If your data is relational, however, that overhead is worth it: your database does not merely &lt;em&gt;store&lt;/em&gt; your data, it &lt;strong&gt;represents&lt;/strong&gt; your data and can answer questions about it on the basis of the relations captured, far more efficiently than you could in procedural code.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In <!-- raw HTML omitted -->ORM is an anti-pattern<!-- raw HTML omitted --> Laurie Voss concentrates everything I’ve been saying on the ORM plague in all these years.</p>
<blockquote>
<p>If your project really does not need any relational data features, then ORM will work perfectly for you, but then you have a different problem: you’re using the wrong datastore. The overhead of a relational datastore is enormous; this is a large part of why NoSQL data stores are so much faster. If your data is relational, however, that overhead is worth it: your database does not merely <em>store</em> your data, it <strong>represents</strong> your data and can answer questions about it on the basis of the relations captured, far more efficiently than you could in procedural code.</p></blockquote>
<p>I don’t really know how this article managed to elude my usually long-reaching radar for such a long time.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB Masters Summit 2013</title>
      <link>https://nicolaiarocci.com/mongodb-masters-summit-2013/</link>
      <pubDate>Tue, 25 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-masters-summit-2013/</guid>
      <description>&lt;p&gt;I’m just back from the &lt;!-- raw HTML omitted --&gt;MongoDB Masters&lt;!-- raw HTML omitted --&gt; Summit hosted by 10Gen in New York City. In just a couple days I was given the opportunity to meet and share knowledge (and fun!) with amazingly talented minds coming from all over the world. I’m back with literally dozen new ideas opportunities and concepts, on which I’ll need to elaborate a little bit. While I cannot comment on the many things the smart minds at 10Gen are working on, rest assured that the future of MongoDB is looking great and brighter than ever.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I’m just back from the <!-- raw HTML omitted -->MongoDB Masters<!-- raw HTML omitted --> Summit hosted by 10Gen in New York City. In just a couple days I was given the opportunity to meet and share knowledge (and fun!) with amazingly talented minds coming from all over the world. I’m back with literally dozen new ideas opportunities and concepts, on which I’ll need to elaborate a little bit. While I cannot comment on the many things the smart minds at 10Gen are working on, rest assured that the future of MongoDB is looking great and brighter than ever.</p>
]]></content:encoded>
    </item>
    <item>
      <title>MongoDB User Group a Cesena</title>
      <link>https://nicolaiarocci.com/mongodb-user-group/</link>
      <pubDate>Mon, 03 Jun 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mongodb-user-group/</guid>
      <description>&lt;p&gt;Domani sarò al primo meeting romagnolo del #MUG MongoDB User Group organizzato da 10Gen (azienda dietro a MongoDB), Byte-Code e Ideato.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Parlerò di MongoDB usato come backend per una REST WEB API. &lt;!-- raw HTML omitted --&gt;L’evento si svolgerà in serata a Cesena, è gratuito, e ci sono ancora &lt;a href=&#34;http://www.eventbrite.com/event/6297117849&#34;&gt;posti disponibili&lt;/a&gt;. Se ci siete passate a salutarmi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Domani sarò al primo meeting romagnolo del #MUG MongoDB User Group organizzato da 10Gen (azienda dietro a MongoDB), Byte-Code e Ideato.</p>
<p><!-- raw HTML omitted -->Parlerò di MongoDB usato come backend per una REST WEB API. <!-- raw HTML omitted -->L’evento si svolgerà in serata a Cesena, è gratuito, e ci sono ancora <a href="http://www.eventbrite.com/event/6297117849">posti disponibili</a>. Se ci siete passate a salutarmi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Champion Pythonista</title>
      <link>https://nicolaiarocci.com/champion-pythonista/</link>
      <pubDate>Tue, 21 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/champion-pythonista/</guid>
      <description>&lt;p&gt;La &lt;!-- raw HTML omitted --&gt;Open Source Report Card&lt;!-- raw HTML omitted --&gt; è un’iniziativa divertente. E’ difficile resistere al richiamo dell’ego… soprattutto quand’è smisurato.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nicola is a champion Pythonista (one of the top 11% most active Python users) who loves pushing code. Nicola is a nine-to-fiver who seems to work best in the mid-afternoon.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>La <!-- raw HTML omitted -->Open Source Report Card<!-- raw HTML omitted --> è un’iniziativa divertente. E’ difficile resistere al richiamo dell’ego… soprattutto quand’è smisurato.</p>
<blockquote>
<p>Nicola is a champion Pythonista (one of the top 11% most active Python users) who loves pushing code. Nicola is a nine-to-fiver who seems to work best in the mid-afternoon.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Sito ufficiale e blog per il progetto Eve</title>
      <link>https://nicolaiarocci.com/sito-ufficiale-e-blog-per-il-progetto-eve/</link>
      <pubDate>Tue, 14 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sito-ufficiale-e-blog-per-il-progetto-eve/</guid>
      <description>&lt;p&gt;E’ passato qualche mese da quando ho &lt;a href=&#34;http://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/&#34; title=&#34;Annuncio di Eve&#34;&gt;annunciato&lt;/a&gt; Eve, il REST API framework open source. Nel frattempo il progetto è cresciuto bene: siamo appena giunti alla &lt;a href=&#34;http://blog.python-eve.org/eve-006-released&#34; title=&#34;Eve 0.0.6&#34;&gt;versione 0.0.6&lt;/a&gt;, abbiamo un &lt;a href=&#34;http://python-eve.org&#34; title=&#34;Eve REST API homepage&#34;&gt;sito ufficiale&lt;/a&gt;, un &lt;a href=&#34;http://blog.python-eve.org&#34; title=&#34;Eve News&#34;&gt;blog&lt;/a&gt;, e stiamo lavorando a nuove feature &lt;a href=&#34;http://blog.python-eve.org/sqlalchemy-and-eve&#34; title=&#34;SqlAlchemy and Eve&#34;&gt;davvero interessanti&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E’ passato qualche mese da quando ho <a href="http://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/" title="Annuncio di Eve">annunciato</a> Eve, il REST API framework open source. Nel frattempo il progetto è cresciuto bene: siamo appena giunti alla <a href="http://blog.python-eve.org/eve-006-released" title="Eve 0.0.6">versione 0.0.6</a>, abbiamo un <a href="http://python-eve.org" title="Eve REST API homepage">sito ufficiale</a>, un <a href="http://blog.python-eve.org" title="Eve News">blog</a>, e stiamo lavorando a nuove feature <a href="http://blog.python-eve.org/sqlalchemy-and-eve" title="SqlAlchemy and Eve">davvero interessanti</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hacking Italia</title>
      <link>https://nicolaiarocci.com/hacking-italia/</link>
      <pubDate>Tue, 07 May 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/hacking-italia/</guid>
      <description>&lt;p&gt;Aderisco con entusiasmo all’iniziativa di Salvatore.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&#34;http://hackingitalia.com&#34; title=&#34;Hacking Italia&#34;&gt;Hacking Italia&lt;/a&gt; e’ un sito di “social news”, molto simile ad Hacker News, il celebre collettore di news per hacker di YCombinator. A che serve un sito italiano, e in italiano se c’e’ gia’ molto di piu’ e di meglio nel panorama internazionale? A mettere assieme una massa critica di persone “giuste” in Italia.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Vi consiglio di aggiungere HI ai vostri bookmark. Per quanto mi riguarda conto di essere molto attivo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Aderisco con entusiasmo all’iniziativa di Salvatore.</p>
<blockquote>
<p><a href="http://hackingitalia.com" title="Hacking Italia">Hacking Italia</a> e’ un sito di “social news”, molto simile ad Hacker News, il celebre collettore di news per hacker di YCombinator. A che serve un sito italiano, e in italiano se c’e’ gia’ molto di piu’ e di meglio nel panorama internazionale? A mettere assieme una massa critica di persone “giuste” in Italia.</p></blockquote>
<p>Vi consiglio di aggiungere HI ai vostri bookmark. Per quanto mi riguarda conto di essere molto attivo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Quali sono i font migliori per scrivere codice?</title>
      <link>https://nicolaiarocci.com/quali-sono-i-font-migliori-per-scrivere-codice/</link>
      <pubDate>Tue, 30 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/quali-sono-i-font-migliori-per-scrivere-codice/</guid>
      <description>&lt;p&gt;Malgrado la giovane età Source Code Pro di Adobe domina incontrastato, col più classico Consolas come sua regina. Inconsolata-g e Monaco seguono a distanza mentre il mio preferito, Menlo, è tristemente indietro: &lt;!-- raw HTML omitted --&gt;What Are the Best Programming Fonts?&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Malgrado la giovane età Source Code Pro di Adobe domina incontrastato, col più classico Consolas come sua regina. Inconsolata-g e Monaco seguono a distanza mentre il mio preferito, Menlo, è tristemente indietro: <!-- raw HTML omitted -->What Are the Best Programming Fonts?<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Multi-threading in Python</title>
      <link>https://nicolaiarocci.com/multi-threading-in-python/</link>
      <pubDate>Tue, 23 Apr 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/multi-threading-in-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Multithreaded Python Tutorial with the “Threadworms” Demo&lt;!-- raw HTML omitted --&gt; è un’ottima guida introduttiva ai &lt;!-- raw HTML omitted --&gt;thread&lt;!-- raw HTML omitted --&gt; ed alla programmazione multithread in Python. Dalla teoria alla pratica, in pochi minuti si arriva a creare una variante multithread di &lt;!-- raw HTML omitted --&gt;Snake.&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Multithreaded Python Tutorial with the “Threadworms” Demo<!-- raw HTML omitted --> è un’ottima guida introduttiva ai <!-- raw HTML omitted -->thread<!-- raw HTML omitted --> ed alla programmazione multithread in Python. Dalla teoria alla pratica, in pochi minuti si arriva a creare una variante multithread di <!-- raw HTML omitted -->Snake.<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Gestione degli Eventi in Python</title>
      <link>https://nicolaiarocci.com/gestione-degli-eventi-in-python/</link>
      <pubDate>Thu, 14 Mar 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/gestione-degli-eventi-in-python/</guid>
      <description>&lt;p&gt;Gli eventi sono molto usati nelle GUI e nelle implementazioni del modello MVC (Model, View, Controller). Un’altra applicazione tipica è nei protocolli di comunicazione, laddove layer di basso livello devono informare quelli più alti quando ci sono dati in ingresso o in uscita.&lt;/p&gt;
&lt;p&gt;Il linguaggio C# dispone da sempre di una soluzione elegante al problema della gestione degli eventi: il delegato EventHandler. &lt;a href=&#34;https://github.com/nicolaiarocci/events&#34; title=&#34;Events: Bringing the elegance of C# EventHandler to Python&#34;&gt;Events&lt;/a&gt; è una mia implementazione Python del EventHandler C#. In pratica si tratta di una classe molto leggera che incapsula il cuore del meccanismo di sottoscrizione e gestione degli eventi, e tenta di farlo in maniera “naturale”, sembrando parte integrante del linguaggio Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Gli eventi sono molto usati nelle GUI e nelle implementazioni del modello MVC (Model, View, Controller). Un’altra applicazione tipica è nei protocolli di comunicazione, laddove layer di basso livello devono informare quelli più alti quando ci sono dati in ingresso o in uscita.</p>
<p>Il linguaggio C# dispone da sempre di una soluzione elegante al problema della gestione degli eventi: il delegato EventHandler. <a href="https://github.com/nicolaiarocci/events" title="Events: Bringing the elegance of C# EventHandler to Python">Events</a> è una mia implementazione Python del EventHandler C#. In pratica si tratta di una classe molto leggera che incapsula il cuore del meccanismo di sottoscrizione e gestione degli eventi, e tenta di farlo in maniera “naturale”, sembrando parte integrante del linguaggio Python.</p>
<h2 id="come-usare-events">Come usare Events</h2>
<p>Tecnicamente un evento è qualcosa a cui è possibile “attaccare” una o più funzioni di callback. Prima di tutto creiamo una funzione di callback che verrà invocata allo scatenarsi dell’evento a cui siamo interessati:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Poi ‘iscriviamo’ la nostra funzione all’evento:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Notate come l’evento sia al tempo stesso dichiarato e sottoscritto, in un’unico passaggio. Più funzioni possono sottoscrivere lo stesso evento. Quando si scatena un evento tutte le funzioni ad esso collegate vengono invocate in sequenza. Per scatenare l’evento ci basta eseguire una chiamata all’evento stesso:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="un-esempio-di-modello-model-view-controller">Un esempio di modello Model-View-Controller</h2>
<p>In genere nell’implementazione di uno schema MVC l’istanza della classe Events farà parte di un Modello, come in questo esempio:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Oggetti View e Controller ne sono i tipici  sottoscrittori:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ inoltre possibile vincolare il nome degli eventi e fare l’introspezione delle sole due classi che costituiscono Events. La <a href="http://events.readthedocs.org/" title="Events">documentazione</a> include gli esempi e le istruzioni per l’installazione; il <a href="https://github.com/nicolaiarocci/events" title="Events on GitHub">codice sorgente</a> è a disposizione su GitHub. Buon divertimento!</p>]]></content:encoded>
    </item>
    <item>
      <title>Le profonde intuizioni di Alan Kay</title>
      <link>https://nicolaiarocci.com/le-profonde-intuizioni-di-alan-kay/</link>
      <pubDate>Thu, 28 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/le-profonde-intuizioni-di-alan-kay/</guid>
      <description>&lt;p&gt;Durante una conferenza di qualche tempo fa lo speaker, rivolto a una sala gremita di programmatori e informatici, chiese quanti conoscevano Alan Kay. Con suo (e mio) grande stupore pochissimi alzarono le mani.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;The Deep Insights of Alan Kay&lt;!-- raw HTML omitted --&gt;  è un tributo da non perdere a questo vero gigante dell’informatica, tra l’altro impreziosito da una selezione di link ad alcuni dei suoi interventi più importanti, spesso tenuti in occasione del ritiro dei numerosi premi ricevuti in carriera (tra gli altri, l’Alan Turing per il fondamentale contributo alla programmazione orientata agli oggetti).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Durante una conferenza di qualche tempo fa lo speaker, rivolto a una sala gremita di programmatori e informatici, chiese quanti conoscevano Alan Kay. Con suo (e mio) grande stupore pochissimi alzarono le mani.</p>
<p><!-- raw HTML omitted -->The Deep Insights of Alan Kay<!-- raw HTML omitted -->  è un tributo da non perdere a questo vero gigante dell’informatica, tra l’altro impreziosito da una selezione di link ad alcuni dei suoi interventi più importanti, spesso tenuti in occasione del ritiro dei numerosi premi ricevuti in carriera (tra gli altri, l’Alan Turing per il fondamentale contributo alla programmazione orientata agli oggetti).</p>
<blockquote>
<p>Il modo migliore di predire il futuro è inventarlo</p></blockquote>
<blockquote>
<p>– Alan Kay</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Backbone.JS vs Angular.JS: dissacrare il mito</title>
      <link>https://nicolaiarocci.com/backbone-js-vs-angular-js-dissacrare-il-mito/</link>
      <pubDate>Mon, 25 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/backbone-js-vs-angular-js-dissacrare-il-mito/</guid>
      <description>&lt;p&gt;Lettura interessante se state cercando quello giusto fra le decine di front-end framework disponibili.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I love the way how each and every discussion turns into the war of the frameworks. I have worked with BackboneJS and AngularJS quite extensively and have come across most of their short comings in production. So, you dont really have to take this analysis with a grain of salt. I would be happy to take back anything that I have said if it turns out to be wrong. Lets get to the meat of it, then, shall we?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lettura interessante se state cercando quello giusto fra le decine di front-end framework disponibili.</p>
<blockquote>
<p>I love the way how each and every discussion turns into the war of the frameworks. I have worked with BackboneJS and AngularJS quite extensively and have come across most of their short comings in production. So, you dont really have to take this analysis with a grain of salt. I would be happy to take back anything that I have said if it turns out to be wrong. Lets get to the meat of it, then, shall we?</p></blockquote>
<p><!-- raw HTML omitted -->Backbone vs Angular: Demystifying the myths<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Libri gratuiti sul linguaggio C</title>
      <link>https://nicolaiarocci.com/libri-gratuiti-sul-linguaggio-c/</link>
      <pubDate>Sat, 09 Feb 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/libri-gratuiti-sul-linguaggio-c/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;9 of the Best Free C Books&lt;!-- raw HTML omitted --&gt; è un’ottima selezione di libri gratuiti sul linguaggio C. C’è n’è per tutti, dai testi per principianti a quelli per programmatori esperti provenienti da altri linguaggi. Lo sapete già, C dovrebbe far parte del bagaglio di ogni programmatore.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->9 of the Best Free C Books<!-- raw HTML omitted --> è un’ottima selezione di libri gratuiti sul linguaggio C. C’è n’è per tutti, dai testi per principianti a quelli per programmatori esperti provenienti da altri linguaggi. Lo sapete già, C dovrebbe far parte del bagaglio di ogni programmatore.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Vi presento Eve il framework per le REST API Web</title>
      <link>https://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/</link>
      <pubDate>Tue, 08 Jan 2013 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/vi-presento-eve-il-framework-per-lanciare-la-vostra-rest-api-web/</guid>
      <description>&lt;p&gt;Lo scorso anno abbiamo lavorato duro per costruirci una RESTful Web API su misura, flessibile e completa. In corso d’opera abbiamo imparato molto sulle migliori pratiche REST, mettendo anche alla frusta le rinomate capacità Web del linguaggio Python.&lt;/p&gt;
&lt;p&gt;Ad EuroPython 2012 ho poi &lt;a href=&#34;http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/&#34;&gt;raccontato la nostra esperienza&lt;/a&gt; e condiviso ciò che avevamo imparato. In quell’occasione mi sono reso conto di quanto l’argomento fosse d’attualità, tanto che da quel 4 luglio le slide che avevo preparato (le trovate su &lt;!-- raw HTML omitted --&gt;Speaker Deck&lt;!-- raw HTML omitted --&gt; o &lt;!-- raw HTML omitted --&gt;Slideshare&lt;!-- raw HTML omitted --&gt;) ed i video su YouTube (&lt;!-- raw HTML omitted --&gt;italiano&lt;!-- raw HTML omitted --&gt;; &lt;!-- raw HTML omitted --&gt;inglese&lt;!-- raw HTML omitted --&gt;) hanno totalizzato 30mila visite. Da allora ricevo continue richieste di chiarimenti, suggerimenti, approfondimenti, consigli. Soprattutto, mi si chiedono esempi di codice. In fin dei conti prima o poi qualunque sviluppatore web si trova, volente o nolente, a fare i conti con una REST API.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Lo scorso anno abbiamo lavorato duro per costruirci una RESTful Web API su misura, flessibile e completa. In corso d’opera abbiamo imparato molto sulle migliori pratiche REST, mettendo anche alla frusta le rinomate capacità Web del linguaggio Python.</p>
<p>Ad EuroPython 2012 ho poi <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/">raccontato la nostra esperienza</a> e condiviso ciò che avevamo imparato. In quell’occasione mi sono reso conto di quanto l’argomento fosse d’attualità, tanto che da quel 4 luglio le slide che avevo preparato (le trovate su <!-- raw HTML omitted -->Speaker Deck<!-- raw HTML omitted --> o <!-- raw HTML omitted -->Slideshare<!-- raw HTML omitted -->) ed i video su YouTube (<!-- raw HTML omitted -->italiano<!-- raw HTML omitted -->; <!-- raw HTML omitted -->inglese<!-- raw HTML omitted -->) hanno totalizzato 30mila visite. Da allora ricevo continue richieste di chiarimenti, suggerimenti, approfondimenti, consigli. Soprattutto, mi si chiedono esempi di codice. In fin dei conti prima o poi qualunque sviluppatore web si trova, volente o nolente, a fare i conti con una REST API.</p>
<p>Così ho pensato che avrei potuto prendere il nostro codice proprietario (nome interno Adam), sistemarlo un po’ in modo che si adattasse ai casi d’uso più comuni, e rilasciarlo come progetto open source. Be’ c’è voluto un bel po’ di lavoro, ben più di quello inizialmente preventivato, ma ora ci siamo. Il progetto è finalmente disponibile, e naturalmente si chiama <!-- raw HTML omitted -->Eve<!-- raw HTML omitted -->.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Costruire e lanciare una API con Eve è semplice. Servono tre cose; un database, un file di configurazione, uno script di lancio. MongoDB è già supportato; sviluppare estensioni per altri database SQL/NoSQL non dovrebbe essere troppo complicato. Le personalizzazioni della vostra API sono salvate in un modulo standard Python. Lo script di esecuzione è in genere davvero semplice:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Le API basate su Eve supportano l’intero range di operazioni CRUD (Create, Read, Update, Delete). Ogni end-point è personalizzabile e supporta filtri, paginazione e ordinamenti. Per massima accessibilità i client possono chiedere che le risposte pervengano in JSON oppure XML. Sono supportati gli inserimenti multipli, le direttive di caching per i client, il versioning e… tante altre cosette.</p>
<p>Non mi dilungo oltre poiché su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted --> trovate tutto quel che serve: documentazione (al momento piuttosto scarna), codice e progetti satellite. In particolare date un’occhiata a <!-- raw HTML omitted -->Eve-Demo<!-- raw HTML omitted -->, una API funzionante messa su in pochi minuti grazie a Eve. Potete consultarla direttamente, via cURL per esempio, o anche <!-- raw HTML omitted -->via browser<!-- raw HTML omitted --> (in questo caso vi beccherete del XML in risposta, mentre via cURL o altro potrete scegliere JSON). Il README di eve-demo include una serie completa di esempi relativi alle varie operazioni di lettura, inserimento, cancellazione, aggiornamento.</p>
<p>C’è ancora tanto da fare affinché Eve diventi il framework completo, stabile e maturo che ho in mente ma credo che il progetto ora sia pronto per una anteprima pubblica. In ogni caso sono lieto di dare finalmente risposta alle richieste di questi mesi: ora avete il codice; usatelo come volete. Spero anche e soprattutto di raccogliere critiche, consigli e suggerimenti; magari a qualcuno verrà anche voglia di collaborare!</p>
<p>PS: Buon 2013!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python ti mette le ali</title>
      <link>https://nicolaiarocci.com/python-ti-mette-le-ali/</link>
      <pubDate>Sat, 15 Dec 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-ti-mette-le-ali/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Aggiornato il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/aggiornato-il-piccolo-libro-di-mongodb/</link>
      <pubDate>Sat, 24 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/aggiornato-il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;Finalmente ho trovato il tempo per aggiornare &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;Il Piccolo Libro di MongoDB&lt;/a&gt;. Grazie ai contributi di Andrea Rabbaglietti e Michele Zonca sono stati corretti molti errori sparsi qui e là nel testo. Ho approfittato dell’occasione per ritoccare il formato grafico allineandolo alla versione più recente dell’edizione inglese. Se avete già scaricato il libro vi consiglio di rifarlo: la nuova edizione è decisamente più leggibile.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finalmente ho trovato il tempo per aggiornare <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">Il Piccolo Libro di MongoDB</a>. Grazie ai contributi di Andrea Rabbaglietti e Michele Zonca sono stati corretti molti errori sparsi qui e là nel testo. Ho approfittato dell’occasione per ritoccare il formato grafico allineandolo alla versione più recente dell’edizione inglese. Se avete già scaricato il libro vi consiglio di rifarlo: la nuova edizione è decisamente più leggibile.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cerberus 0.0.2: tipi di dato personalizzati</title>
      <link>https://nicolaiarocci.com/cerberus-0-0-2-tipi-di-dato-personalizzati/</link>
      <pubDate>Thu, 22 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cerberus-0-0-2-tipi-di-dato-personalizzati/</guid>
      <description>&lt;p&gt;Primo aggiornamento per &lt;!-- raw HTML omitted --&gt;Cerberus&lt;!-- raw HTML omitted --&gt;,
lo strumento per la convalida dei dizionari Python che ho rilasciato qualche
tempo fa. Ora è possibile estendere la lista dei tipi di dato da convalidare,
aggiungendone di propri. Per esempio nella nostra REST API (che usa Cerberus
per la validazione) uso questa tecnica per implementare e convalidare il tipo
&lt;code&gt;ObjectId&lt;/code&gt;, tipico di MongoDB. I dettagli
li trovate nella &lt;!-- raw HTML omitted --&gt;documentazione&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Primo aggiornamento per <!-- raw HTML omitted -->Cerberus<!-- raw HTML omitted -->,
lo strumento per la convalida dei dizionari Python che ho rilasciato qualche
tempo fa. Ora è possibile estendere la lista dei tipi di dato da convalidare,
aggiungendone di propri. Per esempio nella nostra REST API (che usa Cerberus
per la validazione) uso questa tecnica per implementare e convalidare il tipo
<code>ObjectId</code>, tipico di MongoDB. I dettagli
li trovate nella <!-- raw HTML omitted -->documentazione<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Come evitare i trabocchetti di MongoDB</title>
      <link>https://nicolaiarocci.com/come-evitare-i-trabocchetti-di-mongodb/</link>
      <pubDate>Sat, 17 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-evitare-i-trabocchetti-di-mongodb/</guid>
      <description>&lt;p&gt;E niente, è un articolo così importante che mi sono procurato dall’autore il permesso di curarne la traduzione. Solo che non trovo il tempo per farla la traduzione, quindi vi passo direttamente l’originale. In &lt;!-- raw HTML omitted --&gt;MongoDB Gotchas &amp;amp; How To Avoid Them&lt;!-- raw HTML omitted --&gt; Russel Smith raccoglie una decina di preziosi consigli che non potete assolutamente perdervi se state pensando di usare MongoDB in produzione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E niente, è un articolo così importante che mi sono procurato dall’autore il permesso di curarne la traduzione. Solo che non trovo il tempo per farla la traduzione, quindi vi passo direttamente l’originale. In <!-- raw HTML omitted -->MongoDB Gotchas &amp; How To Avoid Them<!-- raw HTML omitted --> Russel Smith raccoglie una decina di preziosi consigli che non potete assolutamente perdervi se state pensando di usare MongoDB in produzione.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 1.5</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-1-5/</link>
      <pubDate>Thu, 01 Nov 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-1-5/</guid>
      <description>&lt;p&gt;Seguo il progetto Python Tools per Visual Studio da &lt;a href=&#34;http://nicolaiarocci.com/?s=python+tools+visual+studio&amp;amp;submit=Search&#34; title=&#34;Python Tools per Visual Studio&#34;&gt;molto tempo&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Python Tools per Visual Studio è un plugin gratuito e open source che trasforma Visual Studio in una IDE per Python. Supporta CPython, IronPython, Intellisense, Debugging, Profiling, Editing, Browsing, REPL Multipli, IPython, Django e Cloud Computing con librerie client per Windows, Linux e OS X (Azure).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;La &lt;!-- raw HTML omitted --&gt;versione 1.5&lt;!-- raw HTML omitted --&gt;, rilasciata oggi, aggiunge supporto per Django, Azure, REPL debugging, Visual Studio 2012 e altro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Seguo il progetto Python Tools per Visual Studio da <a href="http://nicolaiarocci.com/?s=python+tools+visual+studio&amp;submit=Search" title="Python Tools per Visual Studio">molto tempo</a>.</p>
<blockquote>
<p>Python Tools per Visual Studio è un plugin gratuito e open source che trasforma Visual Studio in una IDE per Python. Supporta CPython, IronPython, Intellisense, Debugging, Profiling, Editing, Browsing, REPL Multipli, IPython, Django e Cloud Computing con librerie client per Windows, Linux e OS X (Azure).</p></blockquote>
<p>La <!-- raw HTML omitted -->versione 1.5<!-- raw HTML omitted -->, rilasciata oggi, aggiunge supporto per Django, Azure, REPL debugging, Visual Studio 2012 e altro.</p>
]]></content:encoded>
    </item>
    <item>
      <title>La documentazione di Django in formato ePub</title>
      <link>https://nicolaiarocci.com/la-documentazione-di-django-in-formato-epub/</link>
      <pubDate>Wed, 31 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-documentazione-di-django-in-formato-epub/</guid>
      <description>&lt;p&gt;Grazie al lavoro di Pedro Kroger la documentazione di Django è disponibile in formato ePub:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Grazie al lavoro di Pedro Kroger la documentazione di Django è disponibile in formato ePub:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>REST API con MongoDB</title>
      <link>https://nicolaiarocci.com/rest-api-con-mongodb/</link>
      <pubDate>Fri, 26 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/rest-api-con-mongodb/</guid>
      <description>&lt;p&gt;Le slide che ho presentato a ‘&lt;!-- raw HTML omitted --&gt;A Morning with MongoDB&lt;!-- raw HTML omitted --&gt;‘ (24 ottobre, Milano) sono disponibili online. Gran parte degli interventi erano di tipo divulgativo ed inizialmente ero preoccupato che i miei contenuti fossero troppo tecnici. In realtà in sala c’erano davvero tanti programmatori, quindi tutto è andato bene.&lt;/p&gt;
&lt;p&gt;A margine dell’evento molte le domande su &lt;!-- raw HTML omitted --&gt;Eve&lt;!-- raw HTML omitted --&gt;, la REST API open source a cui sto lavorando e che conto di rilasciare entro fine anno: bene! Grazie a tutti i partecipanti ed a 10Gen per avermi invitato.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Le slide che ho presentato a ‘<!-- raw HTML omitted -->A Morning with MongoDB<!-- raw HTML omitted -->‘ (24 ottobre, Milano) sono disponibili online. Gran parte degli interventi erano di tipo divulgativo ed inizialmente ero preoccupato che i miei contenuti fossero troppo tecnici. In realtà in sala c’erano davvero tanti programmatori, quindi tutto è andato bene.</p>
<p>A margine dell’evento molte le domande su <!-- raw HTML omitted -->Eve<!-- raw HTML omitted -->, la REST API open source a cui sto lavorando e che conto di rilasciare entro fine anno: bene! Grazie a tutti i partecipanti ed a 10Gen per avermi invitato.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Convalidare un dizionario Python con Cerberus</title>
      <link>https://nicolaiarocci.com/convalidare-un-dizionario-python-con-cerberus/</link>
      <pubDate>Tue, 16 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/convalidare-un-dizionario-python-con-cerberus/</guid>
      <description>&lt;p&gt;Da qualche giorno ho rilasciato &lt;!-- raw HTML omitted --&gt;Cerberus&lt;!-- raw HTML omitted --&gt;, uno strumento per la convalida dei dizionari Python. Gli passate un dizionario, lui lo confronta con uno schema di convalida e, se c’è qualcosa che non va (per esempio una chiave sconosciuta, oppure un valore di tipo sbagliato), ve lo segnala.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Sono due le caratteristiche che rendono Cerberus interessante: è facilmente estensibile (la &lt;!-- raw HTML omitted --&gt;documentazione&lt;!-- raw HTML omitted --&gt; include un esempio di estensione del sistema di convalida), e non si blocca sollevando un’eccezione al primo problema riscontrato: gli errori, quando presenti, sono tutti riportati in una lista a fine convalida.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche giorno ho rilasciato <!-- raw HTML omitted -->Cerberus<!-- raw HTML omitted -->, uno strumento per la convalida dei dizionari Python. Gli passate un dizionario, lui lo confronta con uno schema di convalida e, se c’è qualcosa che non va (per esempio una chiave sconosciuta, oppure un valore di tipo sbagliato), ve lo segnala.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Sono due le caratteristiche che rendono Cerberus interessante: è facilmente estensibile (la <!-- raw HTML omitted -->documentazione<!-- raw HTML omitted --> include un esempio di estensione del sistema di convalida), e non si blocca sollevando un’eccezione al primo problema riscontrato: gli errori, quando presenti, sono tutti riportati in una lista a fine convalida.</p>
<p>Cerberus è un progetto open source tutt’ora in pieno sviluppo, al quale è possibile partecipare. E’ alla base del sistema di convalida impiegato dalla nostra REST API, ma può e dovrebbe vivere di vita propria – per esempio nei vostri progetti. A proposito, la stessa RESTful Web API, <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/" title="Sviluppare una RESTful Web API con Python">quella di cui ho parlato a EuroPython</a>, sarà rilasciata come progetto open source. Stay tuned.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una mattinata con MongoDB</title>
      <link>https://nicolaiarocci.com/una-mattinata-con-mongodb/</link>
      <pubDate>Wed, 10 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/una-mattinata-con-mongodb/</guid>
      <description>&lt;p&gt;Il prossimo 24 ottobre sarò a Milano per &lt;!-- raw HTML omitted --&gt;A Morning with MongoDB&lt;!-- raw HTML omitted --&gt;, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e &lt;!-- raw HTML omitted --&gt;registrazione&lt;!-- raw HTML omitted --&gt; sono gratuite: cosa aspettate?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il prossimo 24 ottobre sarò a Milano per <!-- raw HTML omitted -->A Morning with MongoDB<!-- raw HTML omitted -->, evento ufficiale 10gen nel corso del quale racconterò la mia esperienza nell’integrazione di MongoDB in una Web REST API. Partecipazione e <!-- raw HTML omitted -->registrazione<!-- raw HTML omitted --> sono gratuite: cosa aspettate?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ancora su TypeScript</title>
      <link>https://nicolaiarocci.com/ancora-su-typescript/</link>
      <pubDate>Fri, 05 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ancora-su-typescript/</guid>
      <description>&lt;p&gt;A proposito di TypeScript vi segnalo &lt;!-- raw HTML omitted --&gt;Thoughts on TypeScript&lt;!-- raw HTML omitted --&gt;, il miglior articolo che ho letto finora sul nuovo nato in casa Microsoft.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’m happy that regular JavaScript can be written in TypeScript and still benefit from some of the type checking provided by the TypeScript compiler. That means writing TypeScript can actually help people learn JavaScript, which makes me happy.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<p>A proposito di TypeScript vi segnalo <!-- raw HTML omitted -->Thoughts on TypeScript<!-- raw HTML omitted -->, il miglior articolo che ho letto finora sul nuovo nato in casa Microsoft.</p>
<blockquote>
<p>I’m happy that regular JavaScript can be written in TypeScript and still benefit from some of the type checking provided by the TypeScript compiler. That means writing TypeScript can actually help people learn JavaScript, which makes me happy.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>TypeScript: prime impressioni</title>
      <link>https://nicolaiarocci.com/typescript-prime-impressioni/</link>
      <pubDate>Tue, 02 Oct 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/typescript-prime-impressioni/</guid>
      <description>&lt;p&gt;Ieri Microsoft ha annunciato &lt;!-- raw HTML omitted --&gt;TypeScript&lt;!-- raw HTML omitted --&gt;,  nuovo linguaggio fortemente tipizzato il cui codice compilato è puro JavaScript. TypeScript aggiunge classi, controllo degli errori in compilazione, completamento del codice in fase di sviluppo, e tante altre cose interessanti.&lt;/p&gt;
&lt;p&gt;Miguel de Icaza, il cervello dietro Xamarin e la piattaforma Mono, ha sintentizzato le sue &lt;!-- raw HTML omitted --&gt;prime impressioni sul progetto&lt;!-- raw HTML omitted --&gt;. Interessanti anche i &lt;!-- raw HTML omitted --&gt;commenti di uno degli sviluppatori di Dart&lt;!-- raw HTML omitted --&gt;, progetto Google dal quale TypeScript ha senz’altro tratto ispirazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ieri Microsoft ha annunciato <!-- raw HTML omitted -->TypeScript<!-- raw HTML omitted -->,  nuovo linguaggio fortemente tipizzato il cui codice compilato è puro JavaScript. TypeScript aggiunge classi, controllo degli errori in compilazione, completamento del codice in fase di sviluppo, e tante altre cose interessanti.</p>
<p>Miguel de Icaza, il cervello dietro Xamarin e la piattaforma Mono, ha sintentizzato le sue <!-- raw HTML omitted -->prime impressioni sul progetto<!-- raw HTML omitted -->. Interessanti anche i <!-- raw HTML omitted -->commenti di uno degli sviluppatori di Dart<!-- raw HTML omitted -->, progetto Google dal quale TypeScript ha senz’altro tratto ispirazione.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Scrivete il dannato manuale</title>
      <link>https://nicolaiarocci.com/scrivete-il-dannato-manuale/</link>
      <pubDate>Sat, 29 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/scrivete-il-dannato-manuale/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Sviluppatori: passate ore, giorni, mesi, forse anni interi a perfezionare il vostro capolavoro. In fin dei conti si tratta dell’espressione di un’intera vita professionale, anima e cuore. Perché dunque vi fate del male dotandolo di documentazione scarna, o addirittura inesistente?&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Write The Freaking Manual&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Sviluppatori: passate ore, giorni, mesi, forse anni interi a perfezionare il vostro capolavoro. In fin dei conti si tratta dell’espressione di un’intera vita professionale, anima e cuore. Perché dunque vi fate del male dotandolo di documentazione scarna, o addirittura inesistente?</p></blockquote>
<p><!-- raw HTML omitted -->Write The Freaking Manual<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Ottimizzare le prestazioni di MongoDB</title>
      <link>https://nicolaiarocci.com/ottimizzare-le-prestazioni-di-mongodb/</link>
      <pubDate>Thu, 27 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ottimizzare-le-prestazioni-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;MongoDB Schema Design at Scale&lt;!-- raw HTML omitted --&gt; è un’eccellente articolo cu come ottimizzare database MongoDB sottoposti a pesanti carichi di lavoro, soprattutto in scrittura. Il messaggio, forte e chiaro, è sempre lo stesso: prima di agire studia per bene il tuo database engine; comprendine i vantaggi e soprattutto i punti deboli.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->MongoDB Schema Design at Scale<!-- raw HTML omitted --> è un’eccellente articolo cu come ottimizzare database MongoDB sottoposti a pesanti carichi di lavoro, soprattutto in scrittura. Il messaggio, forte e chiaro, è sempre lo stesso: prima di agire studia per bene il tuo database engine; comprendine i vantaggi e soprattutto i punti deboli.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Decodificare le date in un flusso JSON (Python)</title>
      <link>https://nicolaiarocci.com/decodificare-le-date-in-un-flusso-json-python/</link>
      <pubDate>Mon, 10 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/decodificare-le-date-in-un-flusso-json-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;JSON-Datetime&lt;!-- raw HTML omitted --&gt; permette di decodificare i valori [cci lang=”python” theme=”default”]datetime[/cci] normalmente espressi come stringhe in un flusso JSON. E’ davvero molto semplice, e fa parte della suite strumenti open source che sto sviluppando nel contesto del più ampio progetto &lt;a href=&#34;http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/&#34; title=&#34;Sviluppare una RESTful Web API&#34;&gt;RESTful Web API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Del problema della decodifica delle stringhe JSON in valori datetime ho &lt;a href=&#34;http://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/&#34; title=&#34;Convertire una data JSON in un oggetto Python datetime&#34;&gt;già scritto in passato&lt;/a&gt;. Allora proponevo una soluzione algoritmica; ora vi presento un prodotto finito che potete usare nei vostri progetti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->JSON-Datetime<!-- raw HTML omitted --> permette di decodificare i valori [cci lang=”python” theme=”default”]datetime[/cci] normalmente espressi come stringhe in un flusso JSON. E’ davvero molto semplice, e fa parte della suite strumenti open source che sto sviluppando nel contesto del più ampio progetto <a href="http://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/" title="Sviluppare una RESTful Web API">RESTful Web API</a>.</p>
<p>Del problema della decodifica delle stringhe JSON in valori datetime ho <a href="http://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/" title="Convertire una data JSON in un oggetto Python datetime">già scritto in passato</a>. Allora proponevo una soluzione algoritmica; ora vi presento un prodotto finito che potete usare nei vostri progetti.</p>
<h2 id="il-problema">Il problema</h2>
<p>Lo standard JSON (<!-- raw HTML omitted -->RFC 4627<!-- raw HTML omitted -->) non supporta valori di tipo data/ora. In un flusso JSON le date vengono rappresentate come semplici stringhe che i decoder Python interpretano come tali:</p>
<pre><code>import simplejson as json

&gt;&gt;&gt;test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'
&gt;&gt;&gt;json.loads(test)
{'name': 'John Doe', 'born': 'Thu, 1 Mar 2012 10:00:49 
</code></pre>
<p>Nell’esempio precedente il campo <code>born</code> è una stringa nel JSON, e tale rimane dopo la decodifica in un dizionario Python.</p>
<h2 id="la-soluzione">La soluzione</h2>
<p>JSON-Datetime è un semplice wrapper attorno al metodo <code>loads</code> di <!-- raw HTML omitted -->simplejson<!-- raw HTML omitted -->. Ecco che succede quando usiamo JSON-Datetime al posto di simplejson:</p>
<pre><code>&gt;&gt;&gt; import jsondatetime as json
&gt;&gt;&gt; test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'

&gt;&gt;&gt; json.loads(test)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1, 10, 0 ,49)}
</code></pre>
<p>Ora <code>born</code> assume il valore corretto. Affinché vengano riconosciute, le date contenute nel JSON devono corrispondere a un formato <code>strptime()</code> valido indicato con l’argomento <code>datetime_format</code>. Nell’esempio precedente, poiché l’argomento è assente, viene usato il valore di default <code>'%a, %d %b %Y %H:%M:%S UTC'</code>, corrispondente allo standard RFC 1123 (ex 822). Nell’esempio che segue usiamo un formato personalizzato:</p>
<pre><code>&gt;&gt;&gt; import jsondatetime as json
&gt;&gt;&gt; test = '{&quot;name&quot;: &quot;John Doe&quot;, &quot;born&quot;: &quot;Thu, 1 Mar 2012&quot;}'

&gt;&gt;&gt; json.loads(test, datetime_format=&quot;%a, %d %b %Y&quot;;)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1)}
</code></pre>
<p>JSON-Datetime è un semplice wrapper che ci lascia liberi di usare tutti gli argomenti standard previsti per <code>loads</code>, <code>object_hook</code> incluso. Ciò significa che questa soluzione (al contrario di quella proposta in precedenza) ci lascia liberi di applicare qualsivoglia parser al nostro flusso JSON.</p>
<h2 id="installazione-e-sorgenti">Installazione e sorgenti</h2>
<p>Per l’installazione basta il classico <code>pip install json-datetime</code>. Il codice è disponibile su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Pybooks – Le migliori risorse gratuite su Python</title>
      <link>https://nicolaiarocci.com/pybooks-le-migliori-risorse-gratuite-su-python/</link>
      <pubDate>Tue, 04 Sep 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/pybooks-le-migliori-risorse-gratuite-su-python/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;PyBooks&lt;!-- raw HTML omitted --&gt; è un’ottima selezione di risorse gratuite su Python e dintorni. I migliori libri gratuiti su Python sono inclusi, così come alcuni validi tutorial sulle librerie e i framework più diffusi. Il progetto è curato dalle stesse persone che stanno dietro JSBooks, la raccolta di libri JavaScript di cui ho scritto &lt;a href=&#34;http://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/&#34; title=&#34;JSBooks&#34;&gt;qualche giorno fa&lt;/a&gt;. Anche in questo caso è possibile contribuire attivamente segnalando nuove interessanti risorse.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->PyBooks<!-- raw HTML omitted --> è un’ottima selezione di risorse gratuite su Python e dintorni. I migliori libri gratuiti su Python sono inclusi, così come alcuni validi tutorial sulle librerie e i framework più diffusi. Il progetto è curato dalle stesse persone che stanno dietro JSBooks, la raccolta di libri JavaScript di cui ho scritto <a href="http://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/" title="JSBooks">qualche giorno fa</a>. Anche in questo caso è possibile contribuire attivamente segnalando nuove interessanti risorse.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JSBooks – Libri Open Source su JavaScript</title>
      <link>https://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/</link>
      <pubDate>Thu, 30 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/jsbooks-libri-open-source-su-javascript/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;JSBooks Free JavaScript Books&lt;!-- raw HTML omitted --&gt; è una valida selezione di risorse gratuite su JavaScript. Si tratta di libri e guide gratuite per programmatori di ogni livello, dal principiante al veterano. Il catalogo include titoli su jQuery, Backbone, design patterns, Node, CoffeeScript, qualcosa su HTML5 e addirittura un libro su MongoDB (si tratta una mia &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro su MongoDB&#34;&gt;vecchia conoscenza&lt;/a&gt;). Alcuni suggerimenti sono davvero di ottima qualità. Il progetto è open source e chiunque può contribuire segnalando nuove interessanti risorse via GitHub.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->JSBooks Free JavaScript Books<!-- raw HTML omitted --> è una valida selezione di risorse gratuite su JavaScript. Si tratta di libri e guide gratuite per programmatori di ogni livello, dal principiante al veterano. Il catalogo include titoli su jQuery, Backbone, design patterns, Node, CoffeeScript, qualcosa su HTML5 e addirittura un libro su MongoDB (si tratta una mia <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro su MongoDB">vecchia conoscenza</a>). Alcuni suggerimenti sono davvero di ottima qualità. Il progetto è open source e chiunque può contribuire segnalando nuove interessanti risorse via GitHub.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sull’essere un Programmatore</title>
      <link>https://nicolaiarocci.com/sullessere-un-programmatore/</link>
      <pubDate>Sat, 18 Aug 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sullessere-un-programmatore/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Non fare lo stronzo&lt;/li&gt;
&lt;li&gt;Codice semplice è difficile da scrivere&lt;/li&gt;
&lt;li&gt;Codice  squisitamente semplice è davvero difficile da scrivere&lt;/li&gt;
&lt;li&gt;Se è semplice leggerlo non vuol dire che sia stato semplice scriverlo&lt;/li&gt;
&lt;li&gt;In effetti più è semplice più, probabilmente, è stato difficile scriverlo&lt;/li&gt;
&lt;li&gt;Ci sono molti modi di ottenere lo stesso risultato&lt;/li&gt;
&lt;li&gt;E’ &lt;em&gt;davvero&lt;/em&gt; improbabile che il primo che ti viene in mente sia anche il migliore&lt;/li&gt;
&lt;li&gt;Probabilmente &lt;em&gt;il&lt;/em&gt; &lt;em&gt;migliore&lt;/em&gt; non esiste – ne esistono molti, ognuno migliore a modo suo&lt;/li&gt;
&lt;li&gt;Hai sempre modo di migliorare – nel codice, nelle capacità, in te stesso&lt;/li&gt;
&lt;li&gt;Se pensi che non sei mai stato così bravo prima d’ora, probabilmente hai ragione&lt;/li&gt;
&lt;li&gt;Non esistono correzioni di una sola riga&lt;/li&gt;
&lt;li&gt;Impara a desiderare il successo più di quanto temi il fallimento&lt;/li&gt;
&lt;li&gt;Diventi vecchio solo quando non sei più capace di imparare nuovi trucchetti&lt;/li&gt;
&lt;li&gt;Fai sempre un backup prima di “dare una sistemata” al codice&lt;/li&gt;
&lt;li&gt;Leggi il fottuto manuale&lt;/li&gt;
&lt;li&gt;A volte un po’ stronzo è ok. Che non diventi un’abitudine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Liberamente tradotto da &lt;!-- raw HTML omitted --&gt;Thoughts on being a programmer&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<ul>
<li>Non fare lo stronzo</li>
<li>Codice semplice è difficile da scrivere</li>
<li>Codice  squisitamente semplice è davvero difficile da scrivere</li>
<li>Se è semplice leggerlo non vuol dire che sia stato semplice scriverlo</li>
<li>In effetti più è semplice più, probabilmente, è stato difficile scriverlo</li>
<li>Ci sono molti modi di ottenere lo stesso risultato</li>
<li>E’ <em>davvero</em> improbabile che il primo che ti viene in mente sia anche il migliore</li>
<li>Probabilmente <em>il</em> <em>migliore</em> non esiste – ne esistono molti, ognuno migliore a modo suo</li>
<li>Hai sempre modo di migliorare – nel codice, nelle capacità, in te stesso</li>
<li>Se pensi che non sei mai stato così bravo prima d’ora, probabilmente hai ragione</li>
<li>Non esistono correzioni di una sola riga</li>
<li>Impara a desiderare il successo più di quanto temi il fallimento</li>
<li>Diventi vecchio solo quando non sei più capace di imparare nuovi trucchetti</li>
<li>Fai sempre un backup prima di “dare una sistemata” al codice</li>
<li>Leggi il fottuto manuale</li>
<li>A volte un po’ stronzo è ok. Che non diventi un’abitudine.</li>
</ul>
<p>Liberamente tradotto da <!-- raw HTML omitted -->Thoughts on being a programmer<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare Python con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-python-con-codecademy/</link>
      <pubDate>Tue, 31 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-python-con-codecademy/</guid>
      <description>&lt;p&gt;Di Codecademy avevo già scritto &lt;a href=&#34;http://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/&#34; title=&#34;Imparare HTM e CSS online con Codecademy&#34;&gt;tempo fa&lt;/a&gt; in occasione dei loro primi corsi giocoso-interattivi su HTML, CSS  e JavaScript. E’ di ieri l’annuncio del &lt;!-- raw HTML omitted --&gt;nuovo corso Python per principianti&lt;!-- raw HTML omitted --&gt;. Se volete rompere il ghiaccio con questo bellissimo linguaggio l’approccio di Codecademy (imparare divertendosi, anche grazie a collaudati meccanismi incentivanti come i punteggi e i trofei) potrebbe fare per voi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Di Codecademy avevo già scritto <a href="http://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/" title="Imparare HTM e CSS online con Codecademy">tempo fa</a> in occasione dei loro primi corsi giocoso-interattivi su HTML, CSS  e JavaScript. E’ di ieri l’annuncio del <!-- raw HTML omitted -->nuovo corso Python per principianti<!-- raw HTML omitted -->. Se volete rompere il ghiaccio con questo bellissimo linguaggio l’approccio di Codecademy (imparare divertendosi, anche grazie a collaudati meccanismi incentivanti come i punteggi e i trofei) potrebbe fare per voi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Analisi delle performance in Python</title>
      <link>https://nicolaiarocci.com/analisi-delle-performance-python/</link>
      <pubDate>Wed, 25 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/analisi-delle-performance-python/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;E’ vero che non tutti i programmi Python richiedono un’analisi rigorosa delle prestazioni, ma è rassicurante sapere che l’ecosistema Python ci mette a disposizione una serie di strumenti a cui possiamo rivolgerci in caso di necessità.&lt;/p&gt;
&lt;p&gt;Analizzare la performance di un programma significa prima di tutto rispondere a queste quattro semplici domande:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quanto gira veloce?&lt;/li&gt;
&lt;li&gt;Dove sono i “collli di bottiglia”?&lt;/li&gt;
&lt;li&gt;Quanta memoria sta utilizzando?&lt;/li&gt;
&lt;li&gt;Dove occorrono gli spechi di memoria?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Scopriamo come rispondere a queste domande attraverso alcuni strumenti molto interessanti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>E’ vero che non tutti i programmi Python richiedono un’analisi rigorosa delle prestazioni, ma è rassicurante sapere che l’ecosistema Python ci mette a disposizione una serie di strumenti a cui possiamo rivolgerci in caso di necessità.</p>
<p>Analizzare la performance di un programma significa prima di tutto rispondere a queste quattro semplici domande:</p>
<ul>
<li>Quanto gira veloce?</li>
<li>Dove sono i “collli di bottiglia”?</li>
<li>Quanta memoria sta utilizzando?</li>
<li>Dove occorrono gli spechi di memoria?</li>
</ul>
<p>Scopriamo come rispondere a queste domande attraverso alcuni strumenti molto interessanti.</p></blockquote>
<p><!-- raw HTML omitted -->A guide to analyzing Python performance<!-- raw HTML omitted --> è un’articolo non difficile che vale la pena leggere.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Flask-MimeRender v0.1.2</title>
      <link>https://nicolaiarocci.com/flask-mimerender-v0-1-2/</link>
      <pubDate>Thu, 19 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flask-mimerender-v0-1-2/</guid>
      <description>&lt;p&gt;Grazie al contributo di &lt;a href=&#34;http://twitter.com/brunoripa&#34;&gt;Bruno Ripa&lt;/a&gt;, la versione 0.1.2 di &lt;a href=&#34;http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/&#34; title=&#34;Flask-MimeRender&#34;&gt;Flask-MimeRender&lt;/a&gt; pubblicata oggi introduce il supporto per codici di stato HTTP arbitrari. Ho colto l’occasione per uniformare il codice sorgente alle direttive PEP8 e per sistemare alcuni dettagli del &lt;a href=&#34;http://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/&#34; title=&#34;Flask-MimeRender su PyPI&#34;&gt;package PyPI&lt;/a&gt;. Vi ricordo che potete contribuire voi stessi al progetto, direttamente su &lt;!-- raw HTML omitted --&gt;GitHub&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Grazie al contributo di <a href="http://twitter.com/brunoripa">Bruno Ripa</a>, la versione 0.1.2 di <a href="http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/" title="Flask-MimeRender">Flask-MimeRender</a> pubblicata oggi introduce il supporto per codici di stato HTTP arbitrari. Ho colto l’occasione per uniformare il codice sorgente alle direttive PEP8 e per sistemare alcuni dettagli del <a href="http://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/" title="Flask-MimeRender su PyPI">package PyPI</a>. Vi ricordo che potete contribuire voi stessi al progetto, direttamente su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Sviluppare una RESTful Web API con Python, Flask e MongoDB</title>
      <link>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</link>
      <pubDate>Mon, 09 Jul 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sviluppare-una-restful-web-api-con-python-flask-e-mongodb/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;La scorsa settimana a &lt;!-- raw HTML omitted --&gt;EuroPython 2012&lt;!-- raw HTML omitted --&gt; ho tenuto un talk intitolato &lt;!-- raw HTML omitted --&gt;Sviluppare una RESTful Web API con Python, Flask e MongoDB&lt;!-- raw HTML omitted --&gt;. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).&lt;/p&gt;
&lt;p&gt;Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->La scorsa settimana a <!-- raw HTML omitted -->EuroPython 2012<!-- raw HTML omitted --> ho tenuto un talk intitolato <!-- raw HTML omitted -->Sviluppare una RESTful Web API con Python, Flask e MongoDB<!-- raw HTML omitted -->. Mi ha fatto piacere riscontrare forte interesse sia per gli aspetti teorici dell’architettura REST che per la loro implementazione pratica con strumenti quali Flask e MongoDB. In entrambe le sessioni inglese e italiana mi sono state rivolte molte domande, sia in occasione delle Q&amp;A plenarie che nei successivi colloqui informali. Parecchi anche i commenti ed i suggerimenti, davvero utili ed apprezzati (a quanto pare non sono l’unico che, forte di un background .NET, ha compiuto o sta per compiere il salto verso Python e il mondo open source).</p>
<p>Soprattutto ho rilevato una forte curiosità su MongoDB, un database non-relazionale verso il quale sembra prevalere un atteggiamento  di generale timidezza: “vorrei ma non oso”, insomma. Per quanto riguarda Flask direi che ormai, nel vasto firmamento dei micro web framework, è una stella che brilla di luce propria.</p>
<p>Per quanto riguarda le registrazioni video potete andare su YouTube o sulla pagina ufficiale di EuroPython (<!-- raw HTML omitted -->english track<!-- raw HTML omitted --> e <!-- raw HTML omitted -->italian track<!-- raw HTML omitted -->). Ammetto di essere più soddisfatto della versione inglese nella quale – complice anche l’esperienza italiana del giorno prima – credo di essere stato più sintetico ed efficace. Qui mi limito a proporvi le slide:</p>
<h2 id="ringraziamenti">Ringraziamenti</h2>
<p>Un immenso grazie ai ragazzi dello staff di EuroPython che veramente hanno fatto di tutto per rendere questa manifestazione un evento straordinario – e ci sono riusciti  (una settimana di talk su cinque tracce parallele, sprint, hands-on, corsi, cibo di ottima qualità e credo oltre 800 partecipanti).</p>
<p>Vi racconto un episodio giusto per darvi l’idea di quanto questi ragazzi, tutti volontari, si diano da fare e ci mettano passione vera. Nella sessione italiana ho ‘sforato’ (capita anche ai migliori, mi dicono!) e così mi son trovato a sorvolare su un certo numero di slide. Ebbene il mio talk manager e il suo assistente mi hanno proposto di loro iniziativa di tenere una sessione pomeridiana straordinaria per consentirmi di portare a termine la mia relazione. Non capita tutti i giorni, credetemi. Per mia fortuna gran parte delle persone che avevano assistito alla sessione mattutina sono poi tornate per quella del pomeriggio, altrimenti sai che figura!</p>
<p>Se siete pythonisti o vorreste diventarlo non perdetevi la prossima edizione di questo evento internazionale che, con tutta probabilità, si terrà di nuovo a Firenze l’anno prossimo.</p>]]></content:encoded>
    </item>
    <item>
      <title>E finalmente esce Sublime Text 2</title>
      <link>https://nicolaiarocci.com/e-finalmente-esce-sublime-text-2/</link>
      <pubDate>Wed, 27 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/e-finalmente-esce-sublime-text-2/</guid>
      <description>&lt;p&gt;Da ieri Sublime Text 2 è ufficialmente fuori dalla lunghissima beta. Molte novità anche nell’ultima build, incluso il supporto per il Retina Display di OSX (tanto per dire quanto questi ragazzi stiano sul pezzo). Vi propongo un po’ di link di riferimento:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;Annuncio della versione 2.0&lt;!-- raw HTML omitted --&gt; sul blog Sublime&lt;/li&gt;
&lt;li&gt;Come Kenneth Reitz ha configurato &lt;!-- raw HTML omitted --&gt;ST2 per Python&lt;!-- raw HTML omitted --&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/&#34; title=&#34;Sublime Text 2 un anno dopo&#34;&gt;Sublime Text 2 un anno dopo&lt;/a&gt;, il mio articolo più recente su ST2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS: io nel frattempo sono tornato a vim, e per ora ci sto molto comodo. Sublime Text rimane l’editor che consiglio a chiunque non abbia già un background vi/vim e non voglia o non possa investire tempo nell’impararlo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da ieri Sublime Text 2 è ufficialmente fuori dalla lunghissima beta. Molte novità anche nell’ultima build, incluso il supporto per il Retina Display di OSX (tanto per dire quanto questi ragazzi stiano sul pezzo). Vi propongo un po’ di link di riferimento:</p>
<ul>
<li><!-- raw HTML omitted -->Annuncio della versione 2.0<!-- raw HTML omitted --> sul blog Sublime</li>
<li>Come Kenneth Reitz ha configurato <!-- raw HTML omitted -->ST2 per Python<!-- raw HTML omitted --></li>
<li><a href="http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/" title="Sublime Text 2 un anno dopo">Sublime Text 2 un anno dopo</a>, il mio articolo più recente su ST2</li>
</ul>
<p>PS: io nel frattempo sono tornato a vim, e per ora ci sto molto comodo. Sublime Text rimane l’editor che consiglio a chiunque non abbia già un background vi/vim e non voglia o non possa investire tempo nell’impararlo.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Come usare al meglio WebKit Inspector</title>
      <link>https://nicolaiarocci.com/come-usare-al-meglio-webkit-inspector/</link>
      <pubDate>Fri, 15 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-usare-al-meglio-webkit-inspector/</guid>
      <description>&lt;p&gt;Se vi occupate di frontend non perdetevi lo spettacolare articolo in cui Majd Taby ci spiega &lt;!-- raw HTML omitted --&gt;come usare al meglio il WebKit Inspector&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il panorama mobile è monopolizzato da WebKit e di conseguenza gran parte degli strumenti e dell’infrastruttura per lo sviluppo di applicazioni frontend mobile (e non solo, ndr) risiedono nel WebKit Inspector. Per questo ne analizzerò con cura gli strumenti e spiegherò come e quando usarli.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se vi occupate di frontend non perdetevi lo spettacolare articolo in cui Majd Taby ci spiega <!-- raw HTML omitted -->come usare al meglio il WebKit Inspector<!-- raw HTML omitted -->.</p>
<blockquote>
<p>Il panorama mobile è monopolizzato da WebKit e di conseguenza gran parte degli strumenti e dell’infrastruttura per lo sviluppo di applicazioni frontend mobile (e non solo, ndr) risiedono nel WebKit Inspector. Per questo ne analizzerò con cura gli strumenti e spiegherò come e quando usarli.</p></blockquote>
<p>Ci sono anche le <!-- raw HTML omitted -->slide<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows Azure ora supporta ufficialmente Python</title>
      <link>https://nicolaiarocci.com/windows-azure-ora-supporta-ufficialmente-python/</link>
      <pubDate>Fri, 08 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/windows-azure-ora-supporta-ufficialmente-python/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Windows Azure ora supporta ufficialmente Python. La &lt;!-- raw HTML omitted --&gt;pagina ufficiale&lt;!-- raw HTML omitted --&gt; consente di scaricare l’SDK e contiene alcuni tutorial per la creazione di applicazioni Django, Python e IPython direttamente da Visual Studio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Windows Azure ora supporta ufficialmente Python. La <!-- raw HTML omitted -->pagina ufficiale<!-- raw HTML omitted --> consente di scaricare l’SDK e contiene alcuni tutorial per la creazione di applicazioni Django, Python e IPython direttamente da Visual Studio.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Convertire una data JSON in un oggetto datetime Python</title>
      <link>https://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/</link>
      <pubDate>Thu, 07 Jun 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/convertire-una-data-json-in-un-oggetto-datetime-python/</guid>
      <description>&lt;p&gt;Abbiamo una stringa JSON che contiene una data:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;fonte = &#39;{&amp;quot;ragione_sociale&amp;quot;: &amp;quot;CIR 2000&amp;quot;, &amp;quot;aggiornato_il&amp;quot;: &amp;quot;Wed, 06 Jun 2012 14:19:53 UTC&amp;quot;}&#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vediamo che succede se la convertiamo in un dizionario Python:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import simplejson as json

json.loads(fonte)
{&#39;aggiornato_il&#39;: &#39;Wed, 06 Jun 2012 14:19:53 UTC &#39;, &#39;ragione_sociale&#39;: &#39;CIR 2000&#39;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Facile, vero? C’è però un piccolo problema: &lt;code&gt;aggiornato_il&lt;/code&gt; è ancora una stringa mentre a noi, per poterlo elaborare comodamente, serve un campo &lt;code&gt;datetime.datetime&lt;/code&gt;. Come mai il pur potente modulo &lt;code&gt;simplejson&lt;/code&gt; non converte correttamente la nostra data?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Abbiamo una stringa JSON che contiene una data:</p>
<pre><code>fonte = '{&quot;ragione_sociale&quot;: &quot;CIR 2000&quot;, &quot;aggiornato_il&quot;: &quot;Wed, 06 Jun 2012 14:19:53 UTC&quot;}'
</code></pre>
<p>Vediamo che succede se la convertiamo in un dizionario Python:</p>
<pre><code>import simplejson as json

json.loads(fonte)
{'aggiornato_il': 'Wed, 06 Jun 2012 14:19:53 UTC ', 'ragione_sociale': 'CIR 2000'}
</code></pre>
<p>Facile, vero? C’è però un piccolo problema: <code>aggiornato_il</code> è ancora una stringa mentre a noi, per poterlo elaborare comodamente, serve un campo <code>datetime.datetime</code>. Come mai il pur potente modulo <code>simplejson</code> non converte correttamente la nostra data?</p>
<h2 id="il-problema">Il problema</h2>
<p>Il fatto è che il JSON originale non fa nulla per informarci del fatto che il campo <code>aggiornato_il</code> esprime in realtà una data. La radice del problema sta nello standard JSON il quale non contempla la dichiarazione esplicita dei tipi di dati. In effetti la stessa questione si pone nella conversione di un numero non intero: va considerato un float, oppure un decimal? In quest’ultimo caso <code>simplejson</code> ci viene in aiuto con il parametro parse_float:</p>
<pre><code>import simplejson as json

json.loads('1.1', parse_float=decimal.Decimal)
Decimal('1.1')
</code></pre>
<p>Purtroppo, per il motivo visto prima, non esiste un equivalente per le date.</p>
<h2 id="la-soluzione-classica">La soluzione classica</h2>
<p>In questi casi la prassi comune è rendere esplicito, già all’interno della stringa JSON, il formato del campo. Qualcosa del genere:</p>
<pre><code>{&quot;aggiornato_il&quot;: &quot;$date: Wed, 06 Jun 2012 14:19:53 UTC&quot;}
</code></pre>
<p>Così facendo possiamo in seguito manipolare il dizionario restituito dal metodo <code>loads</code>: intercettare la direttiva <code>$date</code> e sostituire finalmente la stringa con una data. Una soluzione più raffinata è quella di sfruttare l’opzione <code>object_hook</code> che consente di invocare una nostra funzione ad ogni chiamata del metodo <code>loads</code>.</p>
<h2 id="la-mia-soluzione">La mia soluzione</h2>
<p>Nel mio caso il provider JSON è esterno, e non desidero obbligarlo a pre-processare le stringhe JSON inserendo clausole $date arbitrarie solo per soddisfare le esigenze della mia applicazione. Sfruttando l’opzione object_hook già accennata ho ottenuto una soluzione del tutto trasparente:</p>
<pre><code>fonte = '{&quot;aggiornato_il&quot;: &quot;Thu, 1 Mar 2012 10:00:49 UTC&quot;}'
dct = json.loads(fonte, object_hook=datetime_parser)
dct
{u'aggiornato_il': datetime.datetime(2012, 3, 1, 10, 0, 49)}


def datetime_parser(dct):
    for k, v in dct.items():
        if isinstance(v, basestring) and re.search(&quot; UTC&quot;, v):
            try:
                dct[k] = datetime.datetime.strptime(v, DATE_FORMAT)
            except:
                pass
    return dct
</code></pre>
<p>La funzione <code>datetime_parser</code> esamina gli elementi della stringa JSON. In caso di corrispondenza alla espressione regolare indicata in <code>re.search</code> tentiamo una conversione diretta al formato <code>datetime</code>. Data la specificità della espressione regolare la conversione dovrebbe avere successo. Il blocco <code>try... except</code> ci permette di ignorare un eventuale errore: in questo caso infatti presumiamo che si tratti di una stringa vera e propria e non, malgrado la somiglianza, di una data. L’unico vincolo imposto al provider JSON è l’adozione di un formato standard per rappresentare le date. Nel mio caso è il seguente:</p>
<pre><code>DATE_FORMAT = '%a, %d %b %Y %H:%M:%S UTC'
</code></pre>
<p>Per approfondimenti vi consiglio:</p>
<ul>
<li><!-- raw HTML omitted -->JSON econdoer and decoder<!-- raw HTML omitted --></li>
<li><a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/" title="Introduzione alle Regular Expression">Introduzione alle Regular Expression</a></li>
</ul>
<p>Per completezza c’è da aggiungere che l’adozione di un <!-- raw HTML omitted -->json schema<!-- raw HTML omitted --> consentirebbe la specifica dei tipi di dati JSON. Quest’ultima soluzione però, data la sua complessità, non è applicabile nel mio e in molti altri casi.</p>
<p>PS: ne ho scritto anche su <!-- raw HTML omitted -->Stack Overflow<!-- raw HTML omitted -->.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Xamarin abbandona il progetto Silverlight per Linux</title>
      <link>https://nicolaiarocci.com/xamarin-abbandona-il-progetto-silverlight-per-linux/</link>
      <pubDate>Wed, 30 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/xamarin-abbandona-il-progetto-silverlight-per-linux/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Moonlight, l’implementazione open-source di Silverlight per sistemi Linux, è stata &lt;!-- raw HTML omitted --&gt;abbandonata da Xamarin&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Abbiamo abbandonato Moonlight (…) Il web non ha addotato Silverlight; non ha avuto il successo che mi aspettavo. &lt;strong&gt;Miguel de Icaza&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Un’altro chiodo sulla bara di Silverlight. Dei dubbi sul futuro della tecnologia Microsoft avevo già scritto in occasione della sua &lt;a href=&#34;http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/&#34; title=&#34;Windows 8 e i dubbi sul destino di Silverlight&#34;&gt;mancata adozione in Windows 8&lt;/a&gt; e al momento dell’annuncio di &lt;a href=&#34;http://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/&#34; title=&#34;Silverlight 5 vs HTML5&#34;&gt;Silverlight 5&lt;/a&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Moonlight, l’implementazione open-source di Silverlight per sistemi Linux, è stata <!-- raw HTML omitted -->abbandonata da Xamarin<!-- raw HTML omitted -->.</p>
<blockquote>
<p>Abbiamo abbandonato Moonlight (…) Il web non ha addotato Silverlight; non ha avuto il successo che mi aspettavo. <strong>Miguel de Icaza</strong></p></blockquote>
<p>Un’altro chiodo sulla bara di Silverlight. Dei dubbi sul futuro della tecnologia Microsoft avevo già scritto in occasione della sua <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e i dubbi sul destino di Silverlight">mancata adozione in Windows 8</a> e al momento dell’annuncio di <a href="http://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/" title="Silverlight 5 vs HTML5">Silverlight 5</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Primi passi con SSH</title>
      <link>https://nicolaiarocci.com/primi-passi-con-ssh/</link>
      <pubDate>Wed, 23 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/primi-passi-con-ssh/</guid>
      <description>&lt;p&gt;Se siete ai primi passi nello sviluppo di applicazioni web vi consiglio la lettura di &lt;!-- raw HTML omitted --&gt;SSH: What and How&lt;!-- raw HTML omitted --&gt;. Senza troppi fronzoli l’articolo spiega le basi di SSH mettendo bene in luce le possibilità offerte da questo importante strumento di lavoro.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ogni giorno molti sviluppatori web usano SSH (“Secure Shell”) per gestire i loro server, fare backup, lavorare in remoto e una miriade di altre cosette. Oggi vi spiego cos’è e da dove viene SSH e, soprattutto, vi insegno come configurarlo sul vostro server remoto o sulla vostra rete locale. Cominciamo!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se siete ai primi passi nello sviluppo di applicazioni web vi consiglio la lettura di <!-- raw HTML omitted -->SSH: What and How<!-- raw HTML omitted -->. Senza troppi fronzoli l’articolo spiega le basi di SSH mettendo bene in luce le possibilità offerte da questo importante strumento di lavoro.</p>
<blockquote>
<p>Ogni giorno molti sviluppatori web usano SSH (“Secure Shell”) per gestire i loro server, fare backup, lavorare in remoto e una miriade di altre cosette. Oggi vi spiego cos’è e da dove viene SSH e, soprattutto, vi insegno come configurarlo sul vostro server remoto o sulla vostra rete locale. Cominciamo!</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Come annullare una Commit in Git</title>
      <link>https://nicolaiarocci.com/come-annullare-una-commit-in-git/</link>
      <pubDate>Thu, 17 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-annullare-una-commit-in-git/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Usando &lt;!-- raw HTML omitted --&gt;Git&lt;!-- raw HTML omitted --&gt; capita ogni tanto, vuoi per stanchezza o per distrazione, di lanciare commit sbagliate. Stamattina m’è capitato di sistemare del codice, testarlo e fare la commit… solo per scoprire di aver lavorato sulla branch sbagliata! Non è la prima volta che mi succede e non sarà nemmeno l’ultima. Poiché ho scarsa memoria ogni volta mi tocca usare google e ripescare quei due o tre comandi utili in questi casi. Ho pensato di appuntarli qui, un po’ per metterli a disposizione di tutti, un po’ per poterli ritrovare facilmente.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Usando <!-- raw HTML omitted -->Git<!-- raw HTML omitted --> capita ogni tanto, vuoi per stanchezza o per distrazione, di lanciare commit sbagliate. Stamattina m’è capitato di sistemare del codice, testarlo e fare la commit… solo per scoprire di aver lavorato sulla branch sbagliata! Non è la prima volta che mi succede e non sarà nemmeno l’ultima. Poiché ho scarsa memoria ogni volta mi tocca usare google e ripescare quei due o tre comandi utili in questi casi. Ho pensato di appuntarli qui, un po’ per metterli a disposizione di tutti, un po’ per poterli ritrovare facilmente.</p>
<h2 id="annullare-una-commit">Annullare una commit</h2>
<p>Se ancora non è stato stato eseguito il push verso un repo remoto:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In Git <code>HEAD</code> è la commit più recente mentre <code>HEAD^</code> è la penultima (<code>HEAD^^</code> è la terzultima). In alternativa è possibile indicare l’SHA-1 dell’hash della commit alla quale si vuole tornare, qualunque essa sia:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il numero di hash di ogni commit è rintracciabile con un semplice <code>git log --oneline</code></p>
<h2 id="differenza-tra---soft-e---hard">Differenza tra <code>--soft</code> e <code>--hard</code></h2>
<p>L’opzione <code>--soft</code> cancella la commit ma lascia i file invariati. Se volete riportare anche i file allo stato in cui si trovavano alla penultima commit:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Questo porterà “indietro nel tempo” il vostro repo, alla penultima commit. Sarà come se le ultime modifiche (e con esse l’ultima commit) non fossero mai esistite.</p>
<h2 id="e-se-la-commit-è-già-finita-nel-repository">E se la commit è già finita nel repository?</h2>
<p>Se la commit è già stata inviata a un repo remoto (push) è necessario seguire un’altra procedura:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Questo comando crea una <em>nuova commit</em> che annulla tutto ciò che è stato introdotto dalla commit indesiderata.</p>]]></content:encoded>
    </item>
    <item>
      <title>Git si è rifatto il look (e non solo)</title>
      <link>https://nicolaiarocci.com/git-si-e-rifatto-il-look-e-non-solo/</link>
      <pubDate>Tue, 08 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/git-si-e-rifatto-il-look-e-non-solo/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Il sito del &lt;!-- raw HTML omitted --&gt;progetto Git&lt;!-- raw HTML omitted --&gt; è stato finalmente aggiornato. Nuova grafica, nuovo logo, ottimizzazione dei contenuti e soprattutto integrazione di importanti risorse prima ospitate altrove: la &lt;!-- raw HTML omitted --&gt;Git Reference&lt;!-- raw HTML omitted --&gt;, il libro &lt;!-- raw HTML omitted --&gt;ProGit&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;Why Git is Better Than X&lt;!-- raw HTML omitted --&gt; e il nuovo progetto &lt;!-- raw HTML omitted --&gt;Git Video Series&lt;!-- raw HTML omitted --&gt;, che include quattro bei filmati già pronti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Il sito del <!-- raw HTML omitted -->progetto Git<!-- raw HTML omitted --> è stato finalmente aggiornato. Nuova grafica, nuovo logo, ottimizzazione dei contenuti e soprattutto integrazione di importanti risorse prima ospitate altrove: la <!-- raw HTML omitted -->Git Reference<!-- raw HTML omitted -->, il libro <!-- raw HTML omitted -->ProGit<!-- raw HTML omitted -->, <!-- raw HTML omitted -->Why Git is Better Than X<!-- raw HTML omitted --> e il nuovo progetto <!-- raw HTML omitted -->Git Video Series<!-- raw HTML omitted -->, che include quattro bei filmati già pronti.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Conosco solo PHP. Come scrivo una applicazione web in Python?</title>
      <link>https://nicolaiarocci.com/conosco-solo-php-come-scrivo-una-applicazione-web-in-python/</link>
      <pubDate>Mon, 07 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/conosco-solo-php-come-scrivo-una-applicazione-web-in-python/</guid>
      <description>&lt;p&gt;Venite da PHP e siete incuriositi da Python? Vi consiglio la lettura di &lt;!-- raw HTML omitted --&gt;Python FAQ Webdev&lt;!-- raw HTML omitted --&gt;: i web framework Python dal punto di vista di un ex sviluppatore PHP.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Venite da PHP e siete incuriositi da Python? Vi consiglio la lettura di <!-- raw HTML omitted -->Python FAQ Webdev<!-- raw HTML omitted -->: i web framework Python dal punto di vista di un ex sviluppatore PHP.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Opportunità per esperti Joomla e PHP</title>
      <link>https://nicolaiarocci.com/opportunita-per-esperti-joomla-e-php/</link>
      <pubDate>Sun, 06 May 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/opportunita-per-esperti-joomla-e-php/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ogni tanto ricevo proposte di lavoro che non sono in grado di soddisfare né direttamente (per mancanza di tempo o know-how) né indirettamente (passando nomi di colleghi e conoscenti). E’ questo il caso della richiesta di Michele, che vi propongo nel caso qualcuno di voi sia interessato. Sia chiaro che io non c’entro e non ci guadagno nulla; mi interessa solo favorire domanda e offerta e mi limito, col permesso dell’autore, a ripubblicare il suo annuncio. Se siete interessati contattate Michele direttamente:&lt;/em&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Ogni tanto ricevo proposte di lavoro che non sono in grado di soddisfare né direttamente (per mancanza di tempo o know-how) né indirettamente (passando nomi di colleghi e conoscenti). E’ questo il caso della richiesta di Michele, che vi propongo nel caso qualcuno di voi sia interessato. Sia chiaro che io non c’entro e non ci guadagno nulla; mi interessa solo favorire domanda e offerta e mi limito, col permesso dell’autore, a ripubblicare il suo annuncio. Se siete interessati contattate Michele direttamente:</em></p>
<p>Sono un IM professionista da oltre 4 anni. Questo è il mio lavoro e lo faccio piuttosto bene. Ultimamente ho deciso di lanciare un sito di annunci italiano ed ho acquistato uno script pronto ed abbastanza complesso basato su joomla. Mi servono svariate modifiche sia nel frontend che nella admin panel (perlopiù semplificazioni) più la traduzione di tutte le voci presenti dall’inglese all’italiano.</p>
<p>Non sono un perditempo e non lavoro con gente mediocre o ragazzini ma solo con professionisti seri. Valuto la possibilità di far subentrare un socio/webmaster in questo progetto. Io mi occuperò della pubblicità/visibilità più inpage e offpage optimization e in generale del posizionamento mentre il socio avrà a che fare con degli aspetti prettamente tecnici e con tutte le migliorie da apportare di volta in volta al sito. Il candidato ideale deve avere buone conoscenze di joomla, php, html, javascript e possibilmente anche un po’ di ajax. Maggiori dettagli saranno forniti ai candidati che daranno prova di soddisfare le richieste sopra specificate.</p>
<ul>
<li>Tipo di committente: privato</li>
<li>Nominativo committente: Michele</li>
<li>E-mail: mikivv[at]aol.com</li>
<li>Luogo di lavoro: telelavoro</li>
<li>Tipo di contratto: freelancer/progetto (eventualmente webmaster/socio a tempo indeterminato)</li>
<li>Budget massimo (riferito solo alle modifiche/traduzione frontend dello script): €1.000</li>
<li>Valuto possibilità di assumere webmaster a tempo indeterminato o far subentrare socio nel progetto.</li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Guido van Rossum a EuroPython 2012</title>
      <link>https://nicolaiarocci.com/guido-van-rossum-a-europython-2012/</link>
      <pubDate>Fri, 20 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/guido-van-rossum-a-europython-2012/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Partenza col botto per &lt;!-- raw HTML omitted --&gt;EuroPython 2012&lt;!-- raw HTML omitted --&gt;. I keynote introduttivi saranno tenuti nientemeno che dal creatore stesso del linguaggio, Guido Van Rossum, e da Alex Martelli. Ieri è stato annunciato il &lt;!-- raw HTML omitted --&gt;programma ufficiale&lt;!-- raw HTML omitted --&gt; e a quanto pare mi spetta l’inaugurazione della italian track martedì 3 luglio. Il giorno successivo sarò impegnato, ancora di prima mattina, con la versione in lingua inglese del mio talk:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Partenza col botto per <!-- raw HTML omitted -->EuroPython 2012<!-- raw HTML omitted -->. I keynote introduttivi saranno tenuti nientemeno che dal creatore stesso del linguaggio, Guido Van Rossum, e da Alex Martelli. Ieri è stato annunciato il <!-- raw HTML omitted -->programma ufficiale<!-- raw HTML omitted --> e a quanto pare mi spetta l’inaugurazione della italian track martedì 3 luglio. Il giorno successivo sarò impegnato, ancora di prima mattina, con la versione in lingua inglese del mio talk:</p>
<blockquote>
<p><!-- raw HTML omitted -->Sviluppare una RESTful Web API con Python, Flask e MongoDB<!-- raw HTML omitted --></p>
<p>Nel corso dell’ultimo anno abbiamo lavorato all’implementazione Python di una RESTful Web API completa. Abbiamo imparato un bel po’ di cose sui best pattern REST e, naturalmente, abbiamo messo alla prova le ben note capacità web di Python, rilasciando nel frattempo un paio di progetti Open Source. Nel corso del mio intervento condividerò quel che abbiamo imparato. Prenderemo in considerazione il problematico design di una REST API ‘pura’. Vedremo che cosa offre Python in questo campo e scenderemo infine nel dettaglio, dando una occhiata al codice che abbiamo scritto. Alcune tecnologie/stack che tratteremo sono (in nessun ordine particolare): Flask, PyMongo, MongoDB, REST, JSON, XML, Heroku. Lo sapevi? Che ti piaccia o no, c’è una REST API nel tuo futuro.</p></blockquote>
<p>Scorrendo la lista degli speaker scopro che anche Amin Roacher, autore di Flask, e Ross Lawley di 10Gen (MongoDB) saranno della partita. Insomma ammetto che un po’ d’ansia da prestazione comincia ad affiorare. Sarà una bella sfida, e non vedo l’ora di affrontarla. Conto molto sul vostro supporto e incoraggiamento: ne avrò bisogno 😉</p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare Git un passo alla volta con Git Immersion</title>
      <link>https://nicolaiarocci.com/imparare-git-un-passo-alla-volta-con-git-immersion/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-git-un-passo-alla-volta-con-git-immersion/</guid>
      <description>&lt;p&gt;Già sapete che Git è uno degli strumenti senza i quali non potrei più vivere, ne ho scritto anche recentemente in &lt;a href=&#34;http://nicolaiarocci.com/branching-di-successo-per-git/&#34; title=&#34;Branching di successo per Git&#34;&gt;Branching di successo per Git&lt;/a&gt; e &lt;a href=&#34;http://nicolaiarocci.com/usare-git-con-dropbox/&#34; title=&#34;Usare Git con Dropbox&#34;&gt;Usare Git con Dropbox&lt;/a&gt;. Oggi vi propongo &lt;!-- raw HTML omitted --&gt;Git Immersion&lt;!-- raw HTML omitted --&gt;, fantastico sito-laboratorio per “immergersi” in Git imparandolo passo dopo passo.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;blockquote&gt;
&lt;p&gt;Git Immersion è un tour guidato che ti accompagna in una passeggiata tra i fondamenti di Git, ispirato dalla premessa che conoscere una cosa significa usarla. Git è un sistema potente e sofisticato per il controllo di versione distribuito. Per lo sviluppatore conoscere e comprenderne le caratteristiche significa aprirsi a un nuovo e liberatorio approccio alla gestione del codice sorgente. Il modo migliore per padroneggiare Git è immergesi nelle sue utility ed operazioni, sperimentarlo in prima persona.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Già sapete che Git è uno degli strumenti senza i quali non potrei più vivere, ne ho scritto anche recentemente in <a href="http://nicolaiarocci.com/branching-di-successo-per-git/" title="Branching di successo per Git">Branching di successo per Git</a> e <a href="http://nicolaiarocci.com/usare-git-con-dropbox/" title="Usare Git con Dropbox">Usare Git con Dropbox</a>. Oggi vi propongo <!-- raw HTML omitted -->Git Immersion<!-- raw HTML omitted -->, fantastico sito-laboratorio per “immergersi” in Git imparandolo passo dopo passo.</p>
<!-- raw HTML omitted -->
<blockquote>
<p>Git Immersion è un tour guidato che ti accompagna in una passeggiata tra i fondamenti di Git, ispirato dalla premessa che conoscere una cosa significa usarla. Git è un sistema potente e sofisticato per il controllo di versione distribuito. Per lo sviluppatore conoscere e comprenderne le caratteristiche significa aprirsi a un nuovo e liberatorio approccio alla gestione del codice sorgente. Il modo migliore per padroneggiare Git è immergesi nelle sue utility ed operazioni, sperimentarlo in prima persona.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Speaker a EuroPython 2012</title>
      <link>https://nicolaiarocci.com/speaker-a-europython-2012/</link>
      <pubDate>Fri, 13 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/speaker-a-europython-2012/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Date un’occhiata al &lt;!-- raw HTML omitted --&gt;sito ufficiale&lt;!-- raw HTML omitted --&gt; per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta &lt;em&gt;early bird&lt;/em&gt; per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>EuroPython è la conferenza europea di riferimento per il linguaggio Python. Si terrà anche quest’anno a Firenze, dal 2 al 8 luglio. Sono in programma molti interventi davvero interessanti, cosa che rende ancor più soprendente il fatto che i miei talk siano stati votati così tanto.</p>
<!-- raw HTML omitted -->
<p>Date un’occhiata al <!-- raw HTML omitted -->sito ufficiale<!-- raw HTML omitted --> per saperne di più sulla conferenza (in questo momento è ancora possibile approfittare dell’offerta <em>early bird</em> per l’acquisto dei biglietti); maggiori informazioni sui miei interventi tra qualche tempo, quando sarà ufficializzato il calendario dei talk.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Comprendere il MVVM – Guida per Sviluppatori JavaScript</title>
      <link>https://nicolaiarocci.com/comprendere-il-mvvm-guida-per-sviluppatori-javascript/</link>
      <pubDate>Wed, 11 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/comprendere-il-mvvm-guida-per-sviluppatori-javascript/</guid>
      <description>&lt;p&gt;Addy Osmani ne ha combinata un’altra delle sue:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;MVVM (Model View ViewModel) è un pattern architetturale basato su MVC e MVP, che tenta di separare chiaramente lo sviluppo della interfaccia utente (UI) da quelle che sono business logic e comportamento dell’applicazione. A questo fine, molte implementazioni del pattern ricorrono a un uso dichiarativo dei data bindings, per consentire la separazione del lavoro sulle Viste (View) dagli altri strati (layer).&lt;/p&gt;
&lt;p&gt;MVVM consente creazione di UI  e sviluppo del codice in parallelo, all’interno della stessa base di codice. Gli esperti UI scrivono bindings per il ViewModel all’interno del loro markup (HTML), mentre il Model e il ViewModel sono gestiti dagli sviluppatori che lavorano alla logica dell’applicazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Addy Osmani ne ha combinata un’altra delle sue:</p>
<blockquote>
<p>MVVM (Model View ViewModel) è un pattern architetturale basato su MVC e MVP, che tenta di separare chiaramente lo sviluppo della interfaccia utente (UI) da quelle che sono business logic e comportamento dell’applicazione. A questo fine, molte implementazioni del pattern ricorrono a un uso dichiarativo dei data bindings, per consentire la separazione del lavoro sulle Viste (View) dagli altri strati (layer).</p>
<p>MVVM consente creazione di UI  e sviluppo del codice in parallelo, all’interno della stessa base di codice. Gli esperti UI scrivono bindings per il ViewModel all’interno del loro markup (HTML), mentre il Model e il ViewModel sono gestiti dagli sviluppatori che lavorano alla logica dell’applicazione.</p></blockquote>
<p><!-- raw HTML omitted -->Comprendere il MVVM – Guida per Sviluppatori JavaScript<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Imparare HTML e CSS Online con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/</link>
      <pubDate>Tue, 03 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-html-e-css-online-con-codecademy/</guid>
      <description>&lt;p&gt;Codecademy propone da ieri un corso gratuito e interattivo su &lt;!-- raw HTML omitted --&gt;HTML e CSS&lt;!-- raw HTML omitted --&gt;. Il corso, per principianti, si affianca a quello ormai collaudato (e recentemente ampliato) su JavaScript.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il meccanismo è quello della &lt;em&gt;gamification&lt;/em&gt;, con tanto di punteggi e badge da conquistare man mano che si raggiungono obiettivi prefissati . Presto dovrebbe uscire anche un corso su Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Codecademy propone da ieri un corso gratuito e interattivo su <!-- raw HTML omitted -->HTML e CSS<!-- raw HTML omitted -->. Il corso, per principianti, si affianca a quello ormai collaudato (e recentemente ampliato) su JavaScript.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il meccanismo è quello della <em>gamification</em>, con tanto di punteggi e badge da conquistare man mano che si raggiungono obiettivi prefissati . Presto dovrebbe uscire anche un corso su Python.</p>
<blockquote>
<p>Compi i tuoi primi passi con HTML e CSS. Non è necessaria alcuna esperienza precedente — cominceremo dalle basi e in poco tempo ti ritroverai a lavorare alla tua homepage personale!</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Evidenziare il codice sorgente via JavaScript e CSS con Rainbow</title>
      <link>https://nicolaiarocci.com/evidenziare-il-codice-sorgente-via-javascript-e-css-con-rainbow/</link>
      <pubDate>Mon, 02 Apr 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/evidenziare-il-codice-sorgente-via-javascript-e-css-con-rainbow/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Rainbow&lt;!-- raw HTML omitted --&gt; è una libreria per l’evidenziazione del codice scritta in Javascript. E’ leggera (1.4kb), facile da usare, estensibile e completamente configurabile via CSS.&lt;/p&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p><!-- raw HTML omitted -->Rainbow<!-- raw HTML omitted --> è una libreria per l’evidenziazione del codice scritta in Javascript. E’ leggera (1.4kb), facile da usare, estensibile e completamente configurabile via CSS.</p></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Ritrovato il codice sorgente di Prince of Persia perduto 23 anni fa</title>
      <link>https://nicolaiarocci.com/ritrovato-il-codice-sorgente-di-prince-of-persia-perduto-23-anni-fa/</link>
      <pubDate>Fri, 30 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ritrovato-il-codice-sorgente-di-prince-of-persia-perduto-23-anni-fa/</guid>
      <description>&lt;p&gt;Jordan Mechner creò &lt;!-- raw HTML omitted --&gt;Prince of Persia&lt;!-- raw HTML omitted --&gt; 23 anni fa. Era il 1989 quando il gioco uscì per Apple II. Negli anni seguenti si sono succedute diverse edizioni moderne di grande successo, ma nessuna affascinante come l’originale (almeno non per noi, vecchi tromboni nostalgici).&lt;/p&gt;
&lt;p&gt;Pochi sanno che il codice sorgente originale era andato perduto. Mechner l’aveva cercato ovunque senza successo, perdendo ogni speranza di rintraccialo. Finché, proprio ieri, suo padre non è sceso in cantina. Da un scatolone che conteneva confezioni sigillate del mitico &lt;!-- raw HTML omitted --&gt;Karateka &lt;!-- raw HTML omitted --&gt;(1984 &lt;em&gt;– quante partite sul mio C64!&lt;/em&gt;) sono spuntate tre confezioni di floppy disk Apple ProDOS da 3.5″: contenevano il codice perduto.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Jordan Mechner creò <!-- raw HTML omitted -->Prince of Persia<!-- raw HTML omitted --> 23 anni fa. Era il 1989 quando il gioco uscì per Apple II. Negli anni seguenti si sono succedute diverse edizioni moderne di grande successo, ma nessuna affascinante come l’originale (almeno non per noi, vecchi tromboni nostalgici).</p>
<p>Pochi sanno che il codice sorgente originale era andato perduto. Mechner l’aveva cercato ovunque senza successo, perdendo ogni speranza di rintraccialo. Finché, proprio ieri, suo padre non è sceso in cantina. Da un scatolone che conteneva confezioni sigillate del mitico <!-- raw HTML omitted -->Karateka <!-- raw HTML omitted -->(1984 <em>– quante partite sul mio C64!</em>) sono spuntate tre confezioni di floppy disk Apple ProDOS da 3.5″: contenevano il codice perduto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La <!-- raw HTML omitted -->lieta novella<!-- raw HTML omitted --> si deve allo stesso Mechner, ora impegnato nel non banale tentativo di riuscire a leggere il contenuto dei vecchi floppy per poi trasferirlo sul suo MacBook Air. Su Flickr è stato pubblicato il <!-- raw HTML omitted -->set fotografico<!-- raw HTML omitted --> dei floppy disk originali.</p>
<p>Per i nostalgici della mia età (e per i giovani curiosi) ecco il filmato di una sessione di gioco del Prince of Persia originale: la fuga dalle prigioni del Califfo.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p><em>Aggiornamento: il codice sorgente di Prince of Persia è stato recuperato ed è ora disponibile su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>ASP.NET MVC, Web API, ASP.NET Web Pages (Razor) sono Open Source</title>
      <link>https://nicolaiarocci.com/asp-net-mvc-web-api-asp-net-web-pages-razor-sono-open-source/</link>
      <pubDate>Wed, 28 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/asp-net-mvc-web-api-asp-net-web-pages-razor-sono-open-source/</guid>
      <description>&lt;p&gt;Oggi Microsoft annuncia una svolta che ha del clamoroso:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sono felice di annunciare che oggi rilasciamo il codice sorgente di ASP.NET Web API e ASP.NET Web Pages (Razor) sotto una licenza open source (Apache 2.0), e che continueremo a migliorare la trasparenza di tutti i tre progetti ospitando il loro codice sorgente su CodePlex (usando il nuovo supporto per Git annunciato la settimana scorsa).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ma quel che più conta, e che per un’azienda corporate ‘vecchia maniera’ come Microsoft denota davvero un’evoluzione (rivoluzione) culturale:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Oggi Microsoft annuncia una svolta che ha del clamoroso:</p>
<blockquote>
<p>Sono felice di annunciare che oggi rilasciamo il codice sorgente di ASP.NET Web API e ASP.NET Web Pages (Razor) sotto una licenza open source (Apache 2.0), e che continueremo a migliorare la trasparenza di tutti i tre progetti ospitando il loro codice sorgente su CodePlex (usando il nuovo supporto per Git annunciato la settimana scorsa).</p></blockquote>
<p>Ma quel che più conta, e che per un’azienda corporate ‘vecchia maniera’ come Microsoft denota davvero un’evoluzione (rivoluzione) culturale:</p>
<blockquote>
<p>Per la prima volta consentiremo agli sviluppatori esterni a Microsoft di proporre patches e contributi di codice, che il nostro team di sviluppo valuterà per la potenziale inclusione diretta nei prodotti.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Infografica: PHP vs Ruby vs Python</title>
      <link>https://nicolaiarocci.com/infografica-php-vs-ruby-vs-python/</link>
      <pubDate>Wed, 21 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/infografica-php-vs-ruby-vs-python/</guid>
      <description>&lt;p&gt;I linguaggi di programmazione ‘moderni’ a confronto: PHP vs Ruby vs Python. Lo scorso gennaio &lt;!-- raw HTML omitted --&gt;Udemy&lt;!-- raw HTML omitted --&gt; ha rilasciato una bella infografica che confronta i tre linguaggi sotto molti aspetti. Ne esce una fotografia secondo me interessante dell’attuale panorama dei linguaggi interpretati:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>I linguaggi di programmazione ‘moderni’ a confronto: PHP vs Ruby vs Python. Lo scorso gennaio <!-- raw HTML omitted -->Udemy<!-- raw HTML omitted --> ha rilasciato una bella infografica che confronta i tre linguaggi sotto molti aspetti. Ne esce una fotografia secondo me interessante dell’attuale panorama dei linguaggi interpretati:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>]]></content:encoded>
    </item>
    <item>
      <title>Amazon EC2: Quanto si risparmia con le Reserved Instances rispetto alle classiche On-Demand?</title>
      <link>https://nicolaiarocci.com/amazon-ec2-quanto-si-risparmia-con-le-reserved-instances-rispetto-alle-classiche-on-demand/</link>
      <pubDate>Mon, 19 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/amazon-ec2-quanto-si-risparmia-con-le-reserved-instances-rispetto-alle-classiche-on-demand/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Amazon offre sconti significativi per chi sceglie le istanze riservate al posto di quelle on-demand. Dal punto di vista finanziario, e se avete intenzione di usare EC2 per almeno un anno, passare dalle istanze on-demand a quelle riservate potrebbe aver senso. Sborserete una cifra più alta inizialmente, ma il costo mensile si ridurrà sensibilmente.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Per quanto io ne sappia il tool sviluppato da Mike Khristo è il primo che consente di confrontare direttamente, senza tanti giri di parole, il costo delle due soluzioni:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Amazon offre sconti significativi per chi sceglie le istanze riservate al posto di quelle on-demand. Dal punto di vista finanziario, e se avete intenzione di usare EC2 per almeno un anno, passare dalle istanze on-demand a quelle riservate potrebbe aver senso. Sborserete una cifra più alta inizialmente, ma il costo mensile si ridurrà sensibilmente.</p></blockquote>
<p>Per quanto io ne sappia il tool sviluppato da Mike Khristo è il primo che consente di confrontare direttamente, senza tanti giri di parole, il costo delle due soluzioni:</p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Usare Git con Dropbox</title>
      <link>https://nicolaiarocci.com/usare-git-con-dropbox/</link>
      <pubDate>Sat, 17 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/usare-git-con-dropbox/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;usare-dropbox-come-repository-git-remoto&#34;&gt;Usare Dropbox come repository Git remoto&lt;/h2&gt;
&lt;p&gt;Recentemente, più che altro per curiosità, ho giocato con una terza opzione: &lt;!-- raw HTML omitted --&gt;Dropbox&lt;!-- raw HTML omitted --&gt;. Per me Dropbox è uno strumento indispensabile sia per il lavoro che per le mie cose personali. Su qualunque computer io sia, ovunque mi trovi, grazie a Dropbox ho accesso al mio materiale. Dunque, mi son detto, perché non usarlo anche per il codice,  pur senza rinunciare al controllo versione offerto da Git?&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://db.tt/V8L8FFo&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ebbene ho scoperto che non solo è possibile, è anche molto semplice. In realtà non c’è nulla di nuovo in quel che vi mostro, la ‘magia’ la fa tutta Dropbox.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<h2 id="usare-dropbox-come-repository-git-remoto">Usare Dropbox come repository Git remoto</h2>
<p>Recentemente, più che altro per curiosità, ho giocato con una terza opzione: <!-- raw HTML omitted -->Dropbox<!-- raw HTML omitted -->. Per me Dropbox è uno strumento indispensabile sia per il lavoro che per le mie cose personali. Su qualunque computer io sia, ovunque mi trovi, grazie a Dropbox ho accesso al mio materiale. Dunque, mi son detto, perché non usarlo anche per il codice,  pur senza rinunciare al controllo versione offerto da Git?</p>
<p><a href="http://db.tt/V8L8FFo"><!-- raw HTML omitted --></a></p>
<p>Ebbene ho scoperto che non solo è possibile, è anche molto semplice. In realtà non c’è nulla di nuovo in quel che vi mostro, la ‘magia’ la fa tutta Dropbox.</p>
<h2 id="creare-un-git-repository-8216remoto8217-su-drobox">Creare un Git repository ‘remoto’ su Drobox</h2>
<p>Se siete su Linux o Mac aprite una finestra terminale; su Windows aprite semplicemente Git Bash. Se avete una installazione predefinita la cartella Dropbox si trova nella HOME di Linux e Mac, oppure nella Documenti di Windows.</p>
<p>Spostatevi nella cartella Dropbox:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una volta entrati in ~/Dropbox create un ‘bare’ repository:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il nostro repository privato, l’equivalente di un repo remoto alla GitHub per capirci, è pronto. Lo useremo per tenere sincronizzati i nostri computer. Naturalmente appoggiarci a Dropbox ci garantisce anche la possibilità di ricorrere a un restore di emergenza nel caso il codice venga perduto localmente.</p>
<h2 id="creare-il-git-repository-locale">Creare il Git repository locale</h2>
<p>Su ognuno dei computer creiamo il repository locale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Lavoriamo un po’, quindi facciamo la nostra commit locale:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Ora colleghiamo il repo “remoto” (quello in Dropbox) al nostro repository locale:</p>
<!-- raw HTML omitted -->
<p>Ora possiamo fare il push verso il remoto dei files locali. Dal branch [cci lang=”bash” theme=”default”]master[/cci] verso [cci lang=”bash” theme=”default”]origin[/cci]:</p>
<!-- raw HTML omitted -->
<p>Fatto! Possiamo simulare facilmente il lavoro su un’altro computer. Basta clonare [cci lang=”bash” theme=”default”]progetto[/cci] dal ‘remoto’, cambiare qualche file e salvarlo:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Torniamo ora al folder locale originale. Possiamo sincronizzarlo e aggiornarlo con le modifiche fatte sul “secondo computer”:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="il-versioning-di-dropbox">Il versioning di Dropbox</h2>
<p>Dropbox è dotato di un proprio sistema di versioning, pertanto aggiungere Git potrebbe sembrare superfluo. Qualunque sviluppatore avvezzo a Git vi dirà che non è così. Il versioning di Dropbox è adatto a file di testo, fogli di calcolo, immagini e quant’altro ma non ha niente a che vedere con le capacità di manutenzione e gestione dei progetti offerte da Git.</p>
<h2 id="git-e-dropbox-per-gruppi-di-lavoro">Git e Dropbox per gruppi di lavoro?</h2>
<p>E’ sufficiente condividere il folder Dropbox con altre persone per creare un ambiente di sviluppo privato ma condiviso col proprio gruppo di lavoro. In quest’ultimo caso la probabilità di conflitti aumenta notevolmente. Si tratta di una soluzione forse interessante per mini-team di 2 o 3 persone nei quali è relativamente facile evitare la generazione di conflitti (evitare le push contemporanee).</p>
<h2 id="concludendo">Concludendo</h2>
<p>BitBucket o GitHub (a pagamento) rimangono la soluzione ideale, e offrono molte funzionalità comunque assenti in Git+Dropbox (interfaccia web, wiki, issues, eccetera). Per piccoli progetti personali Dropbox offre una alternativa a buon mercato, rapida e comoda.</p>
<p><em>PS: se create un account Dropbox dal link dell’articolo, oppure da <!-- raw HTML omitted -->questo<!-- raw HTML omitted -->, ricevete 500BMB extra (e altrettanti ne otterrà il sottoscritto)!</em></p>]]></content:encoded>
    </item>
    <item>
      <title>7 Risorse Per Sviluppatori JavaScript</title>
      <link>https://nicolaiarocci.com/7-risorse-per-sviluppatori-javascript/</link>
      <pubDate>Thu, 15 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/7-risorse-per-sviluppatori-javascript/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Anni fa JavaScript era considerato più che altro una seccatura: produceva queste animazioni e trailer per il browser e poco altro. Ora tutto è cambiato. JavaScript è eletto a linguaggio funzionale di prima classe e in rete sono disponibili risorse innumerevoli . Condivido con voi alcune delle mie fonti migliori, che uso per tenermi aggiornato su librerie, progetti e JavaScript in generale. – Rob Bazinet&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Anni fa JavaScript era considerato più che altro una seccatura: produceva queste animazioni e trailer per il browser e poco altro. Ora tutto è cambiato. JavaScript è eletto a linguaggio funzionale di prima classe e in rete sono disponibili risorse innumerevoli . Condivido con voi alcune delle mie fonti migliori, che uso per tenermi aggiornato su librerie, progetti e JavaScript in generale. – Rob Bazinet</p></blockquote>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Python per Facebook</title>
      <link>https://nicolaiarocci.com/python-per-facebook/</link>
      <pubDate>Wed, 14 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-per-facebook/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Una casa per gli sviluppatori Python che lavorano con Facebook. Gestiamo due repository su GitHub. &lt;strong&gt;facebook-sdk&lt;/strong&gt;, un set di tools essenziali per lavorare con Facebook in Python. &lt;strong&gt;django-facebook&lt;/strong&gt;, un plugin estendibile per costruire siti Django integrati con Facebook.&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;via &lt;!-- raw HTML omitted --&gt;@bacchilu&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Una casa per gli sviluppatori Python che lavorano con Facebook. Gestiamo due repository su GitHub. <strong>facebook-sdk</strong>, un set di tools essenziali per lavorare con Facebook in Python. <strong>django-facebook</strong>, un plugin estendibile per costruire siti Django integrati con Facebook.</p></blockquote>
<!-- raw HTML omitted -->
<p>via <!-- raw HTML omitted -->@bacchilu<!-- raw HTML omitted --></p>
]]></content:encoded>
    </item>
    <item>
      <title>Sublime Text 2 un anno dopo</title>
      <link>https://nicolaiarocci.com/sublime-text-2-un-anno-dopo/</link>
      <pubDate>Sat, 10 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sublime-text-2-un-anno-dopo/</guid>
      <description>&lt;p&gt;Proprio un anno fa &lt;!-- raw HTML omitted --&gt;presentavo Sublime Text 2&lt;!-- raw HTML omitted --&gt;. Dopo dodici mesi ho pensato di fare il punto della situazione. Si sono susseguiti una serie di aggiornamenti importanti, il prodotto è più maturo e devo dire che in questo periodo non mi ha affatto deluso: è ancora il mio editor di codice preferito. Nel frattempo &lt;!-- raw HTML omitted --&gt;Sublime Text 2&lt;!-- raw HTML omitted --&gt; è diventato &lt;em&gt;mainstream.&lt;/em&gt; Me ne sono reso conto in questi giorni, quando articoli, recensioni, trucchi e suggerimenti su Sublime Text 2 affioravano ripetutamente nel mio feed.&lt;/p&gt;
&lt;p&gt;Vi propongo alcune delle caratteristiche che ne fanno, almeno per quanto riguarda il mio modo di lavorare, l’editor ideale.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Proprio un anno fa <!-- raw HTML omitted -->presentavo Sublime Text 2<!-- raw HTML omitted -->. Dopo dodici mesi ho pensato di fare il punto della situazione. Si sono susseguiti una serie di aggiornamenti importanti, il prodotto è più maturo e devo dire che in questo periodo non mi ha affatto deluso: è ancora il mio editor di codice preferito. Nel frattempo <!-- raw HTML omitted -->Sublime Text 2<!-- raw HTML omitted --> è diventato <em>mainstream.</em> Me ne sono reso conto in questi giorni, quando articoli, recensioni, trucchi e suggerimenti su Sublime Text 2 affioravano ripetutamente nel mio feed.</p>
<p>Vi propongo alcune delle caratteristiche che ne fanno, almeno per quanto riguarda il mio modo di lavorare, l’editor ideale.</p>
<h2 id="multi-piattaforma">Multi piattaforma</h2>
<p>Sublime Text gira egualmente bene su OSX, Windows e Linux. Lavorando su Mac a casa e con Windows in ufficio per me è sempre stato difficile trovare un editor di codice di alta qualità da poter usare in entrambi gli ambienti. TextMate? Solo per Mac. Notepad++? Solo per Windows. Si lo so che Eclipse e altre IDE sofisticate sono multi piattaforma ma il fatto è che io le IDE non le sopporto più. Le ho usate per vent’anni, e tuttora sono vincolato a Visual Studio (un prodotto comunque eccellente) per gran parte del mio tempo. Da quando sono potuto tornare alle origini, ovvero ai semplici text editor, mi ci rifugio appena possibile.</p>
<p>Bisognerebbe poi intendersi sul quel ‘semplici’ perché come vedremo Sublime Text e gli altri editor, moderni e non, sono semplici solo in apparenza.</p>
<p>Una critica a Sublime Text 2 multi piattaforma mi sento di farla, e riguarda la non completa uniformità dei menu tra le diverse piattaforme. Per esempio le Preferenze sono  nel menu principale in OSX, mentre se ricordo bene in Windows stanno in ‘Tools’.</p>
<h2 id="command-palette">Command Palette</h2>
<p>Come dicevo Sublime Text 2 è ricco di funzionalità, la gran parte attivate da menu con gran lavoro di mouse. Esistono le scorciatoie di tastiera per i comandi più frequenti, ma Sublime ci mette a disposizione qualcosa di più, la Command Palette.</p>
<p>Premete <code>Shift-Command-P</code> per ottenere l’apertura della Command Palette:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La lista contiene i comandi disponibili in Sublime. Basta scrivere <em>anche solo una parte</em> del nome del comando per ottenerne la rapida selezione. Per attivarlo basta premere <code>Invio</code>. Si tratta di una soluzione davvero comoda, alla TextMate, che risparmia il mouse ed è ben implementata. Nell’immagine vedete come per installare un nuovo package mi basti premere una lettera (la ‘i’), anche se non è quella iniziale.</p>
<h2 id="passaggio-rapido-da-un-file-all8217altro">Passaggio rapido da un file all’altro</h2>
<p>Ogni file aperto è contenuto in una scheda. Possiamo passare da un file all’altro cliccando sulle schede oppure usando la tastiera per scorrerle in sequenza. Ma possiamo anche ricorrere al comando <code>Command-P</code> per aprire una palette di selezione file, la quale implementa la stessa modalità di ricerca già vista nella Command Palette:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Ciò che rende questa palette davvero utile è il fatto che man mano che scriviamo Sublime attiva (mette in primo piano) il file che soddisfa la nostra query. Dopo un paio di volte non potrete più tornare al mouse.</p>
<h2 id="cursore-multiplo">Cursore multiplo</h2>
<p>Immaginate di selezionare più aree del codice e trattarle come se fossero tutte sotto un unico cursore. Ebbene è possibile, ed impagabile. Potete vedere questa modalità all’opera nel breve <!-- raw HTML omitted -->screencast<!-- raw HTML omitted --> messo a disposizione dai ragazzi di NetTuts, io mi limito a spiegarvi le alternative per attivarla:</p>
<ul>
<li>Premere <code>Command</code> e cliccare nei punti in cui volete attivare il cursore multiplo</li>
<li>Selezionare blocchi di testo e premere <code>Shift-Command-L</code></li>
<li>Mettere il cursore sotto una parola e premere <code>Command-D</code> per selezionarne le occorrenze successive attivando il cursore per ognuna</li>
<li>Selezionare una parola e premere <code>Control-Command-G</code> per selezionarne tutte le occorrenze attivando per ognuna il cursore</li>
</ul>
<h2 id="passaggio-rapido-a-funzioni-e-metodi">Passaggio rapido a funzioni e metodi</h2>
<p>Oltre alle funzioni di ricerca classiche possiamo passare rapidamente da un metodo all’altro ricorrendo alla magica command palette vista prima. Basta <code>Command-R</code> per attivarla:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In Visual Studio ho sempre odiato il passaggio tra funzioni/metodi/classi implementato col solo match delle lettere iniziali, e addirittura suddiviso in due combo diverse (una per gli oggetti, l’altra per i metodi). Qui siamo a tutto un’altro livello.</p>
<h2 id="c8217è-vim-dentro">C’è Vim dentro</h2>
<p>Chi è abituato a Vim non disperi: è possibile attivare la modalità ‘Vintage’ che attiva il key binding del famoso editor Unix. Magicamente abbiamo a disposizione Command e Insert mode e molti dei comandi di editing più comuni in Vim. Per informazioni consultate la pagina sul <!-- raw HTML omitted -->Vintage Mode<!-- raw HTML omitted --> della documentazione.</p>
<h2 id="e-c8217è-pure-un-po8217-textmate">E c’è pure un po’ TextMate</h2>
<p>Temi e bundle di TextMate funzionano in Sublime Text, basta metterli nel folder Packages. Se siete legati a TextMate valutate la possibilità di passare a Sublime, potrebbe valerne la pena.</p>
<h2 id="package-control">Package Control</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Sublime è ricco di estensioni (package) e consente di installare quelle TextMate. Il <!-- raw HTML omitted -->Package Control<!-- raw HTML omitted --> (da installare a parte) rende facile la loro gestione direttamente dalla Command Palette.</p>
<h2 id="concludendo">Concludendo</h2>
<p>Naturalmente non è tutto qui. Ampia scelta di temi custom e standard (io uso <!-- raw HTML omitted -->Monokai Soda<!-- raw HTML omitted -->), Plugin come se piovesse (tra i quali uso abitualmente quelli per Git e StackOverflow), modalità ‘distraction free’ e full screen, personalizzazione dei key binding, syntax highlighting di tutti i linguaggi più diffusi… ci sarebbe ancora tanto da dire.</p>
<p>Ammetto che molte di queste caratteristiche non sono una esclusiva di Sublime Text 2, tuttavia quel che apprezzo in questo prodotto è la velocità e l’immediatezza con le quali queste sono utilizzabili. Cerco di usare il mouse il meno possibile e con Sublime riesco a fare tutto senza metterci mano, il che aumenta la mia produttività. Come ogni buon editor Sublime non interferisce con la scrittura del codice ma, quando serve, è pronto a dare una mano con una ricchezza di strumenti invidiabile.</p>
<p>Spero di avervi convinto a dare una occhiata. Sublime Text 2 è a pagamento, anche se la modalità demo non è a tempo e si limita a proporre l’acquisto ogni tanto.</p>
<p>Vi lascio con l’invito a dare un’occhiata al video di Andrey Tarantsov sul suo <!-- raw HTML omitted -->Workflow con Sublime Text<!-- raw HTML omitted -->. Ha riscosso molto successo quando l’ho segnalato su Twitter, e per un buon motivo.</p>]]></content:encoded>
    </item>
    <item>
      <title>Primo importante aggiornamento del Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/primo-importante-aggiornamento-del-piccolo-libro-di-mongodb/</link>
      <pubDate>Thu, 08 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/primo-importante-aggiornamento-del-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;Se avete già scaricato il &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;Piccolo Libro di MongoDB&lt;/a&gt; vi consiglio di aggiornarlo con la versione odierna. E’ stato aggiunto un capitolo (MapReduce) misteriosamente assente nella prima edizione. Grazie a Walter Tommasi per la preziosa segnalazione, e a &lt;a href=&#34;http://nicolaiarocci.com/branching-di-successo-per-git/&#34; title=&#34;Branching di successo per Git&#34;&gt;Git&lt;/a&gt; per averne consentito il recupero in extremis.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se avete già scaricato il <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">Piccolo Libro di MongoDB</a> vi consiglio di aggiornarlo con la versione odierna. E’ stato aggiunto un capitolo (MapReduce) misteriosamente assente nella prima edizione. Grazie a Walter Tommasi per la preziosa segnalazione, e a <a href="http://nicolaiarocci.com/branching-di-successo-per-git/" title="Branching di successo per Git">Git</a> per averne consentito il recupero in extremis.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Link Consigliati dal 29.2 al 5.3.2012</title>
      <link>https://nicolaiarocci.com/link-consigliati-dal-29-2-al-5-3-2012/</link>
      <pubDate>Sun, 04 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/link-consigliati-dal-29-2-al-5-3-2012/</guid>
      <description>&lt;p&gt;&lt;em&gt;Ogni giorno su &lt;!-- raw HTML omitted --&gt;Twitter&lt;!-- raw HTML omitted --&gt; segnalo i link interessanti in cui incappo mentre mi documento per il mio lavoro. Riscuotono un certo successo, quindi ho pensato di condividerne alcuni anche qui sul sito. Parte così Link Consigliati, rubrica settimanale e sperimentale.&lt;/em&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“Why are so many developers so very emotional when it comes to their favourite programming language? Considering that no language can (yet) magically translate the perfect idea in your head into machine code, all of them exist on a scale of badness – they all limit you more than your own thoughts or the hardware does.”&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“Clean, simple web designs have become a popular trend. This article will cover the subject through a two-part discussion. First, we’ll talk about a few traits that clean designs tend to have in common. Secondly, I’ll share some tricks and techniques that can be helpful when trying to achieve a clean design.”&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Database of HTTP status codes with their IETF and Wikipedia descriptions&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;“What happens when you click on a weblink? Here’s one answer: a request goes from your computer to a server identified by the URL of the desired link. The server then locates the webpage in its files and sends it back to your browser, which then displays it on your screen. Simple.”&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Ogni giorno su <!-- raw HTML omitted -->Twitter<!-- raw HTML omitted --> segnalo i link interessanti in cui incappo mentre mi documento per il mio lavoro. Riscuotono un certo successo, quindi ho pensato di condividerne alcuni anche qui sul sito. Parte così Link Consigliati, rubrica settimanale e sperimentale.</em></p>
<!-- raw HTML omitted -->
<p>“Why are so many developers so very emotional when it comes to their favourite programming language? Considering that no language can (yet) magically translate the perfect idea in your head into machine code, all of them exist on a scale of badness – they all limit you more than your own thoughts or the hardware does.”</p>
<!-- raw HTML omitted -->
<p>“Clean, simple web designs have become a popular trend. This article will cover the subject through a two-part discussion. First, we’ll talk about a few traits that clean designs tend to have in common. Secondly, I’ll share some tricks and techniques that can be helpful when trying to achieve a clean design.”</p>
<!-- raw HTML omitted -->
<p>Database of HTTP status codes with their IETF and Wikipedia descriptions</p>
<!-- raw HTML omitted -->
<p>“What happens when you click on a weblink? Here’s one answer: a request goes from your computer to a server identified by the URL of the desired link. The server then locates the webpage in its files and sends it back to your browser, which then displays it on your screen. Simple.”</p>
<!-- raw HTML omitted -->
<p>“We occasionally try commercial software. Mostly, we don’t end up buying it. A big reason why is the incredibly time-consuming, aggravating sales process that most commercial enterprise (that is, non-consumer) software vendors insist on.”</p>
<!-- raw HTML omitted -->
<p>“My experience of learning how to write iOS software, after having spent many years exclusively in the world of .NET development. It provides warnings, suggestions, and tips for others who are interested in learning iOS development.”</p>
<!-- raw HTML omitted -->
<p>“If you write any code in JavaScript then you’ve probably used closures, but do you actually understand what they are and how they work? Taking the time to understand closures and how they’re implemented can add a deeper dimension to your understanding of the JavaScript language.”</p>
<!-- raw HTML omitted -->
<p>“In desktop applications, the user interface dominated the screen. The buttons to click, the bars to drag, the windows. That isn’t the case with mobile devices. What’s powerful about mobile devices is that they exist to complement what we are already doing, rather than be our primary focus.”</p>
<!-- raw HTML omitted -->
<p>“At Stack Overflow (…) we feel that it’s part of our mission to help lead fellow .NET developers — and the most effective way to do that is by contributing some of the code that we use to build Stack Overflow and Stack Exchange back to the greater .NET developer community as reusable open source packages.”</p>
<!-- raw HTML omitted -->
<p>“We’ve made a selection of indispensable resources like layout frameworks, tutorials, books, templates and useful tools that can help you understand and implement grid based design in your projects.”</p>]]></content:encoded>
    </item>
    <item>
      <title>Flask MimeRender nel Python Package Index (PyPI)</title>
      <link>https://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/</link>
      <pubDate>Thu, 01 Mar 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flask-mimerender-e-nel-python-package-index-pypi/</guid>
      <description>&lt;p&gt;Un appunto veloce per segnalare che &lt;!-- raw HTML omitted --&gt;Flask MimeRender&lt;!-- raw HTML omitted --&gt;, il mio strumento RESTful per il rendering basato sul MIME Media-Type delle richieste HTTP (JSON, XML, HTML, ecc.), è ora presente su &lt;!-- raw HTML omitted --&gt;PyPI&lt;!-- raw HTML omitted --&gt;, il Python Package Index ufficiale.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Tutto ciò significa che l’installazione di Flask MimeRender su Windows, OSX e Linux è diventato più semplice:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Un appunto veloce per segnalare che <!-- raw HTML omitted -->Flask MimeRender<!-- raw HTML omitted -->, il mio strumento RESTful per il rendering basato sul MIME Media-Type delle richieste HTTP (JSON, XML, HTML, ecc.), è ora presente su <!-- raw HTML omitted -->PyPI<!-- raw HTML omitted -->, il Python Package Index ufficiale.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Tutto ciò significa che l’installazione di Flask MimeRender su Windows, OSX e Linux è diventato più semplice:</p>
<!-- raw HTML omitted -->
<p>Codice sorgente e istruzioni sono a vostra disposizione su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted -->, mentre per spiegazione approfondita ed esempio d’uso vi rimando al mio articolo precedente: <a href="http://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/" title="Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP">Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>E’ uscito il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/e-uscito-il-piccolo-libro-di-mongodb/</link>
      <pubDate>Tue, 21 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/e-uscito-il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB, Edizione Italiana&#34;&gt;Il Piccolo Libro di MongoDB&lt;/a&gt;, edizione italiana di The Little MongoDB Book, è finalmente &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB&#34;&gt;disponibile online&lt;/a&gt;. C’è voluto un bel po’ di lavoro, e sono certo i primi lettori scoveranno una serie di errori raccapriccianti, ma vi invito comunque a leggerlo e farmi sapere cosa ne pensate.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB, Edizione Italiana">Il Piccolo Libro di MongoDB</a>, edizione italiana di The Little MongoDB Book, è finalmente <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB">disponibile online</a>. C’è voluto un bel po’ di lavoro, e sono certo i primi lettori scoveranno una serie di errori raccapriccianti, ma vi invito comunque a leggerlo e farmi sapere cosa ne pensate.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una REST API che adatta le sue risposte al MIME Media-Type delle richieste HTTP</title>
      <link>https://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/</link>
      <pubDate>Fri, 03 Feb 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-implementare-un-web-service-rest-che-adatta-le-risposte-al-mime-media-type-delle-richieste-http/</guid>
      <description>&lt;p&gt;Da qualche tempo sto lavorando alla implementazione di una REST API. In linea generale e semplificando, una &lt;!-- raw HTML omitted --&gt;API&lt;!-- raw HTML omitted --&gt; è un servizio che espone alcune funzionalità, è accessibile via internet più o meno liberamente ed è, infine, utilizzabile non solo da persone fisiche ma anche e soprattutto da altre applicazioni. Un esempio di API è quella di Facebook, che consente a chiunque di creare applicazioni che interagiscono con gli utenti e le pagine Facebook. Già, se non ci fosse la API non esisterebbero i terribili giochini Facebook…&lt;/p&gt;
&lt;p&gt;Una delle specifiche &lt;!-- raw HTML omitted --&gt;REST&lt;!-- raw HTML omitted --&gt; più importanti vuole che un servizio RESTful sia in grado di fornire dati in più formati, in modo tale da soddisfare il maggior numero possibile di utenti/applicazioni. Immaginiamo un servizio che fornisce i risultati delle partite del campionato di calcio. Supponiamo che arrivino tre richieste successive per lo stesso risultato: la prima potrebbe chiedere una risposta in formato XML, la seconda in JSON e la terza in HTML. Il  nostro servizio deve rispondere a tutte e tre le richieste, adattando il flusso di dati della risposta al formato di ognuna.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Nel mio caso la API che sto implementando supporta XML, JSON, HTML e testo puro. E’ scritta in Python (ma va!) e si appoggia all’eccellente &lt;!-- raw HTML omitted --&gt;Flask&lt;!-- raw HTML omitted --&gt; micro web framework. Per risolvere in maniera elegante il problema delle risposte multi-formato ho deciso di usare i &lt;!-- raw HTML omitted --&gt;decorator&lt;!-- raw HTML omitted --&gt;, una delle caratteristiche più interessanti di Python. Dopo un po’ di lavoro in proprio ho scoperto che qualcuno aveva già risolto il problema, per giunta con la stessa tecnica. &lt;!-- raw HTML omitted --&gt;MimeRender&lt;!-- raw HTML omitted --&gt; di Martin Blech è un’ottima soluzione, solo che è specifica per web.py (un altro web framework). La mia soluzione non disponeva di alcune opzioni interessanti che MimeRender include; ho deciso allora di scrivere un port di MimeRender per Flask, e di metterlo a disposizione del pubblico.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche tempo sto lavorando alla implementazione di una REST API. In linea generale e semplificando, una <!-- raw HTML omitted -->API<!-- raw HTML omitted --> è un servizio che espone alcune funzionalità, è accessibile via internet più o meno liberamente ed è, infine, utilizzabile non solo da persone fisiche ma anche e soprattutto da altre applicazioni. Un esempio di API è quella di Facebook, che consente a chiunque di creare applicazioni che interagiscono con gli utenti e le pagine Facebook. Già, se non ci fosse la API non esisterebbero i terribili giochini Facebook…</p>
<p>Una delle specifiche <!-- raw HTML omitted -->REST<!-- raw HTML omitted --> più importanti vuole che un servizio RESTful sia in grado di fornire dati in più formati, in modo tale da soddisfare il maggior numero possibile di utenti/applicazioni. Immaginiamo un servizio che fornisce i risultati delle partite del campionato di calcio. Supponiamo che arrivino tre richieste successive per lo stesso risultato: la prima potrebbe chiedere una risposta in formato XML, la seconda in JSON e la terza in HTML. Il  nostro servizio deve rispondere a tutte e tre le richieste, adattando il flusso di dati della risposta al formato di ognuna.</p>
<p><!-- raw HTML omitted -->Nel mio caso la API che sto implementando supporta XML, JSON, HTML e testo puro. E’ scritta in Python (ma va!) e si appoggia all’eccellente <!-- raw HTML omitted -->Flask<!-- raw HTML omitted --> micro web framework. Per risolvere in maniera elegante il problema delle risposte multi-formato ho deciso di usare i <!-- raw HTML omitted -->decorator<!-- raw HTML omitted -->, una delle caratteristiche più interessanti di Python. Dopo un po’ di lavoro in proprio ho scoperto che qualcuno aveva già risolto il problema, per giunta con la stessa tecnica. <!-- raw HTML omitted -->MimeRender<!-- raw HTML omitted --> di Martin Blech è un’ottima soluzione, solo che è specifica per web.py (un altro web framework). La mia soluzione non disponeva di alcune opzioni interessanti che MimeRender include; ho deciso allora di scrivere un port di MimeRender per Flask, e di metterlo a disposizione del pubblico.</p>
<h2 id="istruzioni-per-l8217uso">Istruzioni per l’uso</h2>
<p>Prima di tutto è necessario fornire le funzioni da usare per il rendering, una per ogni formato che intendiamo supportare:</p>
<!-- raw HTML omitted -->
<p>Quindi decoriamo la nostra funzione, definendo per lei la mappa delle funzioni di rendering:</p>
<!-- raw HTML omitted -->
<p>Tutto qui! In caso di richiesta GET la funzione <code>index</code> restituisce un dizionario, il quale verrà reso da MimeRender come XML, JSON o quant’altro, a seconda del Content-Type specificato nella richiesta HTTP:</p>
<!-- raw HTML omitted -->
<p>Su <!-- raw HTML omitted -->github <!-- raw HTML omitted -->trovate l’esempio completo nonché il codice sorgente del renderer, che potete scaricare liberamente.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Piccolo Libro di MongoDB</title>
      <link>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb/</link>
      <pubDate>Thu, 26 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-piccolo-libro-di-mongodb/</guid>
      <description>&lt;p&gt;&lt;em&gt;Update: il &lt;a href=&#34;http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/&#34; title=&#34;Il Piccolo Libro di MongoDB, Edizione Italiana&#34;&gt;Piccolo Libro di MongoDB, Edizione Italiana&lt;/a&gt; è ora disponibile online.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ho cominciato a lavorare alla traduzione autorizzata dell’ottimo &lt;!-- raw HTML omitted --&gt;The Little MongoDB Book&lt;!-- raw HTML omitted --&gt; di Karl Seguin. Ho scovato il libro di Karl mentre raccoglievo la documentazione per un nuovo progetto super-segreto (!) a cui sto lavorando. Lo ritengo un’ottima introduzione al mondo &lt;!-- raw HTML omitted --&gt;NoSQL&lt;!-- raw HTML omitted --&gt; in generale e naturalmente al fantastico &lt;!-- raw HTML omitted --&gt;MongoDB&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;Il titolo italiano sarà Il Piccolo Libro di MongoDB. La traduzione prosegue costante ma a piccoli passi perché purtroppo o per fortuna di tempo libero ne ho poco. Al momento sono tradotti più o meno grossolanamente l’introduzione e il primo capitolo. Mi farebbe comodo un po’ di aiuto, in particolare per quanto riguarda la revisione del testo. Se qualcuno vuol dare una mano è il benvenuto: potete fare delle &lt;em&gt;pull request&lt;/em&gt; direttamente su &lt;!-- raw HTML omitted --&gt;GitHub&lt;!-- raw HTML omitted --&gt; (metodo preferibile), oppure mandarmi le correzioni via mail. In cambio vi prometto una menzione d’onore e l’eterna gratitudine dei futuri cultori italiani di MongoDB!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><em>Update: il <a href="http://nicolaiarocci.com/il-piccolo-libro-di-mongodb-edizione-italiana/" title="Il Piccolo Libro di MongoDB, Edizione Italiana">Piccolo Libro di MongoDB, Edizione Italiana</a> è ora disponibile online.</em></p>
<p>Ho cominciato a lavorare alla traduzione autorizzata dell’ottimo <!-- raw HTML omitted -->The Little MongoDB Book<!-- raw HTML omitted --> di Karl Seguin. Ho scovato il libro di Karl mentre raccoglievo la documentazione per un nuovo progetto super-segreto (!) a cui sto lavorando. Lo ritengo un’ottima introduzione al mondo <!-- raw HTML omitted -->NoSQL<!-- raw HTML omitted --> in generale e naturalmente al fantastico <!-- raw HTML omitted -->MongoDB<!-- raw HTML omitted -->.</p>
<p>Il titolo italiano sarà Il Piccolo Libro di MongoDB. La traduzione prosegue costante ma a piccoli passi perché purtroppo o per fortuna di tempo libero ne ho poco. Al momento sono tradotti più o meno grossolanamente l’introduzione e il primo capitolo. Mi farebbe comodo un po’ di aiuto, in particolare per quanto riguarda la revisione del testo. Se qualcuno vuol dare una mano è il benvenuto: potete fare delle <em>pull request</em> direttamente su <!-- raw HTML omitted -->GitHub<!-- raw HTML omitted --> (metodo preferibile), oppure mandarmi le correzioni via mail. In cambio vi prometto una menzione d’onore e l’eterna gratitudine dei futuri cultori italiani di MongoDB!</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>A lavori ultimati rilascerò il Piccolo Libro di MongoDB nei formati PDF, ePub, .mobi e probabilmente HTML. Se avete commenti o suggerimenti in proposito fatemelo sapere!</p>]]></content:encoded>
    </item>
    <item>
      <title>Imparare a Programmare… Pensando da Informatico</title>
      <link>https://nicolaiarocci.com/imparare-a-programmare-e-pensare-da-informatico/</link>
      <pubDate>Fri, 20 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-a-programmare-e-pensare-da-informatico/</guid>
      <description>&lt;p&gt;Chi mi segue da tempo sa  che l’educazione è un argomento che mi sta particolarmente a cuore ed è forse per questo motivo che spesso le persone mi chiedono consigli su come imparare a programmare. Gli articoli più letti di questo sito sono senz’altro le guide alla programmazione; &lt;a href=&#34;http://nicolaiarocci.com/impara-python-in-10-minuti/&#34; title=&#34;Python in 10 minuti&#34;&gt;Impara Python in 10 minuti&lt;/a&gt; e la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34; title=&#34;Introduzione alle Regular Expression&#34;&gt;serie sulle Regular Expression&lt;/a&gt; sono vere e proprie Hit, ma certo non sono adatte ai principianti. L’ultima mail è di pochi giorni fa: Mirko chiedeva qual’è il modo migliore per avvicinarsi all’affascinante mondo della programmazione.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Chi mi segue da tempo sa  che l’educazione è un argomento che mi sta particolarmente a cuore ed è forse per questo motivo che spesso le persone mi chiedono consigli su come imparare a programmare. Gli articoli più letti di questo sito sono senz’altro le guide alla programmazione; <a href="http://nicolaiarocci.com/impara-python-in-10-minuti/" title="Python in 10 minuti">Impara Python in 10 minuti</a> e la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/" title="Introduzione alle Regular Expression">serie sulle Regular Expression</a> sono vere e proprie Hit, ma certo non sono adatte ai principianti. L’ultima mail è di pochi giorni fa: Mirko chiedeva qual’è il modo migliore per avvicinarsi all’affascinante mondo della programmazione.</p>
<p>Una domanda facile da formulare, che presuppone un’altrettanto facile risposta. Ahimè non é così semplice, perlomeno non nel mio caso. Certo, ci sono dozzine di fonti di ottima qualità, ma penso che per poter fornire un consiglio valido dovrei conoscere meglio chi pone la domanda. Il tuo background è scientifico o umanistico? Sai l’inglese? La gran parte delle fonti che consiglierei sono inglesi. Qual’è la tua età? Sono tanti i fattori da considerare, soprattutto se ci si impunta a voler rispondere con cura.</p>
<p>In tempi non troppo lontani programmare significava conoscere il funzionamento dei computer; comprendere a fondo la loro teoria e la loro struttura. Ora è tutto cambiato. Ormai <!-- raw HTML omitted -->Assembly<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Linguaggio Macchina<!-- raw HTML omitted --> sono domini riservati a pochissimi super-specialisti; la gran parte dei programmatori più giovani li ha solo sentiti nominare. I <!-- raw HTML omitted -->linguaggi ad alto livello<!-- raw HTML omitted --> ci permettono di concentrarci sulla soluzione dei problemi (gli <!-- raw HTML omitted -->algoritmi<!-- raw HTML omitted -->) delegando al compilatore la creazione delle istruzioni di basso livello.</p>
<p>E’ una buona notizia. Per diventare programmatori non è indispensabile essere particolarmente dotati, né seguire chissà quali corsi accademici. Buona volontà, curiosità, passione e un pizzico di intraprendenza sono tutto quel che serve per buttarsi. Se son rose fioriranno, come si suol dire.</p>
<h2 id="img-classalignright-size-thumbnail-wp-image-4329-styleborder-style-initial-border-color-initial-border-image-initial-border-width-0px-titlepensare-da-informatico-versione-python-srcimagesgasp_lessons-150x150pngfit1502c150-altpensare-da-informatico-versione-python-srcsethttpi1wpcomnicolaiaroccicomwp-contentuploadsgasp_lessonspngresize1502c150-150w-httpi1wpcomnicolaiaroccicomwp-contentuploadsgasp_lessonspngw192-192w-sizesmax-width-150px-100vw-150px-data-recalc-dims1-pensare-da-informatico"><!-- raw HTML omitted -->Pensare da Informatico</h2>
<p>Se mi avete seguito fin qui grazie per la pazienza. Vi ricompenso con lo stesso consiglio che ho dato a Mirko l’altro giorno: Pensare da Informatico. Ma come direte, dopo tutte queste chiacchiere ci spiattelli un’altra astrattezza da quattro soldi? Al contrario! Sto parlando di un libro vero e proprio. <!-- raw HTML omitted -->Pensare da Informatico (Versione Python)<!-- raw HTML omitted --> è l’unico testo che mi sento di consigliare davvero ai principianti. E’ gratuito ed è ottimamente tradotto da Alessandro Pocaterra. L’edizione originale è giunta da poco alla <!-- raw HTML omitted -->terza edizione<!-- raw HTML omitted --> (novembre 2011), mentre credo che l’italiana sia ferma alla seconda, che va benissimo comunque.</p>
<p>Nella Prefazione <!-- raw HTML omitted -->Jeff Elkner<!-- raw HTML omitted --> racconta che era alla ricerca di un testo adatto all’insegnamento della programmazione nelle scuole americane. Il grande <!-- raw HTML omitted -->Richard Stallman<!-- raw HTML omitted --> gli consigliò di dare una occhiata a <em>How to Think Like a Computer Scientist:</em></p>
<blockquote>
<p>Quando lessi quel libro seppi immediatamente che volevo usarlo nelle mie lezioni. Era il testo di informatica più chiaro ed utile che avessi visto: il libro enfatizzava il processo di pensiero coinvolto nella programmazione piuttosto che le caratteristiche di un particolare linguaggio. Il solo fatto di leggerlo mi rese un insegnante migliore.</p></blockquote>
<p>Mica male come premessa no? Python è il inguaggio scelto dagli autori (e in proposito vi consiglio di leggere <!-- raw HTML omitted -->introduzione <!-- raw HTML omitted -->e <!-- raw HTML omitted -->prefazione<!-- raw HTML omitted -->) ma davvero non è il linguaggio quel che conta. Leggete questo testo con attenzione e soprattutto senza fretta. Non passate al capitolo successivo se non siete sicuri di aver afferrato per bene ciò che avete appena letto. Si procede passo per passo affrontando tutti i principali temi della programmazione moderna. Vi assicuro che alla fine di questa esperienza saprete programmare a dovere, a prescindere dai linguaggi che in futuro vorrete studiare (e magari nel frattempo vi innamorerete pure di Python).</p>
<p>Fatemi sapere come è andata. Ci tengo molto.</p>
<p><em>Aggiornamento del 9.3.2012. Ho scovato per caso una <!-- raw HTML omitted -->versione PDF<!-- raw HTML omitted -->, ben fatta, di Pensare da Informatico.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>JavaScript come Primo Linguaggio</title>
      <link>https://nicolaiarocci.com/javascript-come-primo-linguaggio/</link>
      <pubDate>Tue, 10 Jan 2012 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/javascript-come-primo-linguaggio/</guid>
      <description>&lt;p&gt;JavaScript non è mai la prima scelta di un aspirante programmatore. Spesso si finisce per usarlo all’occorrenza, per giochetti AJAX o per manipolare il DOM. Google, copia &amp;amp; incolla, e JavaScript è servito. Prima o poi l’abbiamo fatto tutti. E’ un vero peccato perché JavaScript merita di ben altra attenzione.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;A spiegarlo al mondo è stato naturalmente Douglas Crockford in &lt;a href=&#34;http://www.amazon.it/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=nicoiaro-21&amp;amp;linkCode=as2&amp;amp;camp=3370&amp;amp;creative=24114&amp;amp;creativeASIN=0596517742&#34;&gt;JavaScript: The Good Parts&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;, un libretto di 172 intensissime pagine in cui si ha costantemente la sensazione che l’autore intenda demolire il linguaggio mentre, in realtà, non fa altro che esaltarne le doti. JavaScript è il linguaggio più usato al mondo, e non a caso: è l’unico supportato da qualunque browser del pianeta. La recente affermazione di &lt;!-- raw HTML omitted --&gt;Node &lt;!-- raw HTML omitted --&gt;lato server ne dimostra l’indiscussa attualità.&lt;/p&gt;
&lt;p&gt;Ciò nonostante JavaScript rimane un linguaggio inadatto al programmatore neofita. O forse no.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>JavaScript non è mai la prima scelta di un aspirante programmatore. Spesso si finisce per usarlo all’occorrenza, per giochetti AJAX o per manipolare il DOM. Google, copia &amp; incolla, e JavaScript è servito. Prima o poi l’abbiamo fatto tutti. E’ un vero peccato perché JavaScript merita di ben altra attenzione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>A spiegarlo al mondo è stato naturalmente Douglas Crockford in <a href="http://www.amazon.it/gp/product/0596517742/ref=as_li_ss_tl?ie=UTF8&amp;tag=nicoiaro-21&amp;linkCode=as2&amp;camp=3370&amp;creative=24114&amp;creativeASIN=0596517742">JavaScript: The Good Parts</a><!-- raw HTML omitted -->, un libretto di 172 intensissime pagine in cui si ha costantemente la sensazione che l’autore intenda demolire il linguaggio mentre, in realtà, non fa altro che esaltarne le doti. JavaScript è il linguaggio più usato al mondo, e non a caso: è l’unico supportato da qualunque browser del pianeta. La recente affermazione di <!-- raw HTML omitted -->Node <!-- raw HTML omitted -->lato server ne dimostra l’indiscussa attualità.</p>
<p>Ciò nonostante JavaScript rimane un linguaggio inadatto al programmatore neofita. O forse no.</p>
<h2 id="john-resig-e-la-khan-academy">John Resig e la Khan Academy</h2>
<p>John Resig è il creatore di jQuery. Vera star internazionale, autore di libri di successo, ora lavora per <!-- raw HTML omitted -->Khan Academy<!-- raw HTML omitted -->, la famosa accademia online. Ecco ciò che Resig ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> poco prima di Natale:</p>
<blockquote>
<p>Alla Khan Academy stiamo considerando nuovi, originali, metodi di insegnamento della Computer Science. L’aspetto più interessante è che proporremo agli studenti JavaScript come loro primo linguaggio.</p></blockquote>
<p>La sua è una situazione particolarmente vantaggiosa: oltre a essere completamente digiuni di programmazione i suoi studenti hanno appena completato un corso di matematica e scienze.</p>
<p>In effetti insegnare l’ereditarietà prototipale (<!-- raw HTML omitted -->prototypal inheritance<!-- raw HTML omitted -->) caratteristica di JavaScript a programmatori già abituati alla tradizionale ereditarietà degli oggetti richiede un certo impegno. E’ senz’altro più semplice spiegarla a chi non sa nemmeno cosa sia l’<!-- raw HTML omitted -->ereditarietà<!-- raw HTML omitted --> in informatica. JavaScript è anche un buon linguaggio per la <!-- raw HTML omitted -->programmazione funzionale<!-- raw HTML omitted -->, anche questa più facile da capire in assenza di condizionamenti precedenti. In questo filmato Resig parla del suo progetto sottolineando quello che probabilmente è il più grande vantaggio di JavaScript, la sua ubiquità:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Resig non si nasconde certo le difficoltà, tanto che nel suo articolo si dilunga nella spiegazione di una serie di accorgimenti didattici e tecnici che dovrebbero semplificare il processo di apprendimento.</p>
<h2 id="parliamone">Parliamone</h2>
<p>Il progetto è senz’altro interessante e non c’è dubbio che JavaScript sia un ottimo investimento. Non sono sicuro però che partire da JavaScript sia l’approccio migliore per imparare a programmare. L’obiettivo iniziale dovrebbe essere, io credo, imparare le basi della programmazione <em>a prescindere dal linguaggio</em>. Non sarebbe meglio sceglierne uno senza troppe <em>bad parts</em>, dotato di sintassi più semplice, applicabile a contesti diversi e non solo al web?</p>
<p>Chi mi legge sa della mia predilezione, per altro <!-- raw HTML omitted -->criticata aspramente<!-- raw HTML omitted --> da più parti, per Python come linguaggio didattico. Per altri motivi andrebbe bene anche un super-classico come il linguaggio C oppure, perché no, un linguaggio funzionale puro come Haskell. JavaScript? Assolutamente si, ma come secondo linguaggio.</p>
<p>Mi domando infine, e qui ci metto un pizzico di malizia, se la scelta di Khan Academy non sia stata influenzata dalla passione per JavaScript del suo super-consulente, a prescindere da ogni valutazione didattica. Voi che ne pensate?</p>]]></content:encoded>
    </item>
    <item>
      <title>Branching di successo per Git</title>
      <link>https://nicolaiarocci.com/branching-di-successo-per-git/</link>
      <pubDate>Fri, 09 Dec 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/branching-di-successo-per-git/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Git&lt;!-- raw HTML omitted --&gt; è di gran lunga la tecnologia più significativa che il mio team ha introdotto negli ultimi tempi. Grazie a Git la nostra produttività è migliorata a tal punto che davvero non passa giorno senza che mi chieda come abbiamo potuto farne a meno così a lungo.&lt;/p&gt;
&lt;p&gt;Git è un &lt;!-- raw HTML omitted --&gt;sistema di controllo versione&lt;!-- raw HTML omitted --&gt; ideato da Linus Torvald (quello di Linux). E’ gratuito, multi-piattaforma, distribuito e soprattutto talmente veloce che sembra aggiungere un pizzico di magia al processo produttivo. Git è una macchina del tempo con cui spostarsi avanti e indietro tra le versioni del codice. E’ l’ideale sia per progetti individuali che per gruppi di lavoro numerosi e distribuiti. L’integrità del codice e la preservazione delle versioni sono garantite da un efficiente – e veloce! – sistema di &lt;em&gt;branching&lt;/em&gt; e &lt;em&gt;merging&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Se non avete mai usato prima un sistema di controllo versione (e magari ricorrete ancora a copie manuali del codice tra una release e l’altra) gioite, perché Git vi cambierà la vita. Se venite da altri sistemi (Subversion, Team Foundation Server) sappiate che Git adotta un approccio fondamentalmente diverso: niente copie differenziali. In Git ogni repository è un mirror integrale della codebase; è quest’accorgimento ciò che rende Git così veloce.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Git<!-- raw HTML omitted --> è di gran lunga la tecnologia più significativa che il mio team ha introdotto negli ultimi tempi. Grazie a Git la nostra produttività è migliorata a tal punto che davvero non passa giorno senza che mi chieda come abbiamo potuto farne a meno così a lungo.</p>
<p>Git è un <!-- raw HTML omitted -->sistema di controllo versione<!-- raw HTML omitted --> ideato da Linus Torvald (quello di Linux). E’ gratuito, multi-piattaforma, distribuito e soprattutto talmente veloce che sembra aggiungere un pizzico di magia al processo produttivo. Git è una macchina del tempo con cui spostarsi avanti e indietro tra le versioni del codice. E’ l’ideale sia per progetti individuali che per gruppi di lavoro numerosi e distribuiti. L’integrità del codice e la preservazione delle versioni sono garantite da un efficiente – e veloce! – sistema di <em>branching</em> e <em>merging</em>.</p>
<p>Se non avete mai usato prima un sistema di controllo versione (e magari ricorrete ancora a copie manuali del codice tra una release e l’altra) gioite, perché Git vi cambierà la vita. Se venite da altri sistemi (Subversion, Team Foundation Server) sappiate che Git adotta un approccio fondamentalmente diverso: niente copie differenziali. In Git ogni repository è un mirror integrale della codebase; è quest’accorgimento ciò che rende Git così veloce.</p>
<h2 id="come-e-dove-imparare-git">Come e dove imparare Git</h2>
<p>Git non è difficile, ma richiede un pò d’impegno iniziale. In rete sono disponibili numerose e ottime fonti. Vi consiglio <!-- raw HTML omitted -->Git Pro<!-- raw HTML omitted -->, libro gratuito nella versione online. Stampatelo e tenetelo sempre a portata di mano. Ottimi anche <!-- raw HTML omitted -->Git Reference<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Everyday GIT<!-- raw HTML omitted --> (consigliati dal sito ufficiale), <!-- raw HTML omitted -->Git Magic<!-- raw HTML omitted --> per quando avrete già un pò di dimestichezza con Git, e infine la valida raccolta che trovate su <!-- raw HTML omitted -->Stack Overflow<!-- raw HTML omitted -->.</p>
<h2 id="la-potenza-è-nulla-senza-controllo">La potenza è nulla senza controllo</h2>
<p>Uno dei risultati più interessanti che abbiamo ottenuto grazie all’adozione di Git è la pubblicazione contemporanea di più versioni del nostro <!-- raw HTML omitted -->software gestionale<!-- raw HTML omitted -->. C’è quella ufficiale (stabile) e c’é quella <em>sperimentale</em> con una anteprima delle novità a cui stiamo ancora lavorando. E’ un pò la nostra _<!-- raw HTML omitted -->night build<!-- raw HTML omitted --> e _contiene le cose non ancora mature per affrontare il grande pubblico ma già interessanti per gli utenti più smaliziati. Nel frattempo lavoriamo anche a nuove funzionalità importanti. Queste ultime vedranno la luce solo in occasione dei rilasci più significativi (tipicamente non sono più di due o tre all’anno) e non sono incluse nelle night build. In tutto questo <em>bailamme</em> di versioni, hotfix e rilasci pubblici e interni non perdiamo una linea di codice e manteniamo i nostri repository allineati, muovendoci avanti e indietro quando necessario.</p>
<p>Per ottenere un risultato così non basta il sistema di controllo versione; è necessaria anche una ottima strategia o, per meglio dire, un modello di branching ben progettato. Dopo diversi tentativi andati più o meno a vuoto la soluzione è arrivata grazie alla scoperta dello spettacolare articolo di <!-- raw HTML omitted -->Vincent Driessen<!-- raw HTML omitted -->:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il modello si basa su due branch principali (master e develop) e su tre di supporto (hotfix, feature e release). Lo considero talmente valido che mi sono proposto a Vincent come curatore della traduzione italiana, solo per scoprire che qualcuno prima di me <!-- raw HTML omitted -->ci aveva già pensato<!-- raw HTML omitted -->: meglio così. Da quando l’ho scoperto lo applichiamo con zelo e vi consiglio di fare altrettanto, soprattutto se lavorate su progetti complessi.</p>
<h2 id="non-solo-codice">Non solo codice</h2>
<p>Git è utile anche per i piccoli progetti personali. Anzi, se state cominciando vi consiglio di partire proprio da uno di questi. Non è necessario che sia un programma, potrebbe benissimo trattarsi di un file di testo qualunque. Git funziona con qualunque tipo di file e in effetti viene usato con successo per progetti di scrittura, documentazione, web design e quant’altro.</p>
<p>Una volta presa dimestichezza con Git non potrete più rinunciarvi, qualunque sia la portata del progetto a cui state lavorando.</p>]]></content:encoded>
    </item>
    <item>
      <title>Python nella scuola italiana. Si può.</title>
      <link>https://nicolaiarocci.com/python-nella-scuola-italiana-si-puo/</link>
      <pubDate>Fri, 25 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-nella-scuola-italiana-si-puo/</guid>
      <description>&lt;p&gt;Mia moglie è docente nel liceo artistico della nostra città. L’anno scorso era coinvolta in un progetto che vedeva studenti e professori impegnati nella progettazione di un monumento da installare nella sede dell’Autorità Portuale.&lt;/p&gt;
&lt;p&gt;Il soggetto scelto dal team erano le onde del mare e ben presto si pose il problema di rappresentarle realisticamente. Un insegnate di Matematica suggerì di ricorrere alla teoria dei &lt;!-- raw HTML omitted --&gt;frattali&lt;!-- raw HTML omitted --&gt;. Idea brillante che offriva l’opportunità di un approfondimento didattico piuttosto insolito per un liceo artistico.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Mia moglie è docente nel liceo artistico della nostra città. L’anno scorso era coinvolta in un progetto che vedeva studenti e professori impegnati nella progettazione di un monumento da installare nella sede dell’Autorità Portuale.</p>
<p>Il soggetto scelto dal team erano le onde del mare e ben presto si pose il problema di rappresentarle realisticamente. Un insegnate di Matematica suggerì di ricorrere alla teoria dei <!-- raw HTML omitted -->frattali<!-- raw HTML omitted -->. Idea brillante che offriva l’opportunità di un approfondimento didattico piuttosto insolito per un liceo artistico.</p>
<p>Le competenze informatiche del nostro intraprendente professore risalivano credo ai tempi dell’università, e i ragazzi erano a digiuno di qualunque nozione tecnica. Nel corso della discussione mia moglie, più che altro per associazione d’idee, buttò lì una frase:</p>
<blockquote>
<p>mio marito è un gran sostenitore del linguaggio Python, dice sempre che è l’ideale per imparare e che dovrebbero insegnarlo nelle scuole</p></blockquote>
<p>La cosa sembrava finita lì senonché dopo qualche giorno il professore irruppe in sala insegnanti, puntò dritto su mia moglie e l’apostrofò così:</p>
<blockquote>
<p>ho scritto questo programmino in Python, non è che tuo marito può darci una occhiata perché sai funziona, ma non disegna proprio il frattale che serve a noi – ci va vicino</p></blockquote>
<p>Immaginate la mia sorpresa quando la sera, a casa, mia moglie mi raccontò tutta la faccenda. La mia prima reazione è stata quella di correre al computer per dare un’occhiata al codice:</p>
<!-- raw HTML omitted -->
<p>Mi sono subito reso conto che si trattava di una implementazione parziale della <!-- raw HTML omitted -->Curva (o fiocco) di Koch<!-- raw HTML omitted -->, una delle prime curve frattali documentate e anche una delle più famose. Una volta corretto il problema l’output restituito dal programma è stato questo:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Non male davvero. Per ammissione dello stesso autore sappiamo che il codice era in parte scopiazzato (in rete si trovano implementazioni della curva di Koch in tutti i linguaggi), ma non è questo il punto.</p>
<p>Il fatto è che un professore di uno sperduto liceo artistico (artistico!) italiano ha:</p>
<ol>
<li>adottato Python per una lezione in classe</li>
<li>dimostrato che nella scuola ci sono anche (molti) docenti intraprendenti, appassionati e competenti</li>
</ol>
<p>Qualche mese più tardi un’altra docente, che mi chiedeva consiglio su come approcciare la programmazione in classe, ha rifiutato categoricamente la mia proposta di Python perché “non l’aveva mai sentito nominare”. Scelse invece il linguaggio C perché “molto più affermato”.</p>
<p>Senz’altro, anche se nutro seri dubbi sul fatto che la sua scelta sia la migliore da un punto di vista didattico. Dubito, per esempio, che dopo un giorno o due lei e i suoi studenti sarebbero stati in grado di scrivere un’implementazione C della curva di Koch.</p>]]></content:encoded>
    </item>
    <item>
      <title>Come guadagnare $19.000 sul App Store imparando a programmare</title>
      <link>https://nicolaiarocci.com/come-guadagnare-19000-sul-app-store-imparando-a-programmare/</link>
      <pubDate>Wed, 23 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-guadagnare-19000-sul-app-store-imparando-a-programmare/</guid>
      <description>&lt;p&gt;Nathan Barry si è messo in testa di scrivere Apps per iPad e venderle sul App Store. Non sapendo nulla né di Objective-C né di sviluppo mobile mette in conto un bel po’ di gavetta e tante notti insonni. Un anno e mezzo dopo si ritrova con una solida esperienza, $19.000 in banca e un lavoro in proprio. Fa bene ogni tanto leggere queste storielle a lieto fine:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Nathan Barry si è messo in testa di scrivere Apps per iPad e venderle sul App Store. Non sapendo nulla né di Objective-C né di sviluppo mobile mette in conto un bel po’ di gavetta e tante notti insonni. Un anno e mezzo dopo si ritrova con una solida esperienza, $19.000 in banca e un lavoro in proprio. Fa bene ogni tanto leggere queste storielle a lieto fine:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Microsoft Silverlight e Adobe Flash verso la resa. Comincia l’era di Re HTML5</title>
      <link>https://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/</link>
      <pubDate>Fri, 11 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsoft-silverlight-e-adobe-flash-verso-la-resa-comincia-lera-di-re-html5/</guid>
      <description>&lt;p&gt;Silverlight 5 è in dirittura d’arrivo. L’ultimo aggiornamento del plug-in Microsoft sarà &lt;em&gt;ultimo&lt;/em&gt; in tutti i sensi dato che &lt;!-- raw HTML omitted --&gt;a quanto pare&lt;!-- raw HTML omitted --&gt; non ne seguiranno altri. A sostenerlo è ZD-Net per bocca di Mary-Jo Foley, di solito sempre ben informata su quel che succede nei corridoi del gigante di Seattle.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Diversi partner e clienti mi hanno detto di aver saputo da fonti Microsoft che Silverlight 5 è l’ultima versione di Silverlight che Microsoft rilascerà. Riferiscono di non sapere se verranno rilasciati Service Pack, né per quanto tempo Microsoft supporterà Silverlight 5&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Si tratta solo di voci ma la fonte è autorevole. Proprio l’altro giorno Adobe ha &lt;!-- raw HTML omitted --&gt;annunciato&lt;!-- raw HTML omitted --&gt; lo stop allo sviluppo di Flash Player Mobile per concentrarsi su HTML5. Il vice presidente Adobe Danny Winokur ha dichiarato&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Questa novità ci permetterà di aumentare l’impegno su HTML5 continuando a innovare Flash nei settori in cui  può avere più impatto: advanced gaming e premium video.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Non so voi ma io in queste righe io leggo qualcosa di più del semplice abbandono della versione mobile di Flash. Ci vedo la ricollocazione di Flash in settori di nicchia e la contestuale adozione di HTML5 come soluzione universale per il Web. Una onorevole resa delle armi, insomma.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Silverlight 5 è in dirittura d’arrivo. L’ultimo aggiornamento del plug-in Microsoft sarà <em>ultimo</em> in tutti i sensi dato che <!-- raw HTML omitted -->a quanto pare<!-- raw HTML omitted --> non ne seguiranno altri. A sostenerlo è ZD-Net per bocca di Mary-Jo Foley, di solito sempre ben informata su quel che succede nei corridoi del gigante di Seattle.</p>
<blockquote>
<p>Diversi partner e clienti mi hanno detto di aver saputo da fonti Microsoft che Silverlight 5 è l’ultima versione di Silverlight che Microsoft rilascerà. Riferiscono di non sapere se verranno rilasciati Service Pack, né per quanto tempo Microsoft supporterà Silverlight 5</p></blockquote>
<p>Si tratta solo di voci ma la fonte è autorevole. Proprio l’altro giorno Adobe ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> lo stop allo sviluppo di Flash Player Mobile per concentrarsi su HTML5. Il vice presidente Adobe Danny Winokur ha dichiarato</p>
<blockquote>
<p>Questa novità ci permetterà di aumentare l’impegno su HTML5 continuando a innovare Flash nei settori in cui  può avere più impatto: advanced gaming e premium video.</p></blockquote>
<p>Non so voi ma io in queste righe io leggo qualcosa di più del semplice abbandono della versione mobile di Flash. Ci vedo la ricollocazione di Flash in settori di nicchia e la contestuale adozione di HTML5 come soluzione universale per il Web. Una onorevole resa delle armi, insomma.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Solo la scorsa estate <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e i dubbi sul destino di Silverlight">facevo presente</a> che sul futuro di Silverlight si stavano addensando nubi minacciose e tra le fonti citavo proprio la Foley. Sulla diatriba tra Flash e HTML5 ho già espresso la mia <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/" title="Adobe Flash è una pessima idea">opinione</a> sollevando anche qualche <!-- raw HTML omitted -->piccola polemica<!-- raw HTML omitted -->.</p>
<p>Non mi sorprende la inevitabile convergenza verso HTML5. Mi colpisce piuttosto la forte accelerazione subita dal processo, una accelerazione dovuta in gran parte proprio all’iniziativa di quegli stessi brand (e gliene va reso merito) che fino all’altro giorno resistevano all’avvento di HTML5. Ufficialmente Microsoft non ha ancora cambiato posizione, ma è solo questione di tempo.</p>
<p>Se il biennio 2010-11 è stato quello della battaglia per il web, il 2012 sarà senz’altro il primo del lungo e pacifico dominio di Re HTML5.</p>
<h2 id="approfondimenti">Approfondimenti</h2>
<ul>
<li><a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/" title="Adobe Flash è una pessima idea">Adobe Flash è una pessima idea</a></li>
<li><a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windws 8 e i dubbi sul destino di Silverlight">Windows 8 è i dubbi sul destino di Silverlight</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio per accedere a Kinect SDK ed Excel via Python</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-per-accedere-a-kinect-sdk-ed-excel-via-python/</link>
      <pubDate>Fri, 04 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-per-accedere-a-kinect-sdk-ed-excel-via-python/</guid>
      <description>&lt;p&gt;E’ uscita ieri la &lt;!-- raw HTML omitted --&gt;versione 1.1 Alpha&lt;!-- raw HTML omitted --&gt; dei Python Tools per Visual Studio, il plug-in open source per programmare in Python con Visual Studio 2010. Migliorie e molte nuove features per la IDE ma la novità più interessante sono senz’altro &lt;!-- raw HTML omitted --&gt;PyKinect&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Pyvot&lt;!-- raw HTML omitted --&gt;, due librerie che consentono rispettivamente di lavorare col Kinect SDK e di interagire con Excel via Python.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E’ uscita ieri la <!-- raw HTML omitted -->versione 1.1 Alpha<!-- raw HTML omitted --> dei Python Tools per Visual Studio, il plug-in open source per programmare in Python con Visual Studio 2010. Migliorie e molte nuove features per la IDE ma la novità più interessante sono senz’altro <!-- raw HTML omitted -->PyKinect<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Pyvot<!-- raw HTML omitted -->, due librerie che consentono rispettivamente di lavorare col Kinect SDK e di interagire con Excel via Python.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per informazioni su Python Tools per Visual Studio date una occhiata a <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">Programmare in Python con Visual Studio 2010</a> e <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-1-0/" title="Python Tools per Visual Studio 1.0">Python Studio per Visual Studio 1.0</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ci sono più offerte di lavoro che Programmatori .NET</title>
      <link>https://nicolaiarocci.com/ci-sono-piu-offerte-di-lavoro-che-programmatori-net/</link>
      <pubDate>Wed, 02 Nov 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/ci-sono-piu-offerte-di-lavoro-che-programmatori-net/</guid>
      <description>&lt;p&gt;Ai primi di ottobre &lt;!-- raw HTML omitted --&gt;TechCrunch&lt;!-- raw HTML omitted --&gt; riportava una notizia interessante: negli Stati Uniti ci sarebbe carenza di sviluppatori .NET. La piattaforma di recruitment Dice dichiara che le offerte di lavoro .NET aumentano del 25% ogni anno, e che la gran parte delle ricerche sui loro database riguarda skill .NET. Ai primi di ottobre 2011 sarebbero state oltre 10.000 le richieste inevase di figure professionali .NET.&lt;/p&gt;
&lt;p&gt;Notizie di questo tipo vanno prese con beneficio di inventario anche se in questo caso una conferma indiretta viene da WANTED Analytics, che a Settembre ha pubblicato un &lt;!-- raw HTML omitted --&gt;report&lt;!-- raw HTML omitted --&gt; indipendente che sembra giungere alle stesse conclusioni. Anche i &lt;!-- raw HTML omitted --&gt;commenti&lt;!-- raw HTML omitted --&gt; all’articolo di TechCrunch sono confortanti: ci sono aziende che ammettono di essere a caccia di sviluppatori .NET e ci sono programmatori che confermano di ricevere continuamente offerte di lavoro (non mancano quelli che sono passati ad altri linguaggi e non se ne pentono).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Ai primi di ottobre <!-- raw HTML omitted -->TechCrunch<!-- raw HTML omitted --> riportava una notizia interessante: negli Stati Uniti ci sarebbe carenza di sviluppatori .NET. La piattaforma di recruitment Dice dichiara che le offerte di lavoro .NET aumentano del 25% ogni anno, e che la gran parte delle ricerche sui loro database riguarda skill .NET. Ai primi di ottobre 2011 sarebbero state oltre 10.000 le richieste inevase di figure professionali .NET.</p>
<p>Notizie di questo tipo vanno prese con beneficio di inventario anche se in questo caso una conferma indiretta viene da WANTED Analytics, che a Settembre ha pubblicato un <!-- raw HTML omitted -->report<!-- raw HTML omitted --> indipendente che sembra giungere alle stesse conclusioni. Anche i <!-- raw HTML omitted -->commenti<!-- raw HTML omitted --> all’articolo di TechCrunch sono confortanti: ci sono aziende che ammettono di essere a caccia di sviluppatori .NET e ci sono programmatori che confermano di ricevere continuamente offerte di lavoro (non mancano quelli che sono passati ad altri linguaggi e non se ne pentono).</p>
<!-- raw HTML omitted -->
<h2 id="perché-la-carenza-di-programmatori-net">Perché la carenza di Programmatori .NET?</h2>
<p>Secondo TechCrunch gli sviluppatori .NET tendono a spostarsi su altre piattaforme perché temono di rimanere tagliati fuori dal mercato, visto che la tendenza del momento vuole i linguaggi open source far la parte del leone. Ci sarebbe inoltre una motivazione economica. Secondo Dice negli Stati Uniti i programmatori .NET guadagnano in media $83.000, mentre quelli Java arrivano a $91.000.</p>
<h2 id="e-in-italia">E in Italia?</h2>
<p>Per quanto ne so non esistono dati sulla situazione italiana (se ne sapete qualcosa fatemelo sapere: li segnalerò volentieri). Un mio <!-- raw HTML omitted -->rapido test<!-- raw HTML omitted --> ha prodotto risultati incoraggianti: oltre 30 pagine di offerte di lavoro in ambito .NET. Non mi intendo di recruitment ma senz’altro è facile rilevare che, come negli Stati Uniti, anche da noi girano migliaia di applicazioni legacy .NET che assicureranno continuità di impiego anche nel lungo periodo. Probabilmente, ma si tratta di una mia sensazione, nel nostro paese la piattaforma Microsoft è meno diffusa in ambito Enterprise. Senz’altro la media dei salari IT europei (e italiani soprattutto) è più bassa di quella americana.</p>
<p>Anche da noi la tendenza è comunque verso l’open source e d’altra parte la stessa Microsoft <!-- raw HTML omitted -->si muove<!-- raw HTML omitted --> da anni anche in questa direzione pur senza intaccare il suo modello di business principale. Tempo fa mi sono dilungato sul <a href="http://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/" title="Perché le Web Startup non amano il .NET Framework?">perché le web startup non amano il .NET Framework</a> e tutto sommato credo che quelle conclusioni siano valide tutt’ora. Certo mi fa piacere apprendere che la piattaforma sulla quale ho investito oltre quindici anni di carriera sta vivendo, almeno dal punto di vista del recruitment, una seconda giovinezza.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il mio intervento al KnowCamp 2011: Fuga dalla Comfort Zone</title>
      <link>https://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/</link>
      <pubDate>Tue, 25 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/</guid>
      <description>&lt;p&gt;Da qualche giorno sono disponibili le slide e la registrazione video del mio intervento al &lt;!-- raw HTML omitted --&gt;KnowCamp 2011&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;La diretta è stata seguita da oltre 1200 spettatori mentre in sala erano presenti circa 150 persone: un bel successo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Da qualche giorno sono disponibili le slide e la registrazione video del mio intervento al <!-- raw HTML omitted -->KnowCamp 2011<!-- raw HTML omitted -->.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>La diretta è stata seguita da oltre 1200 spettatori mentre in sala erano presenti circa 150 persone: un bel successo.</p>
<p>Per quanto riguarda le slide, visto che si trattava di un intervento di tipo <!-- raw HTML omitted -->Ignite<!-- raw HTML omitted --> ho preferito impostarle come semplice supporto al parlato (un paio sono addirittura ‘mute’):</p>
<h2 id="ringraziamenti">Ringraziamenti</h2>
<p>Grazie a <!-- raw HTML omitted -->Nicola Ballotta<!-- raw HTML omitted --> e tutti i ragazzi dello staff del KnowCamp, a <!-- raw HTML omitted -->Nicola Mattina<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted --> moderatori di Ignite Session e User Panel e un saluto affettuoso ai compagni di scorribande alimentari e non (voi sapete). Grazie al pubblico che mi ha dedicato cinque minuti del suo tempo.</p>
<p>Infine un grazie grande come una casa ai tanti che personalmente o via twitter/facebook oppure citandomi nei loro articoli online mi hanno comunicato il loro apprezzamento. Ripropongo uno dei riscontri che più mi hanno colpito perché testimonia che i contenuti proposti stanno attecchendo. Cosa può desiderare di più un <!-- raw HTML omitted -->umile<!-- raw HTML omitted --> relatore?</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Perché non acquisterò la biografia ufficiale di Steve Jobs</title>
      <link>https://nicolaiarocci.com/perche-non-acquistero-la-biografia-ufficiale-di-steve-jobs/</link>
      <pubDate>Fri, 21 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/perche-non-acquistero-la-biografia-ufficiale-di-steve-jobs/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Non acquisterò la biografia ufficiale di Steve Jobs. Non mi interessa il suo privato e quel che ha (o non ha) fatto nel corso della sua carriera è di pubblico dominio. I contenuti del libro li troverò comunque citati, acclamati e commentati &lt;em&gt;ad nauseam&lt;/em&gt; sul web. Gratis.&lt;/p&gt;
&lt;p&gt;E poi, non fosse morto l’altro ieri, l’avrei comprata? Vedi sopra.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Non acquisterò la biografia ufficiale di Steve Jobs. Non mi interessa il suo privato e quel che ha (o non ha) fatto nel corso della sua carriera è di pubblico dominio. I contenuti del libro li troverò comunque citati, acclamati e commentati <em>ad nauseam</em> sul web. Gratis.</p>
<p>E poi, non fosse morto l’altro ieri, l’avrei comprata? Vedi sopra.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python per il Web</title>
      <link>https://nicolaiarocci.com/python-per-il-web/</link>
      <pubDate>Thu, 20 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-per-il-web/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Python for the Web&lt;!-- raw HTML omitted --&gt; è una agile guida introduttiva per chi vuole accedere al Web via Python. Vengono presentate tre eccellenti librerie: &lt;!-- raw HTML omitted --&gt;Requests&lt;!-- raw HTML omitted --&gt;, &lt;!-- raw HTML omitted --&gt;simplejson&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;lxml&lt;!-- raw HTML omitted --&gt;. La prima consente di interagire facilmente coi siti Web da Python, la seconda serve a processare i flussi JSON e l’ultima è una fantastica risorsa per lo scraping (l’ho usata in un mio progetto, ve la consiglio senz’altro). L’ultimo argomento della guida è la creazione di siti web in Python attraverso il framework &lt;!-- raw HTML omitted --&gt;Django&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Python for the Web<!-- raw HTML omitted --> è una agile guida introduttiva per chi vuole accedere al Web via Python. Vengono presentate tre eccellenti librerie: <!-- raw HTML omitted -->Requests<!-- raw HTML omitted -->, <!-- raw HTML omitted -->simplejson<!-- raw HTML omitted --> e <!-- raw HTML omitted -->lxml<!-- raw HTML omitted -->. La prima consente di interagire facilmente coi siti Web da Python, la seconda serve a processare i flussi JSON e l’ultima è una fantastica risorsa per lo scraping (l’ho usata in un mio progetto, ve la consiglio senz’altro). L’ultimo argomento della guida è la creazione di siti web in Python attraverso il framework <!-- raw HTML omitted -->Django<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Più che una guida, Python for the Web è un <em>appetizer</em> che vi invoglierà ad approfondire gli argomenti trattati. Se state cominciando con Python, date una occhiata.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Il Linguaggio più importante per il Programmatore</title>
      <link>https://nicolaiarocci.com/il-linguaggio-piu-importante-per-il-programmatore/</link>
      <pubDate>Wed, 19 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-linguaggio-piu-importante-per-il-programmatore/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Molti programmatori hanno difficoltà nel gestire la comunicazione. Non intendo quella di rete, ma quella interpersonale. E’ forse per questo che gran parte di loro preferisce lavorare in proprio. Ciò gli consente di non dover comunicare o perlomeno di farlo il meno possibile.&lt;/p&gt;
&lt;p&gt;Luogo comune vuole che i programmatori siano persone chiuse, a volte timide, oppure scontrose e irascibili; più interessate al codice che non alle relazioni interpersonali.  E’ pur vero che il nostro lavoro richiede concentrazione. Molti &lt;!-- raw HTML omitted --&gt;sostengono&lt;!-- raw HTML omitted --&gt; che programmare è una forma d’arte e la gran parte degli artisti (pittori, scultori, disegnatori) non lavora forse in silenzio?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Molti programmatori hanno difficoltà nel gestire la comunicazione. Non intendo quella di rete, ma quella interpersonale. E’ forse per questo che gran parte di loro preferisce lavorare in proprio. Ciò gli consente di non dover comunicare o perlomeno di farlo il meno possibile.</p>
<p>Luogo comune vuole che i programmatori siano persone chiuse, a volte timide, oppure scontrose e irascibili; più interessate al codice che non alle relazioni interpersonali.  E’ pur vero che il nostro lavoro richiede concentrazione. Molti <!-- raw HTML omitted -->sostengono<!-- raw HTML omitted --> che programmare è una forma d’arte e la gran parte degli artisti (pittori, scultori, disegnatori) non lavora forse in silenzio?</p>
<p>Tuttavia anche i più abili nell’eludere ogni forma di contatto prima o poi si vedranno costretti a comunicare con una persona importante: il cliente. Di tutte le forme di comunicazione professionale, quella col cliente è senz’altro la più delicata. Ne va del nostro lavoro e purtroppo in questo caso ci troviamo spesso ad affrontare un problema importante, quello che <!-- raw HTML omitted -->Chris Eidhof<!-- raw HTML omitted --> definisce la “perdita di segnale”.</p>
<blockquote>
<p>Ogni volta che comunichiamo c’è un rumore di fondo. Se le parti hanno competenze diverse, frammenti del messaggio andranno perduti. In linea generale, più le esperienze sono vicine (due programmatori che parlano tra di loro), minore è la perdita di segnale.</p></blockquote>
<p>Quando le aree di competenza sono divergenti (come capita tra programmatore e cliente) è necessario adottare, a volte forgiare, un linguaggio comprensibile per entrambi. Quasi sempre questo è più vicino al cliente che non al programmatore, per il quale l’impegno è notevole. Il rischio da evitare sono le incomprensioni e i conseguenti, inevitabili, ritardi nel lavoro.</p>
<p>A differenza dei linguaggi di programmazione, che una volta acquisiti entrano definitivamente nel bagaglio del programmatore, i linguaggi da adottare coi clienti tendono a cambiare di volta in volta a causa delle variabili in gioco, prime tra tutte il grado di alfabetizzazione informatica e l’area di competenza (ambito professionale) della controparte.</p>
<p>Qualche esempio può essere utile. Godetevi le mie tre <em>gaffes</em> più recenti, non tutte avvenute sul lavoro. D’altronde questa faccenda della scelta del linguaggio giusto non è certo confinata al solo ambito professionale. La prima riguarda la mia non proprio brillante comunicazione su Facebook:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il secondo incidente è avvenuto proprio su questo sito:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>In quest’ultimo caso si potrebbe obiettare che l’errore è del visitatore che è capitato nel posto sbagliato. Non è così perché l’avevo indotto io alla visita, pubblicando il link su Facebook. E veniamo al caso più interessante perché ha coinvolto un mio cliente la settimana scorsa:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Qui il nostro servizio di assistenza si era espresso chiaramente. Il fatto è che la parola ‘immagine’ ha un significato ben diverso a seconda che venga intesa da un tecnico informatico o da un commerciante di liquori. Pur avendo compreso perfettamente la richiesta, evidentemente non avrebbe avuto idea di come soddisfarla. Direi che in questo caso ha saputo arrangiarsi brillantemente. In effetti il supporto tecnico è uno dei campi nei quali il conflitto tra competenze e linguaggi diversi tende a generare i risultati più disastrosi.</p>
<p>Descrivere il problema col giusto linguaggio è il primo passo, forse il più importante, per trovarne la soluzione. Apprendere il dizionario del cliente è determinante per attivare una comunicazione efficace. Temo che nella gran parte dei progetti software non ci si provi nemmeno, e forse per questa ragione tanti programmi risultano difficili da utilizzare.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dennis Ritchie se n’è andato</title>
      <link>https://nicolaiarocci.com/dennis-ritchie-se-ne-andato/</link>
      <pubDate>Thu, 13 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dennis-ritchie-se-ne-andato/</guid>
      <description>&lt;p&gt;Decisamente questo non è un buon momento per le scienze dell’informazione. Dopo la recente scomparsa di Steve Jobs, ecco la notizia che lo scorso fine settimana anche &lt;!-- raw HTML omitted --&gt;Dennis Ritchie&lt;!-- raw HTML omitted --&gt; ci ha lasciato. Inventore e autore del Linguaggio C, Ritchie era anche uno dei padri fondatori del sistema operativo Unix. Poco conosciuto dal grande pubblico, non certo manager e tanto meno figura pubblica, Ritchie era uno scienziato di calibro assoluto la cui influenza nell’informatica tutta è semplicemente inestimabile.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Decisamente questo non è un buon momento per le scienze dell’informazione. Dopo la recente scomparsa di Steve Jobs, ecco la notizia che lo scorso fine settimana anche <!-- raw HTML omitted -->Dennis Ritchie<!-- raw HTML omitted --> ci ha lasciato. Inventore e autore del Linguaggio C, Ritchie era anche uno dei padri fondatori del sistema operativo Unix. Poco conosciuto dal grande pubblico, non certo manager e tanto meno figura pubblica, Ritchie era uno scienziato di calibro assoluto la cui influenza nell’informatica tutta è semplicemente inestimabile.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Premio Turing nel 1983 e National Medal of Technology nel 1999, Dennis Ritchie è conosciuto ai più come co-autore di uno dei libri più importanti (e venerati) nella storia della programmazione: <!-- raw HTML omitted -->The C Programming Language<!-- raw HTML omitted -->, o <strong>K&amp;R</strong> come tutti l’abbiamo chiamato per trent’anni. La rilevanza del K&amp;R è tale da renderlo <!-- raw HTML omitted -->ancora oggi<!-- raw HTML omitted --> uno dei libri di riferimento, consigliato a chiunque voglia diventare un programmatore o desideri scrivere di programmazione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per me Dennis Ritchie è sempre stato, con pochissimi altri, un vero e proprio mito. Lo saluto con affetto e gratitudine prendendo a prestito le parole di <!-- raw HTML omitted -->James Grimmelmann<!-- raw HTML omitted -->:</p>
<blockquote>
<p>His pointer has been cast to void *; his process has terminated with exit code zero</p></blockquote>
<p> </p>
]]></content:encoded>
    </item>
    <item>
      <title>Sull’arte di arrangiarsi dei clienti</title>
      <link>https://nicolaiarocci.com/sullarte-di-arrangiarsi-dei-clienti/</link>
      <pubDate>Tue, 11 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sullarte-di-arrangiarsi-dei-clienti/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>A Farewell to Steve Jobs</title>
      <link>https://nicolaiarocci.com/a-farewell-to-steve-jobs/</link>
      <pubDate>Thu, 06 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/a-farewell-to-steve-jobs/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;blockquote&gt;
&lt;!-- raw HTML omitted --&gt;&lt;/blockquote&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<blockquote>
<!-- raw HTML omitted --></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>La mia fuga dalla Comfort Zone al KnowCamp 2011</title>
      <link>https://nicolaiarocci.com/la-mia-fuga-dalla-comfort-zone-al-knowcamp-2011/</link>
      <pubDate>Tue, 04 Oct 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-mia-fuga-dalla-comfort-zone-al-knowcamp-2011/</guid>
      <description>&lt;p&gt;Sabato 8 ottobre sarò a Modena per il &lt;!-- raw HTML omitted --&gt;KnowCamp 2011&lt;!-- raw HTML omitted --&gt;. Per la prima volta mi cimenterò in un &lt;!-- raw HTML omitted --&gt;Ignite&lt;!-- raw HTML omitted --&gt;, ovvero una forma di intervento-lampo-acrobatico della durata di cinque minuti durante i quali verranno passate venti slide a intervalli regolari (una ogni quindici secondi).&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il titolo provvisiorio del mio intervento è &lt;em&gt;Fuga dalla Comfort Zone&lt;/em&gt;. Ammetto di essere piuttosto nervoso. Il rischio di impappinarmi nel corso di quest’esibizione-rap è notevole, e tuttavia sono curioso di vedere come andrà a finire.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Sabato 8 ottobre sarò a Modena per il <!-- raw HTML omitted -->KnowCamp 2011<!-- raw HTML omitted -->. Per la prima volta mi cimenterò in un <!-- raw HTML omitted -->Ignite<!-- raw HTML omitted -->, ovvero una forma di intervento-lampo-acrobatico della durata di cinque minuti durante i quali verranno passate venti slide a intervalli regolari (una ogni quindici secondi).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il titolo provvisiorio del mio intervento è <em>Fuga dalla Comfort Zone</em>. Ammetto di essere piuttosto nervoso. Il rischio di impappinarmi nel corso di quest’esibizione-rap è notevole, e tuttavia sono curioso di vedere come andrà a finire.</p>
<p>Al momento in cui scrivo il programma degli interventi è in definizione, ma sono già online i programmi del <!-- raw HTML omitted -->Business Panel<!-- raw HTML omitted --> e della <!-- raw HTML omitted -->Tavola Rotonda sulle Startup<!-- raw HTML omitted --> di domenica. L’evento sarà trasmesso in diretta streaming sui portali <!-- raw HTML omitted -->Wired Italia<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Ninja Marketing<!-- raw HTML omitted -->. In ogni caso se ci sarete fatemelo sapere (nei commenti qui sotto oppure via <!-- raw HTML omitted -->twitter<!-- raw HTML omitted --> o <!-- raw HTML omitted -->facebook<!-- raw HTML omitted -->), così organizziamo per incontrarci. A sabato!</p>
<p><em>Aggiornamento del 24.10.2011: sono disponibili <a href="http://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/" title="Il mio intervento al KnowCamp 2011">video e slides</a> del mio intervento al KnowCamp 2011</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Web Designer e Programmatori Front End si incontrano a From The Front 2011</title>
      <link>https://nicolaiarocci.com/web-designer-e-programmatori-front-end-si-incontrano-a-from-the-front-2011/</link>
      <pubDate>Fri, 23 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/web-designer-e-programmatori-front-end-si-incontrano-a-from-the-front-2011/</guid>
      <description>&lt;p&gt;Giovedì 29 Settembre sarò a Cesena per partecipare a &lt;!-- raw HTML omitted --&gt;From The Front 2011&lt;!-- raw HTML omitted --&gt;, conferenza-evento di una giornata dedicata a programmatori front end e web designer. Il programma dei talk pomeridiani è interessante, vi consiglio di dare una occhiata anche perché il costo di iscrizione è &lt;!-- raw HTML omitted --&gt;pari a zero&lt;!-- raw HTML omitted --&gt; irrisorio. Se venite battete un colpo: è una buona occasione per incontrarsi di persona (magari al party che seguirà l’evento).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Giovedì 29 Settembre sarò a Cesena per partecipare a <!-- raw HTML omitted -->From The Front 2011<!-- raw HTML omitted -->, conferenza-evento di una giornata dedicata a programmatori front end e web designer. Il programma dei talk pomeridiani è interessante, vi consiglio di dare una occhiata anche perché il costo di iscrizione è <!-- raw HTML omitted -->pari a zero<!-- raw HTML omitted --> irrisorio. Se venite battete un colpo: è una buona occasione per incontrarsi di persona (magari al party che seguirà l’evento).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Sui Vantaggi del Programmatore Poliglotta</title>
      <link>https://nicolaiarocci.com/sui-vantaggi-del-programmatore-poliglotta/</link>
      <pubDate>Wed, 21 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sui-vantaggi-del-programmatore-poliglotta/</guid>
      <description>&lt;p&gt;Per gran parte della mia carriera sono stato un programmatore client/server specializzato nel .NET Framework e in tutto quel gira intorno all’ecosistema Microsoft. Un paio di anni fa ho deciso di uscire dalla mia &lt;em&gt;&lt;!-- raw HTML omitted --&gt;comfort zone&lt;!-- raw HTML omitted --&gt;&lt;/em&gt; professionale, guardarmi attorno e, per citare &lt;a href=&#34;http://www.youtube.com/watch?v=Ex2fpsz-hQI&#34; title=&#34;Quanto è profonda la tana del Bianconiglio?&#34;&gt;qualcun’altro&lt;/a&gt;, andare a vedere &lt;em&gt;quanto è profonda la tana del Bianconiglio&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Tempo libero a disposizione non ce n’era. A quarant’anni tra lavoro, famiglia e attività agonistica mi rimaneva solo la via del furto: rubare ore al sonno per dedicarmi allo studio di nuovi linguaggi e piattaforme. Prima è stato il turno di JavaScript, poi di Python, Django, Ruby e infine Node e MongoDB. Ora mi considero un programmatore poliglotta, capace di scrivere codice in una moltitudine di linguaggi.&lt;/p&gt;
&lt;p&gt;Eppure in passato sono sempre stato convinto che fosse più produttivo concentrarsi su una sola piattaforma per conoscerla fino in fondo e sfruttarne al meglio le possibilità. Sulle ragioni che mi hanno indotto a prendere quella decisione potrei scrivere una decina di articoli, e magari lo farò prima o poi, ma quel che desidero condividere oggi sono le lezioni che questa esperienza mi ha insegnato.&lt;/p&gt;
&lt;p&gt;A dire il vero ci ho già provato una volta, buttando giù appunti e abbozzando un articolo poi miseramente abbandonato. Per fortuna qualche giorno fa sono incappato in &lt;!-- raw HTML omitted --&gt;Advantages of Being a Polyglot Programmer&lt;!-- raw HTML omitted --&gt;, stupefacente articolo di Davy Brion. Il suo è &lt;em&gt;precisamente&lt;/em&gt; il pezzo che io non riuscivo a scrivere, parola per parola. Davy elenca quelli che secondo lui sono i cinque principali vantaggi del programmatore poliglotta. Io ne aggiungo uno e ve li propongo – fate conto che sia io a parlare attraverso lui, o viceversa.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Per gran parte della mia carriera sono stato un programmatore client/server specializzato nel .NET Framework e in tutto quel gira intorno all’ecosistema Microsoft. Un paio di anni fa ho deciso di uscire dalla mia <em><!-- raw HTML omitted -->comfort zone<!-- raw HTML omitted --></em> professionale, guardarmi attorno e, per citare <a href="http://www.youtube.com/watch?v=Ex2fpsz-hQI" title="Quanto è profonda la tana del Bianconiglio?">qualcun’altro</a>, andare a vedere <em>quanto è profonda la tana del Bianconiglio</em>.</p>
<p>Tempo libero a disposizione non ce n’era. A quarant’anni tra lavoro, famiglia e attività agonistica mi rimaneva solo la via del furto: rubare ore al sonno per dedicarmi allo studio di nuovi linguaggi e piattaforme. Prima è stato il turno di JavaScript, poi di Python, Django, Ruby e infine Node e MongoDB. Ora mi considero un programmatore poliglotta, capace di scrivere codice in una moltitudine di linguaggi.</p>
<p>Eppure in passato sono sempre stato convinto che fosse più produttivo concentrarsi su una sola piattaforma per conoscerla fino in fondo e sfruttarne al meglio le possibilità. Sulle ragioni che mi hanno indotto a prendere quella decisione potrei scrivere una decina di articoli, e magari lo farò prima o poi, ma quel che desidero condividere oggi sono le lezioni che questa esperienza mi ha insegnato.</p>
<p>A dire il vero ci ho già provato una volta, buttando giù appunti e abbozzando un articolo poi miseramente abbandonato. Per fortuna qualche giorno fa sono incappato in <!-- raw HTML omitted -->Advantages of Being a Polyglot Programmer<!-- raw HTML omitted -->, stupefacente articolo di Davy Brion. Il suo è <em>precisamente</em> il pezzo che io non riuscivo a scrivere, parola per parola. Davy elenca quelli che secondo lui sono i cinque principali vantaggi del programmatore poliglotta. Io ne aggiungo uno e ve li propongo – fate conto che sia io a parlare attraverso lui, o viceversa.</p>
<!-- raw HTML omitted -->
<h2 id="quali-sono-i-vantaggi-del-programmatore-poliglotta">Quali sono i vantaggi del programmatore poliglotta?</h2>
<h3 id="espandere-i-propri-orizzonti">Espandere i propri orizzonti</h3>
<p>Nell’imparare un nuovo linguaggio c’è molto più che apprenderne la sintassi. Si scoprono nuove tecniche, nuove librerie e nuovi modi di affrontare e risolvere i problemi. Assorbiamo una conoscenza già diffusa nella comunità che si è raccolta attorno al linguaggio, e tuttavia nuova per noi. A seconda del nostro background può capitare di imparare tanto, oppure solo qualcosa qui e là. Se già conosciamo un linguaggio dinamico a oggetti, per esempio, impararne uno nuovo non aggiungerà granché al nostro bagaglio. Se al contrario conosciamo solo linguaggi statici, scoprirne uno dinamico sarà un’esperienza davvero arricchente. E’ proprio questa miscela di paradigmi e conoscenze nuove, grandi e piccole, che influenzerà in modo determinante il nostro modo di risolvere i problemi in futuro.</p>
<h3 id="imparare-più-facilmente">imparare più facilmente</h3>
<p>La pratica rende perfetti. Dedicarsi con costanza all’apprendimento rende più semplice l’atto stesso di apprendere. Tanti hanno difficoltà ad accettare novità che sembrano in conflitto con quel che conoscono. Studiare un linguaggio che si basa su nuovi paradigmi (pensate alla <!-- raw HTML omitted -->programmazione funzionale<!-- raw HTML omitted -->) è difficoltoso perché ci costringe a ragionare al di fuori di strutture e regole che ci sono familiari. La seconda volta sarà già più facile, perché l’esperienza precedente ci avrà insegnato a non lasciarci condizionare da ciò che sappiamo. La terza volta sarà ancora più semplice, e così via. Tutti noi impariamo a imparare imparando.</p>
<h3 id="rinnovare-la-passione-per-la-programmazione">rinnovare la passione per la programmazione</h3>
<p>Quando ero programmatore C# / VB.NET mi capitava ogni tanto di non divertirmi più. In quei momenti scrivere codice era solo lavoro, non più gioia e tanto meno passione. Quei periodi potevano durare un paio di settimane, a volte un mese o due. Da quando mi sono dedicato a nuovi linguaggi non mi è più capitato di annoiarmi. Imparare di continuo cose nuove rende tutto più interessante, divertente e senz’altro impegnativo.</p>
<h3 id="ridurre-la-dipendenza-dagli-strumenti-quotidiani-e-introdurne-di-nuovi">RIDurre la dipendenza dagli strumenti quotidiani e introdurne di nuovi</h3>
<p>Fino a due anni fa non prendevo nemmeno in considerazione l’idea di scrivere codice senza usare qualche tipo di IDE. Ero dipendente da Visual Studio: IntelliSense, completamento automatico, navigazione, debugger integrato… tutte <em>feature</em> alle quali non credevo di poter rinunciare. Oggi preferisco scrivere codice in un semplice text editor per programmatori (nel mio caso <a href="http://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/" title="Sublime Text 2">Sublime Text 2</a>), con una finestra terminale in cui lanciare i miei test. Fare a meno del debugger non solo è possibile, ma addirittura proficuo. Si procede a piccoli passi, facendo spesso test focalizzati che permettono di isolare e risolvere rapidamente i bug. Per motivi di lavoro ancora oggi uso e apprezzo Visual Studio ogni giorno, ma preferisco senz’altro lavorare in maniera spartana: text editor e terminale sono tutto quello che mi serve.</p>
<p>Lavorare così comporta una conseguenza importante. Si rende necessario (ri)diventare provetti nell’uso della finestra terminale, della linea di comando e, in alcune occasioni, addirittura di sistemi operativi diversi. Per imparare Ruby o Node spesso è meglio installare una distribuzione Linux (o lavorare su OS X se avete un Mac) piuttosto che tentare di far girare il tutto sotto Windows. In ogni caso conoscere la shell e i tool *NIX, specialmente di questi tempi, aggiungerà una freccia potente al nostro arco.</p>
<h3 id="ridurre-il-legame-col-linguaggio-prediletto">ridurre il legame col linguaggio prediletto</h3>
<p>Coloro che lavorano esclusivamente con una piattaforma tendono a sviluppare con essa un vero e proprio legame emotivo. Lo so per certo perché è capitato anche a me (e diverse volte) nel corso degli anni. Se siamo legati emotivamente a un linguaggio ci diventa difficile rimanere equilibrati nel corso di una discussione, o restare calmi se percepiamo che il nostro prediletto è sotto minaccia (pensiamo a quel che sta succedendo a Silverlight proprio <a href="http://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/" title="Windows 8 e il destino di Silverlight">in queste ore</a>). Praticando più linguaggi e piattaforme scopriamo che le nostre conoscenze e capacità sono trasferibili; che siamo programmatori a prescindere dagli strumenti che utilizziamo. Qualunque sia il destino della nostra piattaforma prediletta, noi non abbiamo nulla da temere.</p>
<h3 id="migliorare-e-ampliare-il-network-professionale">migliorare e ampliare il network professionale</h3>
<p>Studiare nuovi linguaggi e nuove piattaforme mi ha portato a conoscere molta più gente in due anni di quanta non ne abbia conosciuta nei venti precedenti. Quando si lavora a lungo nello stesso ambiente con gli stessi strumenti arriva il momento in cui non si ha (o non si sente) più bisogno di confrontarsi, informarsi e… imparare. Si acquisisce l’esperienza sufficiente a portare a casa il risultato, qualunque esso sia. Le stesse comunità di sviluppatori, per quanto ampie, tendono a chiudersi e diventare presto auto referenziali: stesse persone, stessi contributi, stesse domande e risposte. Aprirsi a comunità diverse illuminando la propria mente con idee che provengono dalle fonti più disparate è una esperienza esaltante. Soprattutto dopo anni di programmazione a testa bassa.</p>
<p><em>Una riduzione di questo articolo è stata oggetto di un mio Ignite (relazione lampo in cinque minuti) presentato il 8.10.2011 al KnowCamp 2011. Le slides e il video sono <a href="http://nicolaiarocci.com/il-mio-intervento-al-knowcamp-2011-fuga-dalla-comfort-zone/" title="Il mio intervento al KnowCamp 2011">disponibili online</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>SQL Server e il Cloud di Amazon EC2: vantaggi e svantaggi</title>
      <link>https://nicolaiarocci.com/sql-server-e-il-cloud-di-amazon-ec2-vantaggi-e-svantaggi/</link>
      <pubDate>Wed, 14 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sql-server-e-il-cloud-di-amazon-ec2-vantaggi-e-svantaggi/</guid>
      <description>&lt;p&gt;Se state considerando l’opzione Cloud per il vostro SQL Server non lasciatevi sfuggire l’ultimo articolo di Jeremiah Peschka, &lt;!-- raw HTML omitted --&gt;Configuring SQL Server in Amazon EC2&lt;!-- raw HTML omitted --&gt;. A dispetto del titolo non si tratta di un tutorial, ma di una analisi accurata di vantaggi e svantaggi legati al &lt;em&gt;deploy&lt;/em&gt; di un database SQL nel Cloud, a prescindere dalla piattaforma adottata.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il cloud è robusto e affidabile. Il cloud risolve ogni problema di scalabilità. Nel cloud, anche la cacca profuma di rose. In teoria queste affermazioni sono corrette, ma occorre darci dentro per trasformarle in realtà. Specialmente quando c’è un database nel mezzo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se state considerando l’opzione Cloud per il vostro SQL Server non lasciatevi sfuggire l’ultimo articolo di Jeremiah Peschka, <!-- raw HTML omitted -->Configuring SQL Server in Amazon EC2<!-- raw HTML omitted -->. A dispetto del titolo non si tratta di un tutorial, ma di una analisi accurata di vantaggi e svantaggi legati al <em>deploy</em> di un database SQL nel Cloud, a prescindere dalla piattaforma adottata.</p>
<blockquote>
<p>Il cloud è robusto e affidabile. Il cloud risolve ogni problema di scalabilità. Nel cloud, anche la cacca profuma di rose. In teoria queste affermazioni sono corrette, ma occorre darci dentro per trasformarle in realtà. Specialmente quando c’è un database nel mezzo.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Chess@home è una Intelligenza Artificiale Distribuita per gli Scacchi</title>
      <link>https://nicolaiarocci.com/chesshome-intelligenza-artificiale-distribuita-applicata-agli-scacchi-via-browser/</link>
      <pubDate>Fri, 09 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/chesshome-intelligenza-artificiale-distribuita-applicata-agli-scacchi-via-browser/</guid>
      <description>&lt;p&gt;Il progetto &lt;!-- raw HTML omitted --&gt;Chess@home&lt;!-- raw HTML omitted --&gt; è il vincitore del recente &lt;!-- raw HTML omitted --&gt;Node Knockout&lt;!-- raw HTML omitted --&gt;, ed una volta tanto si tratta di qualcosa di davvero innovativo e intrigante. Obiettivo: la creazione della più potente Intelligenza Artificiale per il gioco degli Scacchi al mondo, generata nientemeno che dai browser attivi sulla rete.&lt;/p&gt;
&lt;p&gt;L’elaborazione collaborativa distribuita è diventata famosa grazie a progetti come &lt;!-- raw HTML omitted --&gt;SETI@home&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Folding@home&lt;!-- raw HTML omitted --&gt;. Semplificando molto potremmo dire che questo tipo di applicazione prevede che un piccolo programma venga installato e fatto girare su decine di migliaia di computer volontari. La capacita elaborativa del progetto è data dalla somma delle elaborazioni individuali.&lt;/p&gt;
&lt;p&gt;La novità di Chess@Home consiste nell’idea di ricorrere a codice JavaScript che gira nel browser, dunque senza alcuna necessità di client dedicati. Appositi widget presenti nelle pagine dei siti aderenti innestano l’elaborazione sul computer del visitatore, potenzialmente decuplicando il numero di nodi che partecipano all’elaborazione (più visitatori accedono alla stessa pagina contemporaneamente).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il progetto <!-- raw HTML omitted -->Chess@home<!-- raw HTML omitted --> è il vincitore del recente <!-- raw HTML omitted -->Node Knockout<!-- raw HTML omitted -->, ed una volta tanto si tratta di qualcosa di davvero innovativo e intrigante. Obiettivo: la creazione della più potente Intelligenza Artificiale per il gioco degli Scacchi al mondo, generata nientemeno che dai browser attivi sulla rete.</p>
<p>L’elaborazione collaborativa distribuita è diventata famosa grazie a progetti come <!-- raw HTML omitted -->SETI@home<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Folding@home<!-- raw HTML omitted -->. Semplificando molto potremmo dire che questo tipo di applicazione prevede che un piccolo programma venga installato e fatto girare su decine di migliaia di computer volontari. La capacita elaborativa del progetto è data dalla somma delle elaborazioni individuali.</p>
<p>La novità di Chess@Home consiste nell’idea di ricorrere a codice JavaScript che gira nel browser, dunque senza alcuna necessità di client dedicati. Appositi widget presenti nelle pagine dei siti aderenti innestano l’elaborazione sul computer del visitatore, potenzialmente decuplicando il numero di nodi che partecipano all’elaborazione (più visitatori accedono alla stessa pagina contemporaneamente).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ facile intravedere complicazioni etiche ma occorre tenere conto del fatto che il progetto, messo in piedi in sole 48 ore, è nato soprattutto come esperimento per testare il limite delle tecnologie impiegate (Node.JS, MongoDB, JavaScript). Vi consiglio caldamente l’articolo di uno degli ideatori, <!-- raw HTML omitted -->Sylvain Zimmer<!-- raw HTML omitted -->, che descrive genesi e dettagli tecnici del progetto.</p>
<p>Già oggi potete giocare la vostra prima partita a scacchi contro la rete. Il mio cuore di nerd (che in anni ahimè troppo lontani ha fatto girare impunemente il client SETI per mesi e mesi) tifa per voi.</p>
<p><em>PS: domani al Romagna Camp 2011 terrò una relazione dal titolo “Quattro passi fra le nuvole (e non scordate il paracadute)”. Per saperne di più date una occhiata <a href="http://nicolaiarocci.com/quattro-passi-tra-le-nuvole-al-romagna-camp-2011/" title="Quattro passi fra le nuvole">qui</a>.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Print.css è il foglio di stile per il web designer attento all’ambiente</title>
      <link>https://nicolaiarocci.com/print-css-e-il-foglio-di-stile-per-il-web-designer-attento-allambiente/</link>
      <pubDate>Mon, 05 Sep 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/print-css-e-il-foglio-di-stile-per-il-web-designer-attento-allambiente/</guid>
      <description>&lt;p&gt;Carta e inchiostro costano eppure ci sono (ancora) molte ragioni per mandare in stampa una pagina web. David Bushell ha creato &lt;a href=&#34;http://printstylesheet.com/&#34; title=&#34;Print.css&#34;&gt;Print.css&lt;/a&gt;, un mini sito che incoraggia i web designer alla creazione di fogli di stile eco-compatibili che inviino alla stampante solo il necessario. In effetti la direttiva CSS &lt;code&gt;@media&lt;/code&gt; permette di farlo con facilità.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Carta e inchiostro costano eppure ci sono (ancora) molte ragioni per mandare in stampa una pagina web. David Bushell ha creato <a href="http://printstylesheet.com/" title="Print.css">Print.css</a>, un mini sito che incoraggia i web designer alla creazione di fogli di stile eco-compatibili che inviino alla stampante solo il necessario. In effetti la direttiva CSS <code>@media</code> permette di farlo con facilità.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 1.0</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-1-0/</link>
      <pubDate>Tue, 30 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-1-0/</guid>
      <description>&lt;p&gt;Dopo una breve e brillante Beta, con l’uscita della versione 1.0 il progetto open source &lt;!-- raw HTML omitted --&gt;Python Tools for Visual Studio&lt;!-- raw HTML omitted --&gt; entra nel novero delle estensioni ufficiali per Visual Studio 2010. Ne da notizia W. Somasegar sul suo weblog, con &lt;!-- raw HTML omitted --&gt;un articolo introduttivo&lt;!-- raw HTML omitted --&gt; in cui ci ricorda le caratteristiche salienti di PTVS: syntax highlighting, refactoring, debugging in tempo reale, interprete Python interattivo integrato e supporto per CPython, IronPython, JPython e PyPy.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Dopo una breve e brillante Beta, con l’uscita della versione 1.0 il progetto open source <!-- raw HTML omitted -->Python Tools for Visual Studio<!-- raw HTML omitted --> entra nel novero delle estensioni ufficiali per Visual Studio 2010. Ne da notizia W. Somasegar sul suo weblog, con <!-- raw HTML omitted -->un articolo introduttivo<!-- raw HTML omitted --> in cui ci ricorda le caratteristiche salienti di PTVS: syntax highlighting, refactoring, debugging in tempo reale, interprete Python interattivo integrato e supporto per CPython, IronPython, JPython e PyPy.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Imparare a programmare online con Codecademy</title>
      <link>https://nicolaiarocci.com/imparare-a-programmare-online-con-codecademy/</link>
      <pubDate>Fri, 26 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/imparare-a-programmare-online-con-codecademy/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Codecademy&lt;!-- raw HTML omitted --&gt; è una fantastica iniziativa che insegna a programmare online. Lanciata poco più di una settimana fa, ha già raccolto duecentomila utenti registrati. Brillante l’idea di integrare gli strumenti tipici del social network (badge, punteggi, seguire i progressi degli amici) con un interprete interattivo e un preciso feedback in tempo reale.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Codecademy è il modo più semplice per imparare a programmare. E’ interattivo, divertente, e lo puoi fare con gli amici&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Codecademy<!-- raw HTML omitted --> è una fantastica iniziativa che insegna a programmare online. Lanciata poco più di una settimana fa, ha già raccolto duecentomila utenti registrati. Brillante l’idea di integrare gli strumenti tipici del social network (badge, punteggi, seguire i progressi degli amici) con un interprete interattivo e un preciso feedback in tempo reale.</p>
<blockquote>
<p>Codecademy è il modo più semplice per imparare a programmare. E’ interattivo, divertente, e lo puoi fare con gli amici</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Sopravvivere a Google Panda in Italia</title>
      <link>https://nicolaiarocci.com/sopravvivere-a-google-panda-in-italia/</link>
      <pubDate>Wed, 24 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sopravvivere-a-google-panda-in-italia/</guid>
      <description>&lt;p&gt;Finalmente anche in Italia qualcuno pubblica un articolo originale e convincente sulla recente comparsa del “famigerato” algoritmo Google Panda. Molti SEO in questi mesi si sono stracciati le vesti, lamentando un attacco diretto da parte di Google alla loro maestà.&lt;/p&gt;
&lt;p&gt;L’autore di &lt;!-- raw HTML omitted --&gt;Surviving (Google) Panda in Italia&lt;!-- raw HTML omitted --&gt; dipana per bene l’ingarbugliata sequenza di annunci e implementazioni culminate poi nel Panda Update. Non mancano alcuni consigli sensati (e tanto per cambiare originali) e una interessante conclusione che vi lascio leggere da soli. E bravo &lt;!-- raw HTML omitted --&gt;Stuart&lt;!-- raw HTML omitted --&gt;!&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Finalmente anche in Italia qualcuno pubblica un articolo originale e convincente sulla recente comparsa del “famigerato” algoritmo Google Panda. Molti SEO in questi mesi si sono stracciati le vesti, lamentando un attacco diretto da parte di Google alla loro maestà.</p>
<p>L’autore di <!-- raw HTML omitted -->Surviving (Google) Panda in Italia<!-- raw HTML omitted --> dipana per bene l’ingarbugliata sequenza di annunci e implementazioni culminate poi nel Panda Update. Non mancano alcuni consigli sensati (e tanto per cambiare originali) e una interessante conclusione che vi lascio leggere da soli. E bravo <!-- raw HTML omitted -->Stuart<!-- raw HTML omitted -->!</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p> </p>
]]></content:encoded>
    </item>
    <item>
      <title>HTML e CSS di base per i Web Designer del futuro</title>
      <link>https://nicolaiarocci.com/html-e-css-di-base-per-i-web-designer-del-futuro/</link>
      <pubDate>Tue, 23 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/html-e-css-di-base-per-i-web-designer-del-futuro/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Don’t Fear the Internet&lt;!-- raw HTML omitted --&gt; è una ottima risorsa per Web Designer principianti. Attenzione ai dettagli, grande cura e ottimi contenuti sono il marchio distintivo di questo progetto di &lt;!-- raw HTML omitted --&gt;Jessica Hische&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Russ Maschmeyer&lt;!-- raw HTML omitted --&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sei un disegnatore, un fotografo, un artista o, più in generale, un creativo? Hai un sito che mai messo insieme con Dreamweaver grazie a quell’UNICA lezione scolastica di web design? Il sito non ce l’hai nemmeno, perché sono due anni che aspetti che tuo cugino lo faccia per te? Bè, noi siamo qui per aiutarti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Don’t Fear the Internet<!-- raw HTML omitted --> è una ottima risorsa per Web Designer principianti. Attenzione ai dettagli, grande cura e ottimi contenuti sono il marchio distintivo di questo progetto di <!-- raw HTML omitted -->Jessica Hische<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Russ Maschmeyer<!-- raw HTML omitted -->:</p>
<blockquote>
<p>Sei un disegnatore, un fotografo, un artista o, più in generale, un creativo? Hai un sito che mai messo insieme con Dreamweaver grazie a quell’UNICA lezione scolastica di web design? Il sito non ce l’hai nemmeno, perché sono due anni che aspetti che tuo cugino lo faccia per te? Bè, noi siamo qui per aiutarti.</p></blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Bootstrap è il CSS Framework di Twitter</title>
      <link>https://nicolaiarocci.com/bootstrap-from-twitter-twitter-developers/</link>
      <pubDate>Sun, 21 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/bootstrap-from-twitter-twitter-developers/</guid>
      <description>&lt;p&gt;Twitter rilascia Bootstrap, il CSS Framework creato inizialmente per uso interno e ora disponibile al pubblico.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is a collection of CSS and HTML conventions. It uses some of the latest browser techniques to provide you with stylish typography, forms, buttons, tables, grids, navigation and everything else you need in a super tiny (only 6k with gzip) resource.&lt;/p&gt;&lt;/blockquote&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;A prima vista sembra molto ben fatto. Per tutte le informazioni e il download visitate la bella &lt;!-- raw HTML omitted --&gt;home page&lt;!-- raw HTML omitted --&gt; del progetto.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Twitter rilascia Bootstrap, il CSS Framework creato inizialmente per uso interno e ora disponibile al pubblico.</p>
<blockquote>
<p>It is a collection of CSS and HTML conventions. It uses some of the latest browser techniques to provide you with stylish typography, forms, buttons, tables, grids, navigation and everything else you need in a super tiny (only 6k with gzip) resource.</p></blockquote>
<!-- raw HTML omitted -->
<p>A prima vista sembra molto ben fatto. Per tutte le informazioni e il download visitate la bella <!-- raw HTML omitted -->home page<!-- raw HTML omitted --> del progetto.</p>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>Mono 2.10.3 gira su OS X Lion (ed è vivo e vegeto)</title>
      <link>https://nicolaiarocci.com/mono-2-10-3-gira-su-os-x-lion-ed-e-vivo-e-vegeto/</link>
      <pubDate>Fri, 05 Aug 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/mono-2-10-3-gira-su-os-x-lion-ed-e-vivo-e-vegeto/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Xamarin, la compagnia che &lt;a href=&#34;http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/&#34; title=&#34;Progetto Mono salvato dal suo fondatore&#34;&gt;ha preso in mano il Progetto Mono&lt;/a&gt; dopo l’addio di Novell, ha appena rilasciato Mono 2.10.3. Ne da annuncio lo stesso Manuel de Icaza, storico deux-ex-machina del progetto e fondatore di Xamarin.&lt;/p&gt;
&lt;p&gt;Si tratta per lo più di una versione di manutenzione che &lt;!-- raw HTML omitted --&gt;risolve numerosi problemi&lt;!-- raw HTML omitted --&gt;, primo fra tutti l’instabilità di Mono sull’ultima versione di MacOS X Lion.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Xamarin, la compagnia che <a href="http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/" title="Progetto Mono salvato dal suo fondatore">ha preso in mano il Progetto Mono</a> dopo l’addio di Novell, ha appena rilasciato Mono 2.10.3. Ne da annuncio lo stesso Manuel de Icaza, storico deux-ex-machina del progetto e fondatore di Xamarin.</p>
<p>Si tratta per lo più di una versione di manutenzione che <!-- raw HTML omitted -->risolve numerosi problemi<!-- raw HTML omitted -->, primo fra tutti l’instabilità di Mono sull’ultima versione di MacOS X Lion.</p>
<p>L’importanza di questo aggiornamento va ben oltre le sue caratteristiche tecniche. Il titolo stesso dell’<!-- raw HTML omitted -->annuncio<!-- raw HTML omitted --> (And We Are Back) parla chiaro: si tratta di un segnale di continuità importante che Xamarin lancia alla comunità mondiale di sviluppatori Mono. Per informazioni sul progetto e sulle sue vicissitudini recenti vi invito a leggere l’<a href="http://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/" title="Il Progetto Mono salvato in extremis dal suo fondatore">articolo sul salvataggio di Mono</a> che ho scritto qualche tempo fa.</p>
]]></content:encoded>
    </item>
    <item>
      <title>JavaScript trucchi e suggerimenti avanzati</title>
      <link>https://nicolaiarocci.com/javascript-trucchi-e-suggerimenti-avanzati/</link>
      <pubDate>Mon, 18 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/javascript-trucchi-e-suggerimenti-avanzati/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Ho scovato quasi per caso &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Javascript Tips&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, incredibile collezione di trucchi e suggerimenti per JavaScript. Si tratta di decine di snippets rivolti soprattutto a chi JavaScript lo usa come un linguaggio vero e proprio e non, come spesso capita, quale semplice strumento per la manipolazione del DOM.&lt;/p&gt;
&lt;p&gt;Tra le tante chicche (alcune davvero gustose) vi segnalo a caso: &lt;!-- raw HTML omitted --&gt;concatenare due array&lt;!-- raw HTML omitted --&gt; senza crearne uno nuovo; mandare un testo in &lt;!-- raw HTML omitted --&gt;output su più righe&lt;!-- raw HTML omitted --&gt;; una funzione per &lt;!-- raw HTML omitted --&gt;eliminare un elemento da un array&lt;!-- raw HTML omitted --&gt;; una riga di codice che &lt;!-- raw HTML omitted --&gt;stampa lo stack&lt;!-- raw HTML omitted --&gt; delle chiamate correnti; un esempio di come &lt;!-- raw HTML omitted --&gt;trasformare gli argomenti di una funzione in array&lt;!-- raw HTML omitted --&gt;. Ce n’é per tutti i palati, dal principiante al più esperto, &lt;!-- raw HTML omitted --&gt;date una occhiata&lt;!-- raw HTML omitted --&gt; voi stessi.&lt;/p&gt;
&lt;p&gt;Buona parte dei trucchi funziona con&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Ho scovato quasi per caso <strong><!-- raw HTML omitted -->Javascript Tips<!-- raw HTML omitted --></strong>, incredibile collezione di trucchi e suggerimenti per JavaScript. Si tratta di decine di snippets rivolti soprattutto a chi JavaScript lo usa come un linguaggio vero e proprio e non, come spesso capita, quale semplice strumento per la manipolazione del DOM.</p>
<p>Tra le tante chicche (alcune davvero gustose) vi segnalo a caso: <!-- raw HTML omitted -->concatenare due array<!-- raw HTML omitted --> senza crearne uno nuovo; mandare un testo in <!-- raw HTML omitted -->output su più righe<!-- raw HTML omitted -->; una funzione per <!-- raw HTML omitted -->eliminare un elemento da un array<!-- raw HTML omitted -->; una riga di codice che <!-- raw HTML omitted -->stampa lo stack<!-- raw HTML omitted --> delle chiamate correnti; un esempio di come <!-- raw HTML omitted -->trasformare gli argomenti di una funzione in array<!-- raw HTML omitted -->. Ce n’é per tutti i palati, dal principiante al più esperto, <!-- raw HTML omitted -->date una occhiata<!-- raw HTML omitted --> voi stessi.</p>
<p>Buona parte dei trucchi funziona con</p>
<p>la versione più recente del motore JavaScript (1.8) e non girano nella implementazione Microsoft del linguaggio (1.5), comunque per ogni snippet viene indicata la versione supportata. Non scordate di dare una occhiata ai commenti a fondo pagina per ulteriori suggerimenti e approfondimenti.</p>
<p>Buona esplorazione!</p>]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio 2010 arriva la RC1</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-2010-arriva-la-rc1/</link>
      <pubDate>Tue, 12 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-2010-arriva-la-rc1/</guid>
      <description>&lt;p&gt;Prosegue senza intoppi il cammino di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python Tools per Visual Studio&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, il progetto open source targato Microsoft che consente di programmare in Python con Visual Studio 2010. Dopo il &lt;a href=&#34;http://nicolaiarocci.com/python-tools-per-visual-studio-2010/&#34; title=&#34;Programmare in Python con Visual Studio 2010&#34;&gt;lancio ufficiale&lt;/a&gt; dello scorso marzo e la successiva &lt;a href=&#34;http://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/&#34; title=&#34;Python Tools per Visual Studio 2010 Beta 2&#34;&gt;Beta 2&lt;/a&gt; di maggio, ieri è stata presentata la &lt;strong&gt;Release Candidate 1&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Prosegue senza intoppi il cammino di <strong><!-- raw HTML omitted -->Python Tools per Visual Studio<!-- raw HTML omitted --></strong>, il progetto open source targato Microsoft che consente di programmare in Python con Visual Studio 2010. Dopo il <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">lancio ufficiale</a> dello scorso marzo e la successiva <a href="http://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/" title="Python Tools per Visual Studio 2010 Beta 2">Beta 2</a> di maggio, ieri è stata presentata la <strong>Release Candidate 1</strong>.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Oltre 200 i bug risolti e notevoli sono le novità introdotte, come per esempio il supporto per il refactoring. Consultate le <!-- raw HTML omitted -->release notes<!-- raw HTML omitted --> conoscere tutte le novità. Se volete saperne di più su questo interessante progetto vi invito a leggere <strong><a href="http://nicolaiarocci.com/python-tools-per-visual-studio-2010/" title="Programmare in Python con Visual Studio 2010">Programmare in Python con Visual Studio 2010</a></strong>,  la recensione che ho scritto in occasione del lancio.</p>
<p><em>Aggiornamento del 2.8.2011: siamo arrivati alla RC2</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Google Web Fonts 2 i font gratuiti e ottimizzati per il Web</title>
      <link>https://nicolaiarocci.com/google-web-fonts-v2-i-font-gratuiti-e-ottimizzati-per-il-web/</link>
      <pubDate>Tue, 05 Jul 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-web-fonts-v2-i-font-gratuiti-e-ottimizzati-per-il-web/</guid>
      <description>&lt;p&gt;Il progetto &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Web Fonts v2&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; offre a webmaster, designer e sviluppatori un accesso facile e gratuito a una ricca selezione di fonti tipografiche di qualità, ottimizzate per il web. Google sostiene che non ci dovrebbero essere barriere finanziare per la costruzione di siti web, e che il progetto Google Web Font contribuisce alla creazione di un web più bello, leggibile, accessibile e aperto. Secondo Google nei prossimi anni la gran parte di siti web adotteranno i web fonts.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Il progetto <strong><!-- raw HTML omitted -->Google Web Fonts v2<!-- raw HTML omitted --></strong> offre a webmaster, designer e sviluppatori un accesso facile e gratuito a una ricca selezione di fonti tipografiche di qualità, ottimizzate per il web. Google sostiene che non ci dovrebbero essere barriere finanziare per la costruzione di siti web, e che il progetto Google Web Font contribuisce alla creazione di un web più bello, leggibile, accessibile e aperto. Secondo Google nei prossimi anni la gran parte di siti web adotteranno i web fonts.</p>
<!-- raw HTML omitted -->
<p>La versione 2 di Google Web Fonts è appena stata rilasciata ed è ricca di novità. La nuova interfaccia consente di consultare rapidamente la directory di quasi 200 fonti tipografiche, inserendo quelle prescelte in una collezione personale. Gli esempi possono essere visualizzati come parole, frasi oppure interi paragrafi di testo. E’ anche possibile vedere tutti assieme i font della propria collezione, in una apposita pagina di prova.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>I web font non sono una tecnologia nuova, sono stati <!-- raw HTML omitted -->introdotti dalle specifiche CSS3<!-- raw HTML omitted --> (2002) e sono già molto diffusi. Quelli di Google sono forniti dinamicamente dalla <strong><!-- raw HTML omitted -->Google Web Fonts API<!-- raw HTML omitted --></strong>, una applicazione ad alte prestazioni ospitata sui server di Mountain View. Il lavoro che dobbiamo fare noi è semplicemente quello di incollare una riga di codice nella nostra pagina HTML, dopodiché potremo usare il web font come un qualunque font standard. Questa soluzione garantisce indipendenza dalla piattaforma software del client e libertà di scelta, al costo di un minimo rischio di incompatibilità verso browser molto datati (<!-- raw HTML omitted -->qui<!-- raw HTML omitted --> trovate una lista aggiornata).</p>
<p><!-- raw HTML omitted -->Google tiene molto alla velocità della rete, e dei siti web in particolare, tanto da farne uno dei fattori di ranking per il suo motore di ricerca. Non stupisce quindi che venga fornito anche un indicatore di prestazioni che, in base al tipo e alle caratteristiche dei font selezionati, stima il tempo di caricamento del font nella nostra pagina web. In generale l’accesso alla API (e al sottostante CDN) è rapidissimo e non dovrebbe porre alcun tipo di problema.</p>
<p>Il mio interesse in Google Web Font v2 è nato in seguito alla visione della anteprima presentata alla <!-- raw HTML omitted -->Google I/O 2011<!-- raw HTML omitted -->. Se volete potete seguirla per intero anche voi:</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p> </p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #3: Orgoglio</title>
      <link>https://nicolaiarocci.com/dei-vizi-del-programmatore-3-lorgoglio/</link>
      <pubDate>Wed, 29 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-del-programmatore-3-lorgoglio/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;Tutto comincia con una normale riunione tra programmatori, magari dedicata all’analisi di un nuovo intrigante progetto software. I toni inizialmente tranquilli all’improvviso si alzano e quello che doveva essere un incontro di routine si trasforma rapidamente in qualcos’altro. La discussione, ora vivace e concitata, diventa un vero e proprio alterco. Sedie penne e matite vengono spostate freneticamente, le voci si sovrappongono l’un l’altra e man mano che il tempo passa il meeting assomiglia sempre più a un furioso scontro tra galli combattenti. Se avete una certa carriera alle spalle ci siete già passati; se non l’avete state tranquilli, prima o poi ci passerete anche voi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p>Tutto comincia con una normale riunione tra programmatori, magari dedicata all’analisi di un nuovo intrigante progetto software. I toni inizialmente tranquilli all’improvviso si alzano e quello che doveva essere un incontro di routine si trasforma rapidamente in qualcos’altro. La discussione, ora vivace e concitata, diventa un vero e proprio alterco. Sedie penne e matite vengono spostate freneticamente, le voci si sovrappongono l’un l’altra e man mano che il tempo passa il meeting assomiglia sempre più a un furioso scontro tra galli combattenti. Se avete una certa carriera alle spalle ci siete già passati; se non l’avete state tranquilli, prima o poi ci passerete anche voi.</p>
<h2 id="l8217ego-del-programmatore">L’Ego del Programmatore</h2>
<p>Quasi tutti i programmatori con cui ho avuto a che fare, incluso il sottoscritto, condividono almeno un tratto caratteriale: un ego ingombrante. <!-- raw HTML omitted -->Mike Bernat<!-- raw HTML omitted --> ci ricorda che diventare bravi programmatori è un processo lungo e impegnativo, che ci induce ad affinare le nostre capacità analitiche sviluppando mentalità e attitudine al perfezionismo. Alla fine del percorso ci troviamo in dote una forte fiducia nelle nostre capacità professionali, una fiducia che in alcune occasioni rischia di scatenare quello che io chiamo l’<em>ego del programmatore</em>, ovvero il nostro possente orgoglio.</p>
<p>Nel suo libro <!-- raw HTML omitted -->The Psychology of Computer Programming<!-- raw HTML omitted -->, <!-- raw HTML omitted -->Gerald M. Weinberg<!-- raw HTML omitted --> propone un’idea tanto semplice quanto difficile da mettere in pratica:</p>
<blockquote>
<p>L’idea è che i programmatori devono combattere la loro naturale tendenza a considerare i loro programmi come parte di se stessi, un atteggiamento che comporta il rifiuto preconcetto di ogni tipo di critica. Piuttosto, dovrebbero fare del loro meglio per considerare le loro creazioni come oggetti indipendenti da se stessi, distaccati dal proprio io, e ascoltare le critiche in modo spassionato, giudicandole nel merito. E’ una vera e propria disciplina spirituale della quale nessuno di noi [programmatori] è dotato, ma vale la pena provarci.</p></blockquote>
<p>Personalmente ricordo diverse occasioni in cui mio malgrado mi sono lasciato trascinare in “combattimenti tra galli”. A volte ne sono uscito vincente, altre volte ho dovuto ripiegare (non senza aver perduto qualche piuma). Col tempo credo e spero di essere migliorato, i consigli di Weinberg ho cercato e cerco tutt’ora di seguirli, ma certo la strada è lunga e tortuosa. E’ pur vero che in alcune occasioni l’aver ceduto, ritirando le mie proposte in favore di quelle altrui, si è rivelato un grave errore. Le conseguenze di certe scelte fatte in base a chi fosse il gallo più forte del pollaio, le pago ancora oggi. Ho imparato a mie spese che non sempre l’orgoglio del programmatore è un tratto negativo, anzi!</p>
<p>Se la vostra idea è quella giusta sostenetela a spada tratta fino in fondo, ma accertatevi che non sia esclusivamente il vostro orgoglio a condurre le trattative! In queste occasioni è molto importante concedere diritto di parola e giusta attenzione ai nostri interlocutori, soffermandoci a meditare sulle idee e le critiche ricevute prima di respingerle a priori. Se le riteniamo fondate facciamone tesoro apportando le dovute correzioni alla nostra stessa idea. Ciò che più conta, in realtà, è la qualità finale del progetto. Se alla fine si rivelerà un successo, il nostro orgoglio ne sarà ampiamente ripagato.</p>
<p><em>PS: a proposito di Weinberg, il suo libro è del 1971 ma è ancora attualissimo e ve lo consiglio caldamente. E’ disponibile in formato <!-- raw HTML omitted -->eBook su Amazon<!-- raw HTML omitted --> e altrove a <!-- raw HTML omitted -->prezzi modici<!-- raw HTML omitted -->. Non lasciatevi ingannare dal fatto che nel testo si parli di linguaggi ormai superati. In quarant’anni la gente non è cambiata affatto.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Noi programmatori miglioriamo con l’età (forse)</title>
      <link>https://nicolaiarocci.com/noi-programmatori-miglioriamo-con-leta-forse/</link>
      <pubDate>Tue, 14 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/noi-programmatori-miglioriamo-con-leta-forse/</guid>
      <description>&lt;p&gt;Man mano che partecipo ai vari eventi in giro per l’Italia mi capita sempre più spesso di ritrovarmi a essere, tra i partecipanti, uno dei più anziani. L’altro giorno al &lt;!-- raw HTML omitted --&gt;Cowo on the Beach&lt;!-- raw HTML omitted --&gt; distanziavo tutti di almeno una decade. Mi sono detto che i veterani non amano frequentare gli eventi pubblici, non tanto quanto li apprezzavano da giovani, e mi sono messo l’anima in pace.&lt;/p&gt;
&lt;p&gt;Fino a stamattina, quando un bell’articolo di &lt;!-- raw HTML omitted --&gt;Peter Knego&lt;!-- raw HTML omitted --&gt; mi ha svelato la scomoda verità (che inconsciamente rifiutavo di considerare). &lt;strong&gt;I programmatori oltre i trent’anni, per non dire dei quaranta, sono merce rara&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Partendo dai dati pubblici messi a disposizione da &lt;!-- raw HTML omitted --&gt;StackOverflow&lt;!-- raw HTML omitted --&gt; e relativi a un campione di ben 37.400 programmatori, Peter ha indagato sul rapporto tra età, reputazione e quantità di programmatori ancora attivi. Ne è uscita una serie di grafici davvero interessante.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Man mano che partecipo ai vari eventi in giro per l’Italia mi capita sempre più spesso di ritrovarmi a essere, tra i partecipanti, uno dei più anziani. L’altro giorno al <!-- raw HTML omitted -->Cowo on the Beach<!-- raw HTML omitted --> distanziavo tutti di almeno una decade. Mi sono detto che i veterani non amano frequentare gli eventi pubblici, non tanto quanto li apprezzavano da giovani, e mi sono messo l’anima in pace.</p>
<p>Fino a stamattina, quando un bell’articolo di <!-- raw HTML omitted -->Peter Knego<!-- raw HTML omitted --> mi ha svelato la scomoda verità (che inconsciamente rifiutavo di considerare). <strong>I programmatori oltre i trent’anni, per non dire dei quaranta, sono merce rara</strong>.</p>
<p>Partendo dai dati pubblici messi a disposizione da <!-- raw HTML omitted -->StackOverflow<!-- raw HTML omitted --> e relativi a un campione di ben 37.400 programmatori, Peter ha indagato sul rapporto tra età, reputazione e quantità di programmatori ancora attivi. Ne è uscita una serie di grafici davvero interessante.</p>
<h2 id="quantità-di-programmatori-per-fasce-di-età">Quantità di Programmatori per fasce di Età</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La distribuzione per età (in blu nel grafico) è stata una bella sorpresa. E’ risaputo che col passare degli anni gran parte dei programmatori tende a cambiare carriera, di solito progredendo verso ruoli manageriali. E’ l’entità della riduzione che, almeno dal mio punto di vista, è stupefacente. Il picco si raggiunge a soli 27 anni, dopo di ché il numero dei programmatori si dimezza ogni 6 o 7 anni.</p>
<h2 id="età-e-reputazione-dei-programmatori">Età e Reputazione dei Programmatori</h2>
<p>Osservate come nel grafico precedente la reputazione dei programmatori su Stack Overflow (in rosso) tenda ad aumentare con l’età. Si tratta quasi di una progressione lineare. L’andamento è meglio comprensibile se diamo una occhiata a quest’altro grafico:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>I programmatori veterani pongono meno domande su Stack Overflow, ma rispondono molto più frequentemente dei loro colleghi più giovani. Un quarantenne risponde mediamente il doppio delle volte di un collega ventenne.</p>
<h2 id="i-veterani-sono-davvero-più-abili-dei-giovani">I veterani sono davvero più abili dei giovani?</h2>
<p>A questo punto Peter si è posto una domanda intrigante: la qualità delle risposte migliora con l’età? I veterani forniscono le risposte migliori? Il meccanismo di premiazione delle domande e delle risposte utilizzato da StackOverflow ha permesso a Peter di elaborare l’andamento dei voti positivi ottenuti, suddivisi  per età :</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il grafico dimostra che la qualità media delle risposte non migliora significativamente in rapporto all’età dei programmatori. A quanto pare i veterani migliorano la loro reputazione soprattutto fornendo più risposte, piuttosto che migliorandone la qualità.</p>
<p>Riassumendo:</p>
<ul>
<li>Il numero di programmatori cala significativamente con l’età. L’apice è attorno ai 27 anni, poi si verifica un crollo costante.</li>
<li>I programmatori quarantenni rispondono al doppio e pongono metà delle domande dei colleghi ventenni. I veterani insegnano e i giovani imparano, come dovrebbe essere.</li>
<li>La qualità delle risposte non migliora significativamente col passare degli anni.</li>
<li>I veterani migliorano la loro reputazione soprattutto perché sono molto più attivi dei loro giovani colleghi.</li>
</ul>
<p>Ci sarebbe molto da dire a proposito di questi dati. Per esempio si potrebbe ipotizzare che i veterani abbiano semplicemente più tempo a loro disposizione per rispondere ai quesiti posti dai colleghi, ma quel che balza all’occhio qui è senz’altro il calo del numero di programmatori man mano che l’età avanza.</p>
<p>Per quanto mi riguarda, a 41 anni suonati, mi trovo già al di là del guado. La cosa è ancor più imbarazzante visto e considerato che non credo né mi aspetto di cambiare mestiere nei prossimi anni. E voi, miei cari lettori, a che punto del percorso vi trovate ora? Io ora spengo tutto e me ne vado in piscina a fare il ragazzino. Tiè.</p>]]></content:encoded>
    </item>
    <item>
      <title>Qualche riflessione sull’esperienza del Co-Working</title>
      <link>https://nicolaiarocci.com/qualche-riflessione-sullesperienza-del-co-working/</link>
      <pubDate>Mon, 13 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/qualche-riflessione-sullesperienza-del-co-working/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Faccio subito mie le riflessioni di &lt;!-- raw HTML omitted --&gt;Gianluca Diegoli&lt;!-- raw HTML omitted --&gt; sul primo esperimento di co-working in spiaggia, a cui ho partecipato pure io:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mentre tornavo in auto, riflettevo di quanta tristezza in questi anni ho visto transitare in molti uffici in cui aleggia quel senso di prigione, in cui le persone si sentono agli arresti domiciliari, mangiano solo con colleghi che odiano, con cui parlano di un lavoro o di un capo che altrettanto odiano, in cui la produttività e la creatività, apparentemente garantite dallo svolgersi in ambiente controllato e da orari stringenti, in realtà siano minime. Anzi, proprio quel sistema che in passato era stato creato per controllare il lavoratore, come se fosse un animale d’allevamento, ora è la causa dell’inefficienza e del disinteresse.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Nella intervista semi-seria che trovate qui sotto (mescolata a quelle degli amici) dichiaro che consiglierei senz’altro l’esperienza ai miei dipendenti. Confermo. I miei splendidi ragazzi lavorerebbero felicemente anche (forse soprattutto) sul cucuzzolo di una montagna, ma sulla efficacia del co-working ad ampio spettro qualche perplessità l’avrei.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Faccio subito mie le riflessioni di <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted --> sul primo esperimento di co-working in spiaggia, a cui ho partecipato pure io:</p>
<blockquote>
<p>Mentre tornavo in auto, riflettevo di quanta tristezza in questi anni ho visto transitare in molti uffici in cui aleggia quel senso di prigione, in cui le persone si sentono agli arresti domiciliari, mangiano solo con colleghi che odiano, con cui parlano di un lavoro o di un capo che altrettanto odiano, in cui la produttività e la creatività, apparentemente garantite dallo svolgersi in ambiente controllato e da orari stringenti, in realtà siano minime. Anzi, proprio quel sistema che in passato era stato creato per controllare il lavoratore, come se fosse un animale d’allevamento, ora è la causa dell’inefficienza e del disinteresse.</p></blockquote>
<p>Nella intervista semi-seria che trovate qui sotto (mescolata a quelle degli amici) dichiaro che consiglierei senz’altro l’esperienza ai miei dipendenti. Confermo. I miei splendidi ragazzi lavorerebbero felicemente anche (forse soprattutto) sul cucuzzolo di una montagna, ma sulla efficacia del co-working ad ampio spettro qualche perplessità l’avrei.</p>
<h2 id="co-working-per-tutti">Co-Working per tutti?</h2>
<p>Le persone che odiano il lavoro e/o i loro colleghi, quelle a cui allude Gianluca nel corso del suo ragionamento, come reagirebbero immerse in un ambiente più ludico e ricreativo di quello abituale? Le tensioni si smorzerebbero e la produttività ne guadagnerebbe oppure, al contrario, approfitterebbero della situazione per rilassarsi fin troppo, cedendo alle inevitabili distrazioni? In fin dei conti l’esperimento <strong><!-- raw HTML omitted -->Cowo on the Beach<!-- raw HTML omitted --></strong> ha avuto successo anche e soprattutto, credo, perché i partecipanti sono tutte persone fortemente motivate, innamorate del proprio lavoro (e credetemi, a parte le battute ognuno di noi ha <em>effettivamente</em> lavorato nel corso della giornata!).</p>
<p>Ogni ambiente di lavoro è unico e distino, quindi non penso che esista una risposta assoluta, ma questa è una domanda che ogni datore di lavoro si porrebbe senz’altro. L’argomento mi sta particolarmente a cuore perché proprio in queste settimane stiamo valutando la possibilità di sperimentare in azienda metodi di lavoro alternativi a quelli tradizionali, come per esempio il telelavoro.</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<h2 id="sulla-efficacia-dei-piccoli-eventi">Sulla efficacia dei piccoli eventi</h2>
<p>Nel <!-- raw HTML omitted -->suo articolo<!-- raw HTML omitted --> Gianluca accenna al fatto che il tempo incerto ha scoraggiato alcuni di quelli che si erano iscritti all’evento. E’ un peccato in effetti, anche perché la giornata tutto sommato è stata bella (abbiamo fatto anche il bagno!). A tavola mi dicevo però che non tutto il male vien per nuocere. Il gruppo ristretto ha consentito a tutti partecipare attivamente alla stessa discussione. Una tavolata di molte persone avrebbe portato alla creazione dei mini-conciliaboli tipici degli eventi di più ampio respiro, con conseguente frammentazione della discussione. E’ più facile che si creino intimità e senso di unità quando il gruppo è ridotto.</p>
<p>Con questo non voglio dire che sono contento delle assenze: si partecipa a un evento proprio per conoscere nuove persone interessanti. Senz’altro però la formula “cowobeach” è interessante anche perché  è diversa nei numeri. Non si tratta di uno dei soliti eventi che puntano alla partecipazione di massa.</p>
<p><!-- raw HTML omitted -->Nota a margine per i geek che mi leggono<!-- raw HTML omitted --></p>
<p>L’81% dei notebook impiegati al #cowobeach erano dei <strong>Mac Book</strong>. Io probabilmente rappresentavo il caso più singolare: in realtà scrivevo ed eseguivo codice sulla mia postazione Windows in ufficio, collegato dalla spiaggia via TeamViewer. Fa impressione constatare come in pochi anni l’adozione dei Mac da parte dei professionisti del settore sia aumentata.</p>]]></content:encoded>
    </item>
    <item>
      <title>Domani si lavora in spiaggia! Vieni al #cowobeach</title>
      <link>https://nicolaiarocci.com/domani-si-lavora-in-spiaggia-vieni-al-cowobeach/</link>
      <pubDate>Thu, 09 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/domani-si-lavora-in-spiaggia-vieni-al-cowobeach/</guid>
      <description>&lt;p&gt;Se siete in Romagna e dintorni forse potete ancora farci un pensierino: domani venite a lavorare in spiaggia! &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Cowo on the beach&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è una bella iniziativa organizzata da &lt;!-- raw HTML omitted --&gt;Alessandra Farabegoli&lt;!-- raw HTML omitted --&gt; su suggerimento di &lt;!-- raw HTML omitted --&gt;Gianluca Diegoli&lt;!-- raw HTML omitted --&gt;. Di cosa si tratta? Semplice:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Giornata di temporary coworking on the beach: ci troviamo la mattina al Boca Barranca, il wifi c’è ed è gratuito, la mattina si lavora, poi bagno in mare, pranzo, di nuovo lavoro e.. aperitivo! Un anticipo del RomagnaCamp che si terrà, sempre al Boca Barranca, dal 9 all’11 settembre&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Se siete in Romagna e dintorni forse potete ancora farci un pensierino: domani venite a lavorare in spiaggia! <strong><!-- raw HTML omitted -->Cowo on the beach<!-- raw HTML omitted --></strong> è una bella iniziativa organizzata da <!-- raw HTML omitted -->Alessandra Farabegoli<!-- raw HTML omitted --> su suggerimento di <!-- raw HTML omitted -->Gianluca Diegoli<!-- raw HTML omitted -->. Di cosa si tratta? Semplice:</p>
<blockquote>
<p>Giornata di temporary coworking on the beach: ci troviamo la mattina al Boca Barranca, il wifi c’è ed è gratuito, la mattina si lavora, poi bagno in mare, pranzo, di nuovo lavoro e.. aperitivo! Un anticipo del RomagnaCamp che si terrà, sempre al Boca Barranca, dal 9 all’11 settembre</p></blockquote>
<p>Alessandra ha appena pubblicato un <!-- raw HTML omitted -->aggiornamento<!-- raw HTML omitted --> con tanto di previsioni del tempo (non male dai) e suo programma di lavoro. Il mio è semplice: scrivere (poco) codice all’aria aperta e fare conoscenza con <!-- raw HTML omitted -->tanta bella gente<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Se decidete di venire, anche all’ultimo momento, <!-- raw HTML omitted -->iscrivetevi<!-- raw HTML omitted --> comunque! A domani!</p>
]]></content:encoded>
    </item>
    <item>
      <title>Windows 8 e i dubbi sul destino di Silverlight</title>
      <link>https://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/</link>
      <pubDate>Wed, 08 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/windows-8-e-i-dubbi-sul-destino-di-silverlight/</guid>
      <description>&lt;p&gt;Con un &lt;!-- raw HTML omitted --&gt;filmato di 10 minuti&lt;!-- raw HTML omitted --&gt; Microsoft ha presentato in anteprima il nuovo Windows 8. A molti non è sfuggita l’enfasi su HTML5 e JavaScript, annunciate come le tecnologie con le quali costruire le nuove accattivanti applicazioni per Windows 8. Il fatto che non si faccia cenno a Silverlight, WPF o .NET sta causando un bel po’ di preoccupazione.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Con un <!-- raw HTML omitted -->filmato di 10 minuti<!-- raw HTML omitted --> Microsoft ha presentato in anteprima il nuovo Windows 8. A molti non è sfuggita l’enfasi su HTML5 e JavaScript, annunciate come le tecnologie con le quali costruire le nuove accattivanti applicazioni per Windows 8. Il fatto che non si faccia cenno a Silverlight, WPF o .NET sta causando un bel po’ di preoccupazione.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<blockquote>
<p>You all saw a very small technology demo of Windows 8, and a brief press release. We’re all being quiet right now because we can’t comment on this. It’s not because we don’t care, aren’t listening, have given up, or are agreeing or disagreeing with you on something. All I can say for now is to please wait until September. If we say more before then, that will be great, but there are no promises (and I’m not aware of any plans) to say more right now. I’m very sorry that there’s nothing else to share at the moment. I know that answer is terrible, but it’s all that we can say right now. Seriously.</p></blockquote>
<p>Quindi bocche cucite, almeno fino a Settembre. In seguito Brown interviene ancora, tirato per la giacchetta dai molti che hanno interpretato le sue parole nelle maniere più disparate:</p>
<blockquote>
<p>This whole thing has blown way out of proportion. Base your information on our primary sources (like our press release), not on third party speculation. That’s not to minimize how everyone feels, but keep in mind that Windows 8 itself is still a ways off from retail, and even much further away from internal IT adoption. The 8 weeks until //build/ is a pretty small amount of time to wait in comparison.</p>
<p>Take some vacation time this summer, and look forward to the //build/ conference. Stop speculating based on just a small demo of some very cool new technology. Tell your management to do the same: if they’re basing your project work for the next X years on the results of a quick demo for an unreleased operating system, then they are doing you and your company a real disservice.</p></blockquote>
<p>Windows 8 è ben lontano dall’essere pronto, e quel che si è visto nel filmato è solo la prima di una serie di anteprime. Inutile fare speculazioni basate su una demo di pochi minuti. Questa estate godetevi le vacanza, ne riparleremo al vostro ritorno. Dite ai vostri manager di fare lo stesso. <strong>Se stanno pianificando il lavoro dei prossimi anni basandosi solo su una breve anteprima di un sistema operativo non ancora pronto, allora stanno facendo un grave errore</strong>.</p>
<h2 id="non-è-mica-la-prima-volta">Non è mica la prima volta</h2>
<p>Niente da obiettare da parte mia. Mi limito a rilevare che non è la prima volta che il futuro delle piattaforme Microsoft viene messo in discussione anche dallo stesso personale Microsoft. Leggendaria la gaffe di <!-- raw HTML omitted -->Bob Muglia<!-- raw HTML omitted -->, Vice President for Server and Tools Businesses (mica cotica) riportata fedelmente da <!-- raw HTML omitted -->Mary Jo Foley<!-- raw HTML omitted -->:</p>
<blockquote>
<p>“Silverlight is our development platform for Windows Phone,” he said. Silverlight also has some “sweet spots” in media and line-of-business applications, he said.</p>
<p>But when it comes to touting Silverlight as Microsoft’s vehicle for delivering a cross-platform runtime, “<strong>our strategy has shifted</strong>,” Muglia told me.</p>
<p>Silverlight will continue to be a cross-platform solution, working on a variety of operating system/browser platforms, going forward, he said. “But <strong>HTML is the only true cross platform solution for everything</strong>, including (Apple’s) iOS platform,” Muglia said.</p></blockquote>
<p>All’epoca fu necessario un comunicato congiunto di Steve Ballmer (CEO Microsoft) e del penitente Bob Muglia per acquietare la tempesta scatenata da queste parole. Sarà un caso che recentemente Muglia abbia annunciato il trasloco ad altri lidi?</p>
<p>Il fatto è che le tante aziende che hanno investito molto e – ahimé – esclusivamente sulle piattaforme Microsoft ora guardano con terrore a uno scenario, per quanto improbabile, che non veda Silverlight, WPF e .NET in cima all’agenda della casa madre.</p>
<h2 id="img-classalignright-titlehtml5-logo-srchttpi2wpcomnicolaiaroccicomwp-contentuploadshtml5-logopngresize1282c150-althtml5-logo-data-recalc-dims1-il-futuro-del-web-è-silverlight"><!-- raw HTML omitted -->Il futuro del Web è Silverlight?</h2>
<p>Personalmente non ho dubbi sul fatto che il futuro delle piattaforme tecnologiche Microsoft sarà garantito. La domanda cruciale che ogni programmatore dovrebbe porsi è un’altra. Il futuro del web è Silverlight? In soldoni, su cosa vale la pena investire tempo, risorse e denaro? Temo la risposta non sia quella che i programmatori Silverlight vorrebbero sentire.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Cloud Computing è davvero affidabile?</title>
      <link>https://nicolaiarocci.com/il-cloud-computing-e-davvero-affidabile/</link>
      <pubDate>Fri, 03 Jun 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-cloud-computing-e-davvero-affidabile/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;E’ di pochi giorni fa la &lt;!-- raw HTML omitted --&gt;notizia&lt;!-- raw HTML omitted --&gt; che alcuni servizi API gratuiti forniti da Google verranno chiusi. Tra questi spicca &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Translate API&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, la più apprezzata libreria gratuita per la traduzione automatica sul web. Basta una occhiata ai &lt;!-- raw HTML omitted --&gt;commenti &lt;!-- raw HTML omitted --&gt;per rendersi conto dello sconcerto generato dall’annuncio, per altro del tutto inatteso. Molti si dicono disposti a pagare pur di non rinunciare alla API, ma non è  questa l’idea di Google che in alternativa propone &lt;!-- raw HTML omitted --&gt;Google Translate Element&lt;!-- raw HTML omitted --&gt;, widget gratuito che certo non è una soluzione accettabile per applicazioni che attualmente integrano la API in maniera trasparente. Immagino che proprio qui stia il nocciolo della questione: una API non è visibile né apprezzabile dall’esterno, mentre un widget promuove il brand Google.&lt;/p&gt;
&lt;p&gt;Migliaia di aziende, enti pubblici e organizzazioni non governative internazionali che oggi usano la API dovranno trovare soluzioni alternative, probabilmente a pagamento. Almeno gli è stato concesso un po’ di tempo: Google garantisce un periodo di tre anni prima della sospensione del servizio.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Questa notizia induce ancora una volta alcune riflessioni circa l’affidabilità del &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Cloud Computing&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, modello di sviluppo verso il quale, volenti o nolenti, tutti noi siamo diretti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->E’ di pochi giorni fa la <!-- raw HTML omitted -->notizia<!-- raw HTML omitted --> che alcuni servizi API gratuiti forniti da Google verranno chiusi. Tra questi spicca <strong><!-- raw HTML omitted -->Translate API<!-- raw HTML omitted --></strong>, la più apprezzata libreria gratuita per la traduzione automatica sul web. Basta una occhiata ai <!-- raw HTML omitted -->commenti <!-- raw HTML omitted -->per rendersi conto dello sconcerto generato dall’annuncio, per altro del tutto inatteso. Molti si dicono disposti a pagare pur di non rinunciare alla API, ma non è  questa l’idea di Google che in alternativa propone <!-- raw HTML omitted -->Google Translate Element<!-- raw HTML omitted -->, widget gratuito che certo non è una soluzione accettabile per applicazioni che attualmente integrano la API in maniera trasparente. Immagino che proprio qui stia il nocciolo della questione: una API non è visibile né apprezzabile dall’esterno, mentre un widget promuove il brand Google.</p>
<p>Migliaia di aziende, enti pubblici e organizzazioni non governative internazionali che oggi usano la API dovranno trovare soluzioni alternative, probabilmente a pagamento. Almeno gli è stato concesso un po’ di tempo: Google garantisce un periodo di tre anni prima della sospensione del servizio.</p>
<!-- raw HTML omitted -->
<p>Questa notizia induce ancora una volta alcune riflessioni circa l’affidabilità del <strong><!-- raw HTML omitted -->Cloud Computing<!-- raw HTML omitted --></strong>, modello di sviluppo verso il quale, volenti o nolenti, tutti noi siamo diretti.</p>
<p><!-- raw HTML omitted -->Stand-Alone Vs Cloud Computing<!-- raw HTML omitted --></p>
<p>Le vecchie applicazioni stand alone funzionano sempre e comunque. Prima o poi il programmatore originale sparisce dalla circolazione; del codice sorgente (se disponibile) nessuno capisce più nulla, ma l’applicazione continua a girare. E se una delle librerie usate dall’applicazione (le vecchie .dll, per capirci) viene improvvisamente abbandonata dal produttore? Non ci sono problemi, l’installazione gira come prima.</p>
<p>Nel dorato mondo <!-- raw HTML omitted -->PaaS<!-- raw HTML omitted --> le applicazioni smettono di funzionare non appena una singola API remota diventa inaccessibile. Non mi sembra una differenza da poco.</p>
<h2 id="disservizi-e-sorprese">Disservizi e sorprese</h2>
<p>Si potrebbe obiettare che appoggiarsi a una API gratuita per sviluppare un prodotto strategico non è una mossa intelligente e che comunque casi di disservizi come questo sono assai rari. In Aprile alcuni server Amazon AWS (la piattaforma cloud più usata al mondo) <!-- raw HTML omitted -->sono andati in corto circuito<!-- raw HTML omitted --> lasciando improvvisamente a piedi centinaia di fornitori di servizi e diversi milioni di loro utenti. Il disservizio, durato oltre ventiquattro ore, è avvenuto nonostante AWS sia un servizio a pagamento di altissimo livello che garantisce un livello di Service Level Agreement (SLA) superiore al 99%.</p>
<p>Un caso diverso ma dalle stesse conseguenze  si è verificato proprio in casa Google poche settimane fa, quando <!-- raw HTML omitted -->Google App Engine<!-- raw HTML omitted --> è diventato a pagamento (almeno per alcuni livelli di utilizzo prima gratuiti), mettendo di fatto fuori mercato molti piccoli servizi gratuiti che avevano scelto la piattaforma cloud del gigante di Mountain View.</p>
<h2 id="le-contromisure-necessarie">Le contromisure necessarie</h2>
<p>Non per questo penso che il cloud computing vada evitato, ne sono anzi un sostenitore convinto, ma è importante per noi tutti <strong>comprendere a fondo i limiti e i rischi che questo nuovo paradigma porta con sé</strong>.</p>
<p>Un paio di anni fa ho scritto <!-- raw HTML omitted -->un programma di backup remoto<!-- raw HTML omitted --> che si appoggia a <!-- raw HTML omitted -->Simple Storage Service<!-- raw HTML omitted --> (S3), uno dei servizi della piattaforma Amazon AWS. Il programma ha continuato a lavorare impunemente mentre il disastro si abbatteva sui server Amazon della East Coast perché, fin dall’inizio, era progettato per far fronte a evenienze come questa. Usa server multipli ridondanti dislocati su più aree geografiche, in modo che il crash di una singola server farm non lo mandi in tilt. E’ bene aspettarsi il peggio dai servizi cloud per essere pronti a gestire la crisi se (quando) verrà.</p>
<p>Per quanto riguarda il modello di business, è necessario adottarne uno che garantisca margini sufficienti a compensare improvvisi aumenti delle tariffe, anche solo per il periodo necessario alla eventuale dislocazione. La tendenza generale del mercato è comunque rassicurante: in questi anni costi dei servizi cloud sono calati costantemente.</p>
<h2 id="le-responsabilità-stanno-da-entrambe-le-parti">Le responsabilità stanno da entrambe le parti</h2>
<p>E se domani mi si annunciasse che S3 è improvvisamente deprecato? Fortunatamente per me e per le migliaia di altri il servizio non è gratuito e assicura ad Amazon utili stellari, ma non è questo il punto. Il punto è che in ogni momento <em>potrebbe succedere</em>.</p>
<p>I fornitori di servizi cloud hanno una grande responsabilità: garantire la continuità del loro servizio anche e soprattutto nel lungo periodo. Speriamo che ne siano coscienti. Noi programmatori e analisti dobbiamo tenere conto dei rischi che corriamo quando scegliamo di lavorare su piattaforme cloud, progettando i nostri prodotti di conseguenza.</p>
<p><em>Aggiornamento. Venerdì 3 giugno Google ha ritoccato l’annuncio ufficiale. La chiusura è annullata e la Translate API verrà messa a pagamento.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #2: La Fretta</title>
      <link>https://nicolaiarocci.com/dei-vizi-dei-programmatori-2-la-fretta/</link>
      <pubDate>Mon, 30 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-dei-programmatori-2-la-fretta/</guid>
      <description>&lt;h2 id=&#34;8220per-risolvere-il-problema-mi-bastano-un-paio-di-minuti8221&#34;&gt;“Per risolvere il problema mi bastano un paio di minuti”&lt;/h2&gt;
&lt;p&gt;La tentazione della scorciatoia. E’ difficile resisterle, prima o poi ci caschiamo tutti. In alcuni casi isolati vale la pena scegliere la strada più veloce, ma non è certo questa la via maestra. E’ pericolosa e in genere causa più problemi di quelli che risolve. Una scorciatoia può farti risparmiare qualche ora ma i danni causati possono costarti mesi di lavoro.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="8220per-risolvere-il-problema-mi-bastano-un-paio-di-minuti8221">“Per risolvere il problema mi bastano un paio di minuti”</h2>
<p>La tentazione della scorciatoia. E’ difficile resisterle, prima o poi ci caschiamo tutti. In alcuni casi isolati vale la pena scegliere la strada più veloce, ma non è certo questa la via maestra. E’ pericolosa e in genere causa più problemi di quelli che risolve. Una scorciatoia può farti risparmiare qualche ora ma i danni causati possono costarti mesi di lavoro.</p>
<!-- raw HTML omitted -->
<p>La fretta, cattiva consigliera, è addirittura diabolica quando applicata alla pratica che tutti noi programmatori odiamo di più: <strong>la soluzione di bug</strong>. Nella mia carriera ricordo distintamente le circostanze in cui, risolvendo frettolosamente bug, ho generato mostri.</p>
<p>Non fidatevi di voi stessi quando svolgete attività delicate o “risolvete” bug nel vostro codice o in quello degli altri. Assicuratevi che qualcuno verifichi quel che state facendo o, se non è possibile, fate in modo di testare e ritestare (possibilmente con l’aiuto di altri) quel che state combinando. Gli <!-- raw HTML omitted -->unit test<!-- raw HTML omitted --> sono i vostri migliori alleati. Se proprio dovete prendere una scorciatoia fate in modo che il vostro capo la avvalli (copritevi le spalle).</p>
<h3 id="nota-a-margine">Nota a margine</h3>
<p>Se avvertite un leggero formicolio alle punte delle dita mentre digitate codice fermatevi e meditate su quel che state facendo. Il vostro <strong>sesto senso di programmatore</strong> vi sta dicendo che c’è qualcosa che non va. E’ una capacità che si acquisisce col tempo e soprattutto con l’esperienza. Se non vi è ancora capitato fidatevi, prima o poi la svilupperete anche voi: è un potente alleato di ogni programmatore. Non scherzo! 😉</p>]]></content:encoded>
    </item>
    <item>
      <title>Dei vizi del programmatore #1: La Superbia</title>
      <link>https://nicolaiarocci.com/dei-vizi-del-programmatore-1-la-superbia/</link>
      <pubDate>Fri, 27 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/dei-vizi-del-programmatore-1-la-superbia/</guid>
      <description>&lt;h2 id=&#34;il-mio-codice-è-perfetto-quello-degli-altri-è-spazzatura&#34;&gt;Il mio codice è perfetto. Quello degli altri è spazzatura&lt;/h2&gt;
&lt;p&gt;La superbia è un atteggiamento molto frequente tra noi programmatori. Io stesso sono – ahimé – un superbo seriale. Non importa quanto ci impegniamo. Ci saranno sempre colleghi che giudicheranno male il nostro codice, che penseranno di poter far meglio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<h2 id="il-mio-codice-è-perfetto-quello-degli-altri-è-spazzatura">Il mio codice è perfetto. Quello degli altri è spazzatura</h2>
<p>La superbia è un atteggiamento molto frequente tra noi programmatori. Io stesso sono – ahimé – un superbo seriale. Non importa quanto ci impegniamo. Ci saranno sempre colleghi che giudicheranno male il nostro codice, che penseranno di poter far meglio.</p>
<p>Non criminalizzare il codice degli altri. Prima o poi sarà il tuo a  finire sotto esame. La critica oggettiva va bene, i consigli e le osservazioni professionali pure, ma non esprimere giudizi. Sii umile. C’è sempre da imparare dal lavoro dei colleghi.</p>
<blockquote>
<p>L’uom superbo si pone sopra gli altri, e crede che gli si debba ogni cosa; gli altri, per lo contrario, lo mettono nell’ultimo grado, né gli concedono nulla.</p>
<p><em>Confucio</em></p></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Perché le Web Startup non amano .NET Framework?</title>
      <link>https://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/</link>
      <pubDate>Thu, 19 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/perche-le-web-startup-non-amano-net-framework/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sul blog aziendale di Expensify il CEO &lt;strong&gt;David Barrett&lt;/strong&gt; ha &lt;!-- raw HTML omitted --&gt;raccontato&lt;!-- raw HTML omitted --&gt; perché la sua azienda non assume programmatori Microsoft .NET Framework. In poche ore il suo articolo ha fatto il giro del mondo scatenando un gran putiferio. Gli sviluppatori .NET si sono lanciati in una difesa accorata della piattaforma Microsoft mentre molti commentatori e blogger hanno sposato le tesi di Barrett. Gli oltre 500 commenti danno un’idea ben precisa del fervore suscitato dall’articolo. Non intendo dilungarmi sui contenuti, mi interessa piuttosto approfondire una questione sollevata indirettamente dal pezzo di Barrett.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sul blog aziendale di Expensify il CEO <strong>David Barrett</strong> ha <!-- raw HTML omitted -->raccontato<!-- raw HTML omitted --> perché la sua azienda non assume programmatori Microsoft .NET Framework. In poche ore il suo articolo ha fatto il giro del mondo scatenando un gran putiferio. Gli sviluppatori .NET si sono lanciati in una difesa accorata della piattaforma Microsoft mentre molti commentatori e blogger hanno sposato le tesi di Barrett. Gli oltre 500 commenti danno un’idea ben precisa del fervore suscitato dall’articolo. Non intendo dilungarmi sui contenuti, mi interessa piuttosto approfondire una questione sollevata indirettamente dal pezzo di Barrett.</p>
<h2 id="perché-così-poche-startup-scelgono-net-framework">Perché così poche Startup scelgono .NET Framework?</h2>
<p>Guardando all’intero ecosistema delle Startup internet<!-- raw HTML omitted -->,<!-- raw HTML omitted --> è facile riscontrare che ben poche adottano il .NET Framework. Ci sono eccezioni importanti e significative, come per esempio Stack Overflow, ma le tecnologie dominanti sono altre: Ruby on Rails, PHP e Python su tutte. <strong>Ian Muir</strong>, Senior Developer di Piehead, in un suo <!-- raw HTML omitted -->interessante articolo<!-- raw HTML omitted --> tenta di individuare le ragioni che fanno di .NET Framework una scelta poco apprezzata dal vivace e  dinamico mondo delle Startup.</p>
<h3 id="il-costo-della-piattaforma-microsoft">Il costo della piattaforma Microsoft</h3>
<p>Se per le grandi aziende le voci di spesa davvero rilevanti sono stipendi, hardware, infrastrutture, banda e dati, per le nostre Startup il problema è innanzi tutto partire. Ruby on Rails, PHP, Python e i loro fratelli sono soluzioni <!-- raw HTML omitted -->FOSS<!-- raw HTML omitted --> (gratuite e open source) che permettono di lavorare a costo zero mentre l’ambiente .NET è al contrario un closed-source a pagamento.</p>
<!-- raw HTML omitted -->
<p>Muir ricorda che già da qualche anno Microsoft ha lanciato il programma <strong><!-- raw HTML omitted -->BizSpark<!-- raw HTML omitted --></strong> che tra le altre cose elimina gran parte dei costi di adozione del .NET Framework. La differenza di spesa insomma non sarebbe così significativa. Peccato che BizSpark sia pressochè sconosciuto.</p>
<p>Ci sono soluzioni alternative. <!-- raw HTML omitted -->Showcase Lane<!-- raw HTML omitted --> per esempio è sviluppato interamente in ASP.NET MVC, ma gira sotto <!-- raw HTML omitted -->Mono<!-- raw HTML omitted -->. Se vi interessa questo approccio <!-- raw HTML omitted -->qui<!-- raw HTML omitted --> potete leggere tutti i dettagli in proposito.</p>
<h3 id="difficoltà-nella-applicazione-della-metodologia-agile">Difficoltà nella applicazione della Metodologia Agile</h3>
<p>Inutile negarlo, questi sono gli anni della <strong><!-- raw HTML omitted -->metodologia agile<!-- raw HTML omitted --></strong>. I giovani imprenditori rilasciano i loro prodotti il più velocemente possibile, spesso in versioni beta appena funzionanti, che implementano a malapena le funzionalità di base. Ruby, Python, PHP e soci dispongono di strumenti mirati per lo sviluppo e il deploy rapido delle applicazioni, qualcosa che in parte manca al mondo .NET. Nel suo articolo Muir sostiene che in realtà non c’è una gran differenza nei tempi di sviluppo.</p>
<!-- raw HTML omitted -->
<p>Concordo con Muir anche se dimentica un dettaglio importante. Molti startupper sono programmatori alle prime armi, spesso ricchi di idee da lanciare rapidamente, ma poveri di capacità tecniche. E’ in questo scenario che linguaggi e tecnologie come Python e Ruby brillano di luce propria rispetto a un ambiente monolitico e piuttosto sofisticato come il .NET Framework. La <!-- raw HTML omitted -->curva di apprendimento<!-- raw HTML omitted --> vincente è quella dei linguaggi open source.</p>
<h3 id="net-è-roba-da-enterprise-e-comunque-microsoft-va-boicottata">.NET è roba da Enterprise (e comunque Microsoft va boicottata)</h3>
<p>Muir sostiene che le startup non usano .NET per motivi culturali più che tecnologici. Voce di popolo vorrebbe che Microsoft sia apprezzata dalle enterprise mentre PHP e Ruby sarebbero l’ideale per le piccole (e sfigate) startup. Questa percezione diffusa influenzerebbe i giovani imprenditori inducendoli ad adottare una piattaforma senza chiedersi quale sia lo strumento migliore per soddisfare le loro necessità.</p>
<p>Le cose stanno anche peggio di così. Specialmente nel mondo giovanile Microsoft è considerata il colosso pachidermico e monopolistico da boicottare in ogni modo. L’immagine non è il punto di forza di Microsoft.</p>
<h4 id="startup-e-enterprise-mondi-diversi">Startup e Enterprise, mondi diversi</h4>
<p>Gran parte delle startup incoraggiano i loro programmatori a imparare un ampio spettro di tecnologie piuttosto che specializzarsi su argomenti (linguaggi) singoli. Per le startup è la scelta giusta poiché dispongono di pochi programmatori e devono rimanere agili e pronte al cambiamento. Le grandi aziende al contrario hanno una cultura ingegneristica e sono organizzate in grandi team, nei quali ogni soggetto tende a essere molto specializzato. Sono differenze importanti che rendono difficile per un programmatore il passaggio da una realtà all’altra.</p>
<h2 id="ampliare-la-propria-prospettiva">Ampliare la propria prospettiva</h2>
<p>Secondo Muir quelli elencati sopra sono i fattori che più di altri condizionano la scelta della piattaforma da adottare. All’inizio della loro carriera i programmatori scelgono un percorso che in seguito diventa difficile cambiare. Il datore di lavoro dovrebbe impegnarsi in prima persona affinché i programmatori mantengano un attegiamento agnostico rispetto alle piattaforme tecnologiche, e siano sempre pronti ad abbracciare nuovi paradigmi e tecnologie.</p>
<!-- raw HTML omitted -->
<p>Su questo punto Muir ha ragione da vendere. In tanti anni di lavoro ho provato sulla mia pelle quanto reale sia il rischio confinarsi nel proprio piccolo mondo. Impegnati nella soluzione dei problemi quotidiani scordiamo che è utile fermarsi ogni tanto e guardarsi intorno. Aggiornarsi su cosa avviene al di fuori del proprio ramo di <em>expertise,</em> consente di sviluppare una migliore visione d’insieme osservando le cose da una prospettiva più ampia.</p>
<h2 id="le-persone-contano-più-della-piattaforma">Le persone contano più della piattaforma</h2>
<p>Perché dunque le Startup non amano .NET Framework? Come abbiamo visto la risposta è tanto tecnica quanto culturale. Qualunque sia la tecnologia adottata, ciò che conta sono le persone che prendete a bordo. Se volete i migliori programmatori su piazza non selezionate specialisti PHP o .NET Framework. Cercate piuttosto persone con esperienze e conoscenze diverse, curiose, che abbiano voglia di imparare e siano pronte a rimettersi in gioco quando serve. Le persone giuste sono quelle capaci di prendere decisioni importanti senza lasciarsi condizionare (solo) dalle competenze già acquisite.</p>
<p><em>Post Scriptum. E se persone con queste caratteristiche non riuscite a trovarle o peggio, non potete permettervele? Non scendete a compromessi. Piuttosto, fate da soli.</em></p>]]></content:encoded>
    </item>
    <item>
      <title>Il Progetto Mono salvato in extremis dal suo fondatore</title>
      <link>https://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/</link>
      <pubDate>Tue, 17 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-progetto-mono-salvato-in-extremis-dal-suo-fondatore/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sono settimane di passione per il &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;progetto Mono&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, celeberrima versione open source e multi piattaforma del Microsoft .NET Framework. All’inizio del mese Attachmate (proprietaria di Novell, sponsor storico del progetto) ha &lt;!-- raw HTML omitted --&gt;improvvisamente licenziato&lt;!-- raw HTML omitted --&gt; l’intero team di ingegneri al lavoro su Mono.&lt;/p&gt;
&lt;p&gt;L’annuncio ha gettato nel panico la comunità internazionale di sviluppatori Mono. Dal 2004, anno di nascita del progetto, migliaia di grandi e piccole software house hanno adottato la piattaforma per lo sviluppo rapido di soluzioni cross-platform. Purtroppo salvo rare eccezioni è frequente che progetti open source nati o assorbiti in grandi organizzazioni commerciali finiscano per essere abbandonati.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sono settimane di passione per il <strong><!-- raw HTML omitted -->progetto Mono<!-- raw HTML omitted --></strong>, celeberrima versione open source e multi piattaforma del Microsoft .NET Framework. All’inizio del mese Attachmate (proprietaria di Novell, sponsor storico del progetto) ha <!-- raw HTML omitted -->improvvisamente licenziato<!-- raw HTML omitted --> l’intero team di ingegneri al lavoro su Mono.</p>
<p>L’annuncio ha gettato nel panico la comunità internazionale di sviluppatori Mono. Dal 2004, anno di nascita del progetto, migliaia di grandi e piccole software house hanno adottato la piattaforma per lo sviluppo rapido di soluzioni cross-platform. Purtroppo salvo rare eccezioni è frequente che progetti open source nati o assorbiti in grandi organizzazioni commerciali finiscano per essere abbandonati.</p>
<h2 id="xamarin-al-salvataggio-di-mono">Xamarin al salvataggio di Mono</h2>
<p><!-- raw HTML omitted -->Fortunatamente non sembra essere questo il destino di Mono. Miguel de Icaza, il creatore di Mono, ha <!-- raw HTML omitted -->annunciato<!-- raw HTML omitted --> ieri la fondazione di <strong><!-- raw HTML omitted -->Xamarin<!-- raw HTML omitted --></strong>, startup indipendente interamente dedicata a Mono. Sembra di capire che gran parte del team originale stia confluendo nella nuova realtà, che per ovvie ragioni di copyright dovrà per prima cosa lanciare prodotti nuovi destinati a sostituire quelli a marchio Novell. Xamarin è al lavoro sull’allestimento di nuovi componenti .NET per iOS e Android e continuerà a garantire, supportare e sviluppare le piattaforme open source Mono e Moonlight.</p>
<p>La comunità di sviluppatori, incluso chi scrive, aveva accolto con un certo disappunto il lancio delle edizioni per iOS (<!-- raw HTML omitted -->MonoTouch<!-- raw HTML omitted -->) e Android (<!-- raw HTML omitted -->Mono for Android<!-- raw HTML omitted -->) della piattaforma. Si trattava infatti di versioni commerciali, anche piuttosto costose. Resta da vedere se e come Xamarin deciderà di riposizionare l’offerta di questi due importanti componenti. Ora che non c’è più una multinazionale dietro a Mono non mi sorprenderebbe affatto un ritocco verso il basso dei prezzi di listino.</p>]]></content:encoded>
    </item>
    <item>
      <title>Una API ufficiale per Google Page Speed</title>
      <link>https://nicolaiarocci.com/una-api-ufficiale-per-google-page-speed/</link>
      <pubDate>Thu, 12 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/una-api-ufficiale-per-google-page-speed/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Page Speed&lt;/strong&gt;, lo strumento che misura la velocità delle pagine web e offre consigli su come migliorarne le prestazioni, dispone da ieri di una sua &lt;!-- raw HTML omitted --&gt;API ufficiale&lt;!-- raw HTML omitted --&gt;. Annunciata nell’ambito di &lt;!-- raw HTML omitted --&gt;Google I/O&lt;!-- raw HTML omitted --&gt;, la API di Page Speed consente di integrare l’analisi delle prestazioni nelle applicazioni proprie. C’è già un plugin per WordPress che la sfrutta, &lt;!-- raw HTML omitted --&gt;W3 Total Cache&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;
&lt;p&gt;L’uso effettivo di questa API sarà probabilmente circoscritto a una nicchia piuttosto ristretta, penso soprattutto alle agenzie di consulenza e SEO. Il messaggio utile da portare a casa (se ancora ce ne fosse bisogno) è che &lt;strong&gt;per Google le prestazioni dei siti e della rete in generale sono sempre più un fattore determinante&lt;/strong&gt;, il rapidissimo sviluppo di Page Speed (prima le &lt;!-- raw HTML omitted --&gt;estensioni per browser&lt;!-- raw HTML omitted --&gt;, poi il &lt;!-- raw HTML omitted --&gt;servizio online&lt;!-- raw HTML omitted --&gt; e infine la API) ne è la prova più evidente.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Google Page Speed</strong>, lo strumento che misura la velocità delle pagine web e offre consigli su come migliorarne le prestazioni, dispone da ieri di una sua <!-- raw HTML omitted -->API ufficiale<!-- raw HTML omitted -->. Annunciata nell’ambito di <!-- raw HTML omitted -->Google I/O<!-- raw HTML omitted -->, la API di Page Speed consente di integrare l’analisi delle prestazioni nelle applicazioni proprie. C’è già un plugin per WordPress che la sfrutta, <!-- raw HTML omitted -->W3 Total Cache<!-- raw HTML omitted -->.</p>
<p>L’uso effettivo di questa API sarà probabilmente circoscritto a una nicchia piuttosto ristretta, penso soprattutto alle agenzie di consulenza e SEO. Il messaggio utile da portare a casa (se ancora ce ne fosse bisogno) è che <strong>per Google le prestazioni dei siti e della rete in generale sono sempre più un fattore determinante</strong>, il rapidissimo sviluppo di Page Speed (prima le <!-- raw HTML omitted -->estensioni per browser<!-- raw HTML omitted -->, poi il <!-- raw HTML omitted -->servizio online<!-- raw HTML omitted --> e infine la API) ne è la prova più evidente.</p>
<p>In passato ho espresso <!-- raw HTML omitted -->alcune perplessità<!-- raw HTML omitted --> sulla reale applicabilità dei consigli forniti da questi strumenti, tuttavia rimango convinto della loro utilità generale. Proprio in questi giorni sto lavorando alla ottimizzazione del sito del nostro software gestionale e uso Page Speed per valutare i miglioramenti (o peggioramenti!) che riesco a ottenere. Finora ho raggiunto una valutazione di 80/100, partivo da 70 . Stimo di aver guadagnato 4-5 punti grazie ai consigli di Page Speed.</p>
<p>Per maggiori informazioni date una occhiata alla <!-- raw HTML omitted -->Guida per Sviluppatori<!-- raw HTML omitted --> e all’annuncio ufficiale sul <!-- raw HTML omitted -->Google Webmaster Blog<!-- raw HTML omitted -->.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sulla Usabilità delle Password</title>
      <link>https://nicolaiarocci.com/sulla-usabilita-delle-password/</link>
      <pubDate>Wed, 11 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sulla-usabilita-delle-password/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;I consulenti della sicurezza e chi lavora nel mondo IT raccomandano continuamente di usare password complicate e difficili da ricordare. E’ un cattivo consiglio, dato che è perfettamente possibile creare password semplici, facili da ricordare e davvero sicure. In realtà le password semplici sono spesso molto più sicure di quelle complesse.&lt;/p&gt;
&lt;p&gt;Addentriamoci dunque nel mondo delle password e scopriamo come crearne di pratiche e sicure.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->I consulenti della sicurezza e chi lavora nel mondo IT raccomandano continuamente di usare password complicate e difficili da ricordare. E’ un cattivo consiglio, dato che è perfettamente possibile creare password semplici, facili da ricordare e davvero sicure. In realtà le password semplici sono spesso molto più sicure di quelle complesse.</p>
<p>Addentriamoci dunque nel mondo delle password e scopriamo come crearne di pratiche e sicure.</p>
<h2 id="come-scoprire-una-password">Come scoprire una password</h2>
<p>Scoprire una password è davvero semplice. Esistono cinque metodi affidabili per raggiungere l’obiettivo:</p>
<ol>
<li><strong>Domandarla.</strong> E’ incredibile, ma il modo più usato per ottenere la password di qualcuno è domandargliela (spesso in cambio di qualcosa). Le persone dicono spesso la loro password a colleghi, amici e famigliari. In questo caso l’aver adottato password complicate non aiuta di certo.</li>
<li><strong>Indovinarla.</strong> E’ il secondo metodo più usato per accedere a un account. E’ cosa nota che la maggior parte delle persone scelgono password facili da ricordare, e le più semplici sono proprio quelle che in qualche modo hanno a che fare con la persona obiettivo dell’attacco. Password come il vostro cognome, il nome di vostra moglie, il nome del gatto, la data di nascita sono molto frequenti. In questo caso l’unica, ovvia, soluzione è quella di scegliere password che non hanno relazione diretta con la persona.</li>
<li><strong>Attacco a Forza Bruta</strong>. Molto semplice da realizzare. Un hacker tenta l’accesso usando password diverse volta per volta. Se la nostra password è “sun”, lui tenterà di entrare con “aaa, aab, aad … sul, sum, <strong>sun (TROVATA)</strong>“. L’unica cosa che blocca un attacco a forza bruta sono password di maggiore complessità e lunghezza (è proprio a causa di questo tipo di attacco che gli esperti IT le consigliano).</li>
<li><strong>Attacco a Parole Comuni</strong>. Forma semplificata dell’attacco a forza bruta, nel quale l’hacker tenta di accedere ricorrendo a un elenco di parole molto usate. Invece di tentare combinazioni di lettere, l’hacker tenta di accedere con parole intere diverse di volta in volta, come per esempio “sum, summer, summit, sump, <strong>sun (TROVATA)</strong>“.</li>
<li><strong>Attacco a Dizionario</strong>. Stesso principio dell’attacco a parole comuni, solo che questa volta l’hacker usa l’intero dizionario (ci sono circa 500.000 parole nella lingua inglese).</li>
</ol>
<h2 id="quando-la-password-è-sicura">Quando la password è sicura?</h2>
<p>Non puoi proteggerti contro attacchi del tipo “Domandarla” e “Indovinarla”, ma puoi proteggerti bene dalle altre forme di attacco. Un hacker di solito crea uno script automatico o un programma che svolge il lavoro al posto suo. Non ha alcuna intenzione di star seduto al computer tentando manualmente 500.000 parole per scoprire se una di quelle è la tua password.</p>
<p>Ne consegue che l’unità di misura della sicurezza diventa “<strong>quante password può tentare un programma per ogni unità di tempo (per esempio un secondo)?</strong>“. Il numero esatto non è determinabile, ma la maggior parte delle applicazioni non è in grado di gestire più di 100 accessi al secondo.</p>
<p>Ciò significa che per scoprire la password “sun” sono necessari:</p>
<ul>
<li>Forza bruta: <strong>3 minuti</strong></li>
<li>Attacco a Parole Comuni: <strong>3 minuti</strong></li>
<li>Attacco a Dizionario: <strong>1 ora 20 minuti</strong></li>
</ul>
<p><em>Nota: ci sono 17.576 combinazioni di carattere possibili per “sun”. 3 lettere dell’alfabeto minuscolo = 26^3</em></p>
<p>__Quindi “sun” è una password davvero poco sicura, ma quanto tempo deve resistere una password affinché la si possa ritenere davvero sicura?</p>
<ul>
<li>una password che può essere scoperta in <strong>1 minuto</strong> è fin troppo fragile</li>
<li><strong>10 minuti</strong> – ancora troppo fragile</li>
<li><strong>1 ora</strong> – non ancora abbastanza</li>
<li><strong>1 giorno</strong> – cominciamo a ragionare. La probabilità che qualcuno lasci girare un programma per un giorno intero solo per accedere a un singolo account è modesta. Tuttavia non è impossibile.</li>
<li><strong>1 mese</strong> – solo un hacker molto motivato ci proverebbe</li>
<li><strong>1 anno</strong> – passiamo dal rischio reale al rischio teorico. La NASA o la CIA non potrebbero accettare un livello di sicurezza così basso. Il resto di noi, beh – non abbiamo il loro tipo di nemici e la nostra azienda non è certo così allettante.</li>
<li><strong>10 anni</strong> – siamo ormai entrati nel campo della teoria pura</li>
<li><strong>Una vita: 100 anni</strong> – probabilmente questo è un limite accettabile per la maggior parte di noi. Chi si preoccuperebbe per una password che potrebbe resistere fin dopo la sua morte? E’ confortante pensare a una password che è “sicura per tutta la vita”</li>
</ul>
<p>Analizziamo con attenzione il livello “100 anni”. Suona bene e ci fa sentire sicuri. C’è però la possibilità che un hacker sia particolarmente fortunato e trovi la password giusta dopo soli 15 anni di tentativi, invece di 100. Improbabile, ma può succedere.</p>
<p>Alziamo dunque la posta ancora una volta, puntando al massimo. Vogliamo una password che richieda <strong>1.000 anni per essere scoperta</strong>– chiamiamolo livello “<strong>sicuro per sempre</strong>“. Dovrebbe essere abbastanza, no?</p>
<h2 id="creare-password-sicure-e-davvero-utilizzabili">Creare password sicure e davvero utilizzabili</h2>
<p>Ora che abbiamo coperto le basi diamo una occhiata a qualche esempio sul campo, cercando di capire quanto utilizzabile possiamo rendere una password pur mantenendola “sicura per sempre”.</p>
<p><em>Nota: gli esempi sottostanti sono tutti basati su una ipotesi di 100 tentativi di accesso al secondo. Viene riportato l’attacco più efficace per scardinare ogni password – forza bruta, parole comuni o attacco a dizionario.</em></p>
<p>Cominciamo dalla classica password di 6 caratteri</p>
<p>[table id=1 /]</p>
<p>In questo caso la complessità vince chiaramente. Usare una password con caratteri maiuscoli e minuscoli, numeri e simboli è molto sicuro. Usare una semplice parola come password è inutile.</p>
<p>Ciò significa forse che i colleghi dell’IT e i consulenti sulla sicurezza hanno ragione? No. Una password di 6 caratteri non funzionerà comunque. Nessuno è in grado di ricordare una password come “J4fS&lt;2”, il che vuol dire che prima o poi verrà inevitabilmente trascritta su un post-it o altrove.</p>
<p>Se vogliamo password veramente utilizzabili dobbiamo approcciare il problema in modo diverso. Prima di tutto abbiamo bisogno di usare parole che possiamo ricordare, qualcosa di semplice che possiamo scrivere con facilità.</p>
<p>Come queste:</p>
<p>[table id=2 /]</p>
<p>Usare più di una parola per password aumenta significativamente il livello di sicurezza (da 3 minuti a 2 mesi). Tuttavia, usando 3 parole invece di 2 ci ritroviamo con una password estremamente sicura.</p>
<p>Sono necessari:</p>
<ul>
<li>1.163.859 anni per scardinarla con un attacco a forza bruta</li>
<li>2.537 anni con un attacco a parole comuni</li>
<li>39.637.240 anni con un attacco a dizionario</li>
</ul>
<p><strong>E’ 10 volte più sicuro usare “this is fun” come password piuttosto che “J4fS&lt;2”.</strong></p>
<p>Se poi volete stare assurdamente al sicuro, scegliete <strong>parole poco usate</strong> per comporre la vostra password – qualcosa come:</p>
<p>[table id=4 /]</p>
<p>Una password sicura e al tempo stesso davvero utilizzabile non è una password complicata. E’ piuttosto una frase semplice composta da tre o più parole.</p>
<h2 id="non-è-solo-questione-di-password">Non è solo questione di password</h2>
<p>Una cosa è scegliere password sicure e utilizzabili. Un’altra è prevenire gli attacchi degli hacker. Si tratta di un obiettivo semplice da raggiungere. Per impedire che gli script automatici lavorino efficacemente è necessario:</p>
<ol>
<li><strong>Aggiungere una pausa tra i tentativi di accesso.</strong> 5 secondi tra un tentativo e l’altro sono sufficienti. E’ un lasso di tempo abbastanza breve perché non si noti (ci vogliono più di 5 secondi per rendersi conto di aver sbagliato la password e digitarne una nuova). Obbliga l’hacker a un solo tentativo ogni 5 secondi (invece che 100 tentativi al secondo).</li>
<li><strong>Aggiungere una pausa di penalizzazione</strong> se qualcuno inserisce una password sbagliata più di – diciamo – 10 volte. Una penalità di 1 ora è sufficiente. Di nuovo, una azione di questo tipo disturba seriamente qualunque script o programma hacker.</li>
</ol>
<p>Un hacker può scoprire la password “alpine fun” in solo due mesi se è in grado di attaccare il nostro server 100 volte al secondo. Tuttavia con la pausa di 5 secondi tra un tentativo e l’altro la stessa password può resistere all’attacco per 1.889 anni.</p>
<p>[table id=3 /]</p>
<p>Tieni a mente questi concetti la prossima volta che sei al lavoro su applicazioni web o stai discutendo di sicurezza delle password con i tuoi colleghi dell’IT. <strong>Le password possono essere allo stesso tempo sicure e facili da ricordare.</strong></p>
<h3 id="attribuzione">Attribuzione</h3>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Python Tools per Visual Studio ecco la Beta 2</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/</link>
      <pubDate>Tue, 10 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-ecco-la-beta-2/</guid>
      <description>&lt;p&gt;Microsoft ha rilasciato la seconda beta di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python Tools per Visual Studio&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, il suo progetto open source che offre agli sviluppatori la possibilità di scrivere codice Python, CPython e IronPython nell’ambiente IDE di Visual Studio 2010.&lt;/p&gt;
&lt;p&gt;Il progetto è stato presentato al &lt;!-- raw HTML omitted --&gt;PyCon 2011&lt;!-- raw HTML omitted --&gt; dal &lt;!-- raw HTML omitted --&gt;Microsoft Technical Computing Group&lt;!-- raw HTML omitted --&gt; ed è davvero ben fatto. Per tutti gli approfondimenti vi rimando al mio articolo &lt;!-- raw HTML omitted --&gt;Programmare in Python con Visual Studio 2010&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Microsoft ha rilasciato la seconda beta di <strong><!-- raw HTML omitted -->Python Tools per Visual Studio<!-- raw HTML omitted --></strong>, il suo progetto open source che offre agli sviluppatori la possibilità di scrivere codice Python, CPython e IronPython nell’ambiente IDE di Visual Studio 2010.</p>
<p>Il progetto è stato presentato al <!-- raw HTML omitted -->PyCon 2011<!-- raw HTML omitted --> dal <!-- raw HTML omitted -->Microsoft Technical Computing Group<!-- raw HTML omitted --> ed è davvero ben fatto. Per tutti gli approfondimenti vi rimando al mio articolo <!-- raw HTML omitted -->Programmare in Python con Visual Studio 2010<!-- raw HTML omitted -->.</p>
<!-- raw HTML omitted -->
<p>Questa nuova release porta in dote una serie di bug fix che rendono più stabile il progetto e nessuna nuova feature. A questo punto la Release Candidate 1, programmata inizialmente per il mese di maggio, subirà probabilmente un leggero slittamento. Immagino che dovremo aspettare almeno il prossimo mese.</p>]]></content:encoded>
    </item>
    <item>
      <title>Siti fluidi coi CSS Framework: Inuit.css</title>
      <link>https://nicolaiarocci.com/siti-fluidi-coi-css-framework-inuit-css/</link>
      <pubDate>Fri, 06 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/siti-fluidi-coi-css-framework-inuit-css/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Dopo l’articolo introduttivo sui &lt;a href=&#34;http://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/&#34;&gt;siti fluidi e i CSS Framework&lt;/a&gt; è giunta l’ora di dare una occhiata a un framework vero e proprio. Come dicevo prediligo strumenti agili, leggeri, specializzati e possibilmente fatti in casa. Se scelgo un framework quest’ultimo deve essere essenziale, leggero, flessibile. &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Inuit.css&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, ultimo nato nella numerosa e agguerrita famiglia dei Framework CSS, sembra nato apposta per fare di me un uomo felice.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Dopo l’articolo introduttivo sui <a href="http://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/">siti fluidi e i CSS Framework</a> è giunta l’ora di dare una occhiata a un framework vero e proprio. Come dicevo prediligo strumenti agili, leggeri, specializzati e possibilmente fatti in casa. Se scelgo un framework quest’ultimo deve essere essenziale, leggero, flessibile. <strong><!-- raw HTML omitted -->Inuit.css<!-- raw HTML omitted --></strong>, ultimo nato nella numerosa e agguerrita famiglia dei Framework CSS, sembra nato apposta per fare di me un uomo felice.</p>
<h2 id="flessibilità-e-qualità-prima-di-tutto">Flessibilità e qualità prima di tutto</h2>
<p>Inuit.css è pronto all’uso, se siete di corsa e non avete esigenze particolari potete usarlo così com’è. Quando serve è facile adattarlo al nostro progetto, soprattutto grazie all’alta qualità del <!-- raw HTML omitted -->codice sorgente<!-- raw HTML omitted -->, commentato molto bene. E’ proprio la cura che l’autore ha dedicato alla documentazione l’elemento chiave che ci consente di intervenire rapidamente, eliminando le parti superflue o ritoccando il codice ove necessario.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Qui sopra vedete uno <!-- raw HTML omitted -->snippet<!-- raw HTML omitted --> tratto dal foglio di stile originale. Notate come l’autore si sia preoccupato di fornire indicazioni su come organizzare la gerarchia dei font. Ben fatto!</p>
<h2 id="la-potenza-è-nulla-senza-controllo">La potenza è nulla senza controllo</h2>
<p>Difficilmente Inuit.css prende l’iniziativa, preferisce lasciarla al designer. Prendiamo gli elementi base di HTML5 e CSS3. Inuit.css li supporta ma li isola in classi dedicate che useremo all’occorrenza.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La scelta del basso profilo è apprezzabile. Lascia il controllo nelle nostre mani, ma corre il rischio che – soprattutto al primo impatto – il framework sembri meno ricco rispetto ad altre soluzioni. In effetti non è sulla ricchezza che punta Inuit ma su flessibilità, estensibilità e… mobilità.</p>
<h2 id="tablet-smartphone-e-non-solo">Tablet, smartphone e non solo</h2>
<p><!-- raw HTML omitted -->Il supporto per l’attributo <!-- raw HTML omitted -->@media<!-- raw HTML omitted --> consente a Inuit di ridefinire dinamicamente gran parte delle impostazioni in base al dispositivo (tablet, smartphone, stampante) che consuma la pagina. Il Grid System adottato deriva dal capostipite 960 Grid System (vedi in proposito l’<!-- raw HTML omitted -->articolo precedente<!-- raw HTML omitted -->), supporta matrici (grid) a 12 e 16 colonne e implementa un ingegnoso marchingegno che evita l’inserimento della classica <code>class=end</code> nell’ultima colonna.</p>
<p>A differenza della Tiny Fluid Grid vista la volta scrosa, Inuit è un Framework vero e proprio e supporta ben più della sola Grid. Sono presenti impostazioni predefinite e ben fatte per tutti gli elementi più comuni di una pagina HTML: header, paragrafi, liste numerate e non, tabelle, form, citazioni, link, immagini. Non manca una implementazione del <a href="http://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/" title="Eric Meyer Reset">Eric Meyer CSS Reset</a> e il supporto per la modalità debug che rende visibile la grid sullo sfondo. Una occhiata alla <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> e soprattutto al suo sorgente è sufficiente per rendersi conto di quanti sono gli stili che Inuit.css ci mette a disposizione.</p>
<h2 id="div-idattachment_2410-stylewidth-490px-classwp-caption-aligncenter"><!-- raw HTML omitted --></h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="giovani-di-belle-speranze">Giovani di belle speranze</h2>
<p>Inuit è il nuovo arrivato, ha solo una ventina di giorni ed è in revisione continua. E’ giovane come il suo autore, il ventenne Harry Roberts (l’età non tragga in inganno, Harry è la mente che si cela dietro <!-- raw HTML omitted -->CSS Wizardry<!-- raw HTML omitted -->). Come tutti i giovani di belle speranze Inuit guarda al futuro e se ne frega allegramente del passato: supporta Internet Explorer a partire dalla versione 7 <em>(update del 24.5: la release 1.5 introduce un supporto base per le grid in IE6)</em>.</p>
<p>Dovrà sgomitare un bel pò per conquistarsi uno spazio in una nicchia già affollata da una concorrenza agguerrita. Ha tutte le carte in regola per sfondare, prova ne è il fatto che a pochi giorni dal lancio qualche sito <!-- raw HTML omitted -->qui<!-- raw HTML omitted --> e <!-- raw HTML omitted -->là<!-- raw HTML omitted --> ha già cominciato ad adottarlo.</p>
<p>Se scegliete di usare Inuit nei vostri progetti fatemelo sapere. Chissà, potrebbero finire dritti dritti nella Web Gallery del sito ufficiale.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Shopping Italia è finalmente online</title>
      <link>https://nicolaiarocci.com/google-shopping-italia-e-finalmente-online/</link>
      <pubDate>Tue, 03 May 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-shopping-italia-e-finalmente-online/</guid>
      <description>&lt;p&gt;A quanto pare da stamattina &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Google Shopping Italia&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, edizione nazionale del più vasto progetto &lt;strong&gt;Google Merchant Center&lt;/strong&gt;,  è operativo. Per provarlo andate su Google.it, eseguite una normale ricerca e cliccate sulla nuova opzione Shopping (oppure fate una ricerca diretta dalla home page di &lt;!-- raw HTML omitted --&gt;Google Shopping&lt;!-- raw HTML omitted --&gt;)&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Dato per imminente &lt;!-- raw HTML omitted --&gt;a febbraio&lt;!-- raw HTML omitted --&gt;, del nuovo canale e-commerce di Google non si erano più avute notizie, tanto che qualcuno cominciava a domandarsi &lt;!-- raw HTML omitted --&gt;che fine avesse fatto&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>A quanto pare da stamattina <strong><!-- raw HTML omitted -->Google Shopping Italia<!-- raw HTML omitted --></strong>, edizione nazionale del più vasto progetto <strong>Google Merchant Center</strong>,  è operativo. Per provarlo andate su Google.it, eseguite una normale ricerca e cliccate sulla nuova opzione Shopping (oppure fate una ricerca diretta dalla home page di <!-- raw HTML omitted -->Google Shopping<!-- raw HTML omitted -->)</p>
<!-- raw HTML omitted -->
<p>Dato per imminente <!-- raw HTML omitted -->a febbraio<!-- raw HTML omitted -->, del nuovo canale e-commerce di Google non si erano più avute notizie, tanto che qualcuno cominciava a domandarsi <!-- raw HTML omitted -->che fine avesse fatto<!-- raw HTML omitted -->.</p>
<p>Per informazioni approfondite vi rimando <!-- raw HTML omitted -->all’articolo che scrissi a suo tempo<!-- raw HTML omitted -->, qui mi limito a segnalarvi il link per <!-- raw HTML omitted -->creare un account<!-- raw HTML omitted -->, registrare i prodotti e impostare il proprio negozio su Google Shopping.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Costruire siti fluidi coi CSS Framework: Tiny Fluid Grid</title>
      <link>https://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/</link>
      <pubDate>Fri, 29 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/costruire-siti-fluidi-coi-css-framework-tiny-fluid-grid/</guid>
      <description>&lt;p&gt;Fino a non molti anni fa la gamma di risoluzioni video disponibili alla gran parte degli utenti era piuttosto limitata, tanto che nel disegnare siti web non ci si preoccupava granché di questo aspetto. La diffusione di massa di monitor wide, netbooks, tablet e smartphone ha cambiato rapidamente le carte in tavola. Per raggiungere con efficienza il loro pubblico i siti odierni devono essere capaci di adattare il loro aspetto alla risoluzione del dispositivo usato dal visitatore. Devono, in una parola, essere &lt;em&gt;fluidi&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&#34;il-grid-design-e-l8217era-dei-css-framework&#34;&gt;Il Grid Design e l’era dei CSS Framework&lt;/h2&gt;
&lt;p&gt;L’avvento dei CSS Framework si deve (principalmente) alla necessità di soddisfare l’esigenza di fluidità. Il capostipite, se non in ordine cronologico senz’altro per l’influenza che ha avuto, è il &lt;!-- raw HTML omitted --&gt;960 Grid System&lt;!-- raw HTML omitted --&gt;. Altri prodotti famosi, per citarne solo un paio, sono &lt;!-- raw HTML omitted --&gt;Blueprint&lt;!-- raw HTML omitted --&gt; e &lt;!-- raw HTML omitted --&gt;Emastic&lt;!-- raw HTML omitted --&gt;. Questi framework hanno in comune l’obiettivo di velocizzare creazione, gestione e manutenzione dei fogli di stile ma se andiamo al nocciolo della questione ci accorgiamo che tutti si basano sul concetto chiave di &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Grid Design&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Fino a non molti anni fa la gamma di risoluzioni video disponibili alla gran parte degli utenti era piuttosto limitata, tanto che nel disegnare siti web non ci si preoccupava granché di questo aspetto. La diffusione di massa di monitor wide, netbooks, tablet e smartphone ha cambiato rapidamente le carte in tavola. Per raggiungere con efficienza il loro pubblico i siti odierni devono essere capaci di adattare il loro aspetto alla risoluzione del dispositivo usato dal visitatore. Devono, in una parola, essere <em>fluidi</em>.</p>
<h2 id="il-grid-design-e-l8217era-dei-css-framework">Il Grid Design e l’era dei CSS Framework</h2>
<p>L’avvento dei CSS Framework si deve (principalmente) alla necessità di soddisfare l’esigenza di fluidità. Il capostipite, se non in ordine cronologico senz’altro per l’influenza che ha avuto, è il <!-- raw HTML omitted -->960 Grid System<!-- raw HTML omitted -->. Altri prodotti famosi, per citarne solo un paio, sono <!-- raw HTML omitted -->Blueprint<!-- raw HTML omitted --> e <!-- raw HTML omitted -->Emastic<!-- raw HTML omitted -->. Questi framework hanno in comune l’obiettivo di velocizzare creazione, gestione e manutenzione dei fogli di stile ma se andiamo al nocciolo della questione ci accorgiamo che tutti si basano sul concetto chiave di <strong><!-- raw HTML omitted -->Grid Design<!-- raw HTML omitted --></strong>:</p>
<blockquote>
<p>Una griglia tipografica è una struttura bidimensionale composta da una serie di guide verticali e orizzontali intersecanti (matrice) usata per organizzare il contenuto della pagina. La griglia offre una traccia sulla quale il designer può organizzare testo e immagini in maniera ordinata e razionale (<!-- raw HTML omitted -->Wikipedia<!-- raw HTML omitted -->)</p></blockquote>
<p>Niente di nuovo, i tipografi hanno usato questa tecnica per secoli. Il Grid Design in declinazione web è fluido: le colonne (e gli spazi tra le colonne) che compongono la matrice sono capaci di adattarsi alla risoluzione dell schermo.</p>
<p>Gran parte dei CSS Framework non si limitano a implementare versioni più o meno sofisticate del Grid System ma offrono una serie di servizi aggiuntivi nel tentativo di risparmiare al designer i compiti più ripetitivi e tediosi. Non sempre ci riescono. Ogni sito ha esigenze specifiche e ogni designer abitudini consolidate. E’ difficile che una soluzione standard sia l’ideale per ogni esigenza. Spesso preferisco la via di mezzo: strumenti agili che consentono di portare a casa rapidamente il risultato senza aggiungere (molto) più del necessario.</p>
<p>In questa mini-serie di tre articoli prenderò in esame tre diverse soluzioni che implementano il Grid Design e che ci permettono di implementare, con diversi gradi di complessità (e numero di funzionalità), pagine web fluide.</p>
<h2 id="tiny-fluid-grid">Tiny Fluid Grid</h2>
<!-- raw HTML omitted -->
<p>Se non altro amerete questa soluzione a causa del suo design: il sito è oggettivamente splendido. E facile da usare. In effetti <strong><!-- raw HTML omitted -->Tiny Fluid Grid<!-- raw HTML omitted --></strong> non è un CSS Framework vero e proprio ma una semplice soluzione interattiva che vi consente, agendo su tre semplici regolazioni (numero di colonne, spazio tra le colonne e larghezza dell’area client), di configurare online la vostra CSS grid. Il pulsante Preview offre una anteprima (anch’essa interattiva) della grid. L’unica altra opzione disponibile è il Download. Otterrete un archivio compresso che contiene due files: il foglio di stile <em>grid.css</em> e un <em>index.html</em> che contiene un esempio d’uso della grid appena creata:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una occhiata al foglio di stile ci consente di capire la struttura della grid</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Una classe per ogni larghezza di colonna. Poiché larghezza e margini delle colonne sono espressi in percentuale la nostra grid si adatta alla risoluzione dello schermo, con i limiti imposti dagli attributi <code>min-width</code> e <code>max-width</code>. L’implementazione lato HTML è banale (tralascio le parti non rilevanti):</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La nostra grid è contenuta in un div di classe “container”. Le colonne sono a loro volta dei div. Per ottenere più colonne nella stessa riga dobbiamo assicurarci che la somma dei numeri contenuti nel nome di ogni classe (<em>grid_x</em>) sia uguale al numero di colonne di cui è composta la grid. Nel nostro caso la seconda riga è composta da tre div <em>grid_4</em> (4×3=12); la terza riga da due colonne: grid_3 e grid_9 (3+9=12). Semplice no? Naturalmente possiamo ritoccare il foglio di stile come vogliamo, adattandolo alle nostre esigenze.</p>
<p>Nel prossimo articolo della serie affronteremo un CSS Framework vero e proprio, anche questo snello e semplice da usare. Se ancora non l’avete fatto abbonatevi al <!-- raw HTML omitted -->feed RSS<!-- raw HTML omitted --> per non perdere la prossima puntata, oppure iscrivetevi alla mailing list (riquadro in alto a destra). Mi raccomando!</p>]]></content:encoded>
    </item>
    <item>
      <title>Avviare un Download con richiesta di nome file da una pagina ASP.NET</title>
      <link>https://nicolaiarocci.com/avviare-un-download-con-richiesta-di-nome-file-da-una-pagina-asp-net/</link>
      <pubDate>Wed, 27 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/avviare-un-download-con-richiesta-di-nome-file-da-una-pagina-asp-net/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Normalmente quando un visitatore clicca su un link che punta a un file, quest’ultimo viene mostrato nel browser e non viene avviato alcun download. Questo succede perché il browser determina il tipo di contenuto in base alla estensione del file. Quando clicchiamo su un file con estensione jpg il browser sa che si tratta di una immagine e la mostra direttamente. Lo stesso avviene per i file pdf e così via.&lt;/p&gt;
&lt;p&gt;Può capitare che questo comportamento non sia quello desiderato. Oggi &lt;!-- raw HTML omitted --&gt;al lavoro&lt;!-- raw HTML omitted --&gt; ho implementato una funzionalità interessante: il download della versione PDF di una pagina web. Il pdf viene costruito dinamicamente nel momento stesso in cui il visitatore clicca un link. Questo accorgimento libera il webmaster dalla tediosa (e facilmente dimenticabile) necessità di rigenerare il pdf ad ogni minimo ritocco della pagina.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Volevo che cliccando sul link si avviasse automaticamente il download, così da ‘costringere’ l’utente a interagire col PDF in un secondo tempo rispetto all’esperienza di navigazione. Se scarichi un PDF è per stamparlo o consultarlo con calma o magari passarlo a un collega, no?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Normalmente quando un visitatore clicca su un link che punta a un file, quest’ultimo viene mostrato nel browser e non viene avviato alcun download. Questo succede perché il browser determina il tipo di contenuto in base alla estensione del file. Quando clicchiamo su un file con estensione jpg il browser sa che si tratta di una immagine e la mostra direttamente. Lo stesso avviene per i file pdf e così via.</p>
<p>Può capitare che questo comportamento non sia quello desiderato. Oggi <!-- raw HTML omitted -->al lavoro<!-- raw HTML omitted --> ho implementato una funzionalità interessante: il download della versione PDF di una pagina web. Il pdf viene costruito dinamicamente nel momento stesso in cui il visitatore clicca un link. Questo accorgimento libera il webmaster dalla tediosa (e facilmente dimenticabile) necessità di rigenerare il pdf ad ogni minimo ritocco della pagina.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Volevo che cliccando sul link si avviasse automaticamente il download, così da ‘costringere’ l’utente a interagire col PDF in un secondo tempo rispetto all’esperienza di navigazione. Se scarichi un PDF è per stamparlo o consultarlo con calma o magari passarlo a un collega, no?</p>
<p>Costringere l’utente a usare il menu contestuale del browser (<em>Salva link con nome..</em>) non è certo la scelta ideale dal punto di vista dell’esperienza utente, tanto più che in questo caso il link non è statico e invoca codice JavaScript. Per ottenere il risultato desiderato dobbiamo inviare direttamente il file all’utente. [cci_asp theme=”standard”]Response.TransmitFile()[/cci_asp] è il metodo che invia il file dall’applicazione ASP.NET al client, ma prima dobbiamo preoccuparci di aggiungere un paio di header al nostro messaggio di output:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>E’ importante fornire il ContentType corretto altrimenti il browser non sarà sempre in grado di gestire i contenuti del file. Internet Explorer per esempio offre l’opzione di aprire direttamente il file (verrà scaricato nella cache). Nel nostro caso se l’utente sceglie l’apertura diretta IE lancerà Acrobat Reader perché ContentType è <em>application/pdf</em>.</p>
<p>Altro accorgimento è la chiamata al metodo Path.GetFileName() in riga 7. Non sarebbe necessario se non fosse che <em>taluni broswer arcaici e superati</em> (ogni riferimento a IE è naturalmente voluto) non sono in grado di gestire intelligentemente il filename e, quando propongono il nome del file da salvare, riproducono l’intero path del file sul server. Questo comportamento tra l’altro è pericoloso perché espone l’intera struttura  del sito, dalla radice al folder che contiene la pagina, al visitatore.</p>
<p>Se la routine deve essere usata in un modulo e non direttamente in una pagina aspx ricordate di sostituire Response con HttpContect.Current.Response. Buon lavoro!</p>]]></content:encoded>
    </item>
    <item>
      <title>Servire 500 milioni di utenti con Python e Django</title>
      <link>https://nicolaiarocci.com/servire-500-milioni-di-utenti-al-mese-con-python-e-django/</link>
      <pubDate>Wed, 20 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/servire-500-milioni-di-utenti-al-mese-con-python-e-django/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;A &lt;!-- raw HTML omitted --&gt;PyCon 2011&lt;!-- raw HTML omitted --&gt;, la conferenza mondiale sul linguaggio Python che si è conclusa da poco ad Atlanta, gli ingegneri di &lt;!-- raw HTML omitted --&gt;DISQUS&lt;!-- raw HTML omitted --&gt; hanno presentato una interessante relazione sulla loro infrastruttura hardware e software. DISQUS è un servizio di gestione dei commenti adottato da centinaia di migliaia di siti nel mondo. Tra i clienti figurano nomi importanti come CNN, MTV, IGN, Engadget, Mashable e tanti altri. Nel mese di marzo 2011 il network DISQUS ha gestito &lt;strong&gt;500 milioni di visitatori unici&lt;/strong&gt;. Questi volumi sono gestiti da una azienda che vanta &lt;strong&gt;16 addetti, dei quali solo 8 (otto!) ingegneri software&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Come è possibile tutto ciò? Gran parte del merito va attribuito al metodo produttivo adottato da DISQUS: &lt;!-- raw HTML omitted --&gt;metodologia agile&lt;!-- raw HTML omitted --&gt;, hardware in affitto e facilmente scalabile, grande fiducia nella capacità dei propri talenti: ognuno degli otto ingegneri è anche product manager. Secondo DISQUS tutto questo è stato possibile anche e soprattutto grazie a una scelta che si è rivelata determinante: l’adozione del linguaggio &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Python&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt; e del web framework &lt;!-- raw HTML omitted --&gt;Django&lt;!-- raw HTML omitted --&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->A <!-- raw HTML omitted -->PyCon 2011<!-- raw HTML omitted -->, la conferenza mondiale sul linguaggio Python che si è conclusa da poco ad Atlanta, gli ingegneri di <!-- raw HTML omitted -->DISQUS<!-- raw HTML omitted --> hanno presentato una interessante relazione sulla loro infrastruttura hardware e software. DISQUS è un servizio di gestione dei commenti adottato da centinaia di migliaia di siti nel mondo. Tra i clienti figurano nomi importanti come CNN, MTV, IGN, Engadget, Mashable e tanti altri. Nel mese di marzo 2011 il network DISQUS ha gestito <strong>500 milioni di visitatori unici</strong>. Questi volumi sono gestiti da una azienda che vanta <strong>16 addetti, dei quali solo 8 (otto!) ingegneri software</strong>.</p>
<p>Come è possibile tutto ciò? Gran parte del merito va attribuito al metodo produttivo adottato da DISQUS: <!-- raw HTML omitted -->metodologia agile<!-- raw HTML omitted -->, hardware in affitto e facilmente scalabile, grande fiducia nella capacità dei propri talenti: ognuno degli otto ingegneri è anche product manager. Secondo DISQUS tutto questo è stato possibile anche e soprattutto grazie a una scelta che si è rivelata determinante: l’adozione del linguaggio <!-- raw HTML omitted --><!-- raw HTML omitted -->Python<!-- raw HTML omitted --><!-- raw HTML omitted --> e del web framework <!-- raw HTML omitted -->Django<!-- raw HTML omitted -->.</p>
<h2 id="il-video-della-conferenza">Il video della conferenza</h2>
<p>Fortunatamente gran parte dei contenuti di PyCon 2011 sono disponibili al pubblico sotto forma di registrazioni audio-video e di slideshow. In questo filmato possiamo seguire Jason Yan e David Cramer (due dei super-otto, quanto sono giovani!) nel corso della loro conferenza.</p>
<!-- raw HTML omitted -->
<h2 id="le-slides">Le slides</h2>
<p>Se non avete tempo (o voglia) per seguire l’intera lezione potete sempre dare una occhiata a queste slides che spiegano in maniera concisa il processo di sviluppo e deployment e, soprattutto, pregi e difetti del lavoro con Python. Curioso come molti di loro abbiano cominciato da Django prima ancora di imparare Python! E’ un po’ la dimostrazione che prima viene il talento, poi il know-how.</p>
<!-- raw HTML omitted -->
<h2 id="una-questione-di-metodo">Una questione di metodo</h2>
<p>Da molti Python è considerato un linguaggio inadatto a gestire siti con grande traffico o applicazioni molto impegnative sotto il profilo delle prestazioni. L’esperienza DISQUS dimostra platealmente il contrario. In un prossimo articolo mi riprometto di approfondire la questione Python/Prestazioni. Se qualcuno vuol dire la sua in proposito è il benvenuto (sia sotto forma di commento che di <em>guest post</em> eventualmente).</p>]]></content:encoded>
    </item>
    <item>
      <title>Vuoi lavorare in una Startup italiana?</title>
      <link>https://nicolaiarocci.com/vuoi-lavorare-in-una-startup-italiana/</link>
      <pubDate>Sat, 16 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/vuoi-lavorare-in-una-startup-italiana/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Italian Startup Scene&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è un &lt;em&gt;“gruppo di ritrovo degli startupper italiani. Imprenditori, investitori, bloggers, sviluppatori e chiunque abbia un interesse per startups e venture capital”&lt;/em&gt;. Si tratta di una risorsa da non perdere se vi interessate alla scena startup italiana, che esiste ed è viva e vegeta malgrado molti (senza aver mai guardato al di là del proprio steccato) sostengano il contrario o non facciano altro che guardare alla remota Silicon Valley.&lt;/p&gt;
&lt;p&gt;Fondata da alcuni degli startupper più affermati e frequentata da quasi 2.000 utenti, molti dei quali attivamente coinvolti in progetti di startup, ISS è il posto ideale per chiedere &lt;strong&gt;consigli&lt;/strong&gt;, proporre e &lt;strong&gt;discutere idee&lt;/strong&gt;, &lt;strong&gt;cercare collaborazioni&lt;/strong&gt; e chissà, &lt;strong&gt;trovare finanziamenti&lt;/strong&gt; per i vostri progetti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Italian Startup Scene<!-- raw HTML omitted --></strong> è un <em>“gruppo di ritrovo degli startupper italiani. Imprenditori, investitori, bloggers, sviluppatori e chiunque abbia un interesse per startups e venture capital”</em>. Si tratta di una risorsa da non perdere se vi interessate alla scena startup italiana, che esiste ed è viva e vegeta malgrado molti (senza aver mai guardato al di là del proprio steccato) sostengano il contrario o non facciano altro che guardare alla remota Silicon Valley.</p>
<p>Fondata da alcuni degli startupper più affermati e frequentata da quasi 2.000 utenti, molti dei quali attivamente coinvolti in progetti di startup, ISS è il posto ideale per chiedere <strong>consigli</strong>, proporre e <strong>discutere idee</strong>, <strong>cercare collaborazioni</strong> e chissà, <strong>trovare finanziamenti</strong> per i vostri progetti.</p>
<p>Italian Startup Scene è organizzata come <!-- raw HTML omitted -->Gruppo Facebook<!-- raw HTML omitted --> – in effetti si tratta dell’unica risorsa Facebook che frequento assiduamente. La lettura del gruppo è libera ma dovete iscrivervi per partecipare alle discussioni che sono molte, interessanti e pertinenti – astenersi perditempo! In queste settimane stanno nascendo i sotto gruppi regionali che servono ad agevolare conoscenze e scambi di informazioni tra gli utenti che vivono vicini.</p>
<!-- raw HTML omitted -->
<h2 id="lavorare-per-una-startup-italiana">Lavorare per una Startup italiana</h2>
<p>Ma il progetto ISS di cui voglio parlarvi, anche perché è nato un po’ in sordina e credo meriti maggiore attenzione, è <!-- raw HTML omitted -->Jobs for Geeks<!-- raw HTML omitted -->. Si tratta di una bella bacheca interattiva dove le startup italiane propongono impieghi di ogni genere: programmatori, designer, esperti commerciali, managers e testers. A sottolineare lo spirito originale di ISS è presente anche il panel per la ricerca di soci fondatori. Nel momento in cui scrivo il panel <!-- raw HTML omitted -->Programmatori<!-- raw HTML omitted --> conta 9 posizioni disponibili.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Trattandosi quasi sempre di startup che operano nel campo delle tecnologie e della rete è facile trovare disponibilità per ogni tipo di collaborazione: part-time, freelance, remote. Non si tratta di offerte di lavoro canoniche neanche dal punto di vista della retribuzione. In tipico stile startup c’è chi cerca, per esempio, un .NET Developer che partecipi a un progetto senz’altro interessante ma attenzione, <em>“Niente retribuzione, per ora, tanto affetto e tanta simpatia :)”</em></p>
<p>Niente male davvero.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il reddit dei programmatori italiani</title>
      <link>https://nicolaiarocci.com/il-reddit-dei-programmatori-italiani/</link>
      <pubDate>Wed, 13 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-reddit-dei-programmatori-italiani/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Reddit&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt; è un servizio di condivisione, votazione e discussione delle risorse in rete. In tempi recenti è diventato uno dei punti di riferimento della comunità internazionale degli &lt;!-- raw HTML omitted --&gt;alpha-geek&lt;!-- raw HTML omitted --&gt;, sbaragliando una concorrenza agguerrita e ben radicata.&lt;/p&gt;
&lt;p&gt;Reddit ha conquistato un pubblico particolarmente ostico ed esigente grazie alla sua caratteristica più peculiare: essere un &lt;strong&gt;sistema aperto&lt;/strong&gt;. Potremmo definire Reddit una semplice infrastruttura lasciata in gestione agli utenti, i quali ricambiano dedicandosi con dedizione alla cura dei contenuti. Su Reddit chiunque in pochi secondi può creare un’area nuova dedicata a un argomento non ancora trattato. Se il tema è valido i contributi arrivano: segnalazioni di nuove risorse (articoli, tutorial, opinioni), votazioni e discussioni spesso vivaci. Reddit è un po’ Wikipedia, un po’ Facebook e un po’ Twitter.&lt;/p&gt;
&lt;p&gt;La scommessa è quella di una selezione naturale dei contenuti, compiuta dai loro diretti destinatari e non (solo) dagli autori, come succede nel caso degli aggregatori di notizie.&lt;/p&gt;
&lt;h2 id=&#34;reddit-in-italia&#34;&gt;Reddit in Italia&lt;/h2&gt;
&lt;p&gt;In Italia Reddit è ancora poco conosciuto, ma qualcosa sta cambiando.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><strong><!-- raw HTML omitted -->Reddit<!-- raw HTML omitted --></strong> è un servizio di condivisione, votazione e discussione delle risorse in rete. In tempi recenti è diventato uno dei punti di riferimento della comunità internazionale degli <!-- raw HTML omitted -->alpha-geek<!-- raw HTML omitted -->, sbaragliando una concorrenza agguerrita e ben radicata.</p>
<p>Reddit ha conquistato un pubblico particolarmente ostico ed esigente grazie alla sua caratteristica più peculiare: essere un <strong>sistema aperto</strong>. Potremmo definire Reddit una semplice infrastruttura lasciata in gestione agli utenti, i quali ricambiano dedicandosi con dedizione alla cura dei contenuti. Su Reddit chiunque in pochi secondi può creare un’area nuova dedicata a un argomento non ancora trattato. Se il tema è valido i contributi arrivano: segnalazioni di nuove risorse (articoli, tutorial, opinioni), votazioni e discussioni spesso vivaci. Reddit è un po’ Wikipedia, un po’ Facebook e un po’ Twitter.</p>
<p>La scommessa è quella di una selezione naturale dei contenuti, compiuta dai loro diretti destinatari e non (solo) dagli autori, come succede nel caso degli aggregatori di notizie.</p>
<h2 id="reddit-in-italia">Reddit in Italia</h2>
<p>In Italia Reddit è ancora poco conosciuto, ma qualcosa sta cambiando.</p>
<p>Il reddit</p>
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->/r/italy<!-- raw HTML omitted --><!-- raw HTML omitted --> propone solo contenuti italiani e al momento in cui scrivo sta per toccare i 1.000 lettori. Stanno nascendo altri reddit italiani, alcuni <!-- raw HTML omitted -->davvero curiosi<!-- raw HTML omitted --> e uno molto interessante.</p>
<h2 id="il-reddit-dei-programmatori-italiani">Il reddit dei programmatori italiani</h2>
<p>Il mio personale contributo alla diffusione di Reddit nel nostro paese è <strong><!-- raw HTML omitted -->/r/programmazione<!-- raw HTML omitted --></strong>. Platealmente ispirato alla <!-- raw HTML omitted -->controparte inglese<!-- raw HTML omitted -->, <code>Programmazione</code> è nato inizialmente come tentativo di rispondere a una mia esigenza personale: raccogliere in modo organizzato le migliori risorse italiane su programmazione, web design, posizionamento siti web (SEO) e dintorni. Articoli, tutorial, riflessioni, approfondimenti e notizie, purché pertinenti, sono tutti benvenuti. Partecipare è facile e poco impegnativo. Votate i contenuti più (o meno) interessanti e, se volete, segnalate i vostri link preferiti.</p>
<p>Se riusciremo ad attirare un pubblico abbastanza numeroso potremmo contribuire, nel tempo, alla creazione di una risorsa interessante per la comunità italiana.</p>]]></content:encoded>
    </item>
    <item>
      <title>Come scoprire i font di una pagina web?</title>
      <link>https://nicolaiarocci.com/come-scoprire-i-font-di-una-pagina-web/</link>
      <pubDate>Fri, 08 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-scoprire-i-font-di-una-pagina-web/</guid>
      <description>&lt;p&gt;Volete scoprire rapidamente quali sono i font usati su una pagina web? Ho scovato quasi per caso &lt;strong&gt;&lt;a href=&#34;http://chengyinliu.com/whatfont.html&#34;&gt;WhatFont&lt;/a&gt;&lt;/strong&gt;, un &lt;!-- raw HTML omitted --&gt;bookmarklet &lt;!-- raw HTML omitted --&gt;davvero facile da usare. Basta trascinarlo sulla barra degli indirizzi del browser e l’installazione è fatta. Navigate sulle pagine che vi interessano e attivate WhatFont con un click. Da quel momento spostando il puntatore sui vari elementi della pagina ne vedrete il font in sovraimpressione. Comodo e veloce.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Volete scoprire rapidamente quali sono i font usati su una pagina web? Ho scovato quasi per caso <strong><a href="http://chengyinliu.com/whatfont.html">WhatFont</a></strong>, un <!-- raw HTML omitted -->bookmarklet <!-- raw HTML omitted -->davvero facile da usare. Basta trascinarlo sulla barra degli indirizzi del browser e l’installazione è fatta. Navigate sulle pagine che vi interessano e attivate WhatFont con un click. Da quel momento spostando il puntatore sui vari elementi della pagina ne vedrete il font in sovraimpressione. Comodo e veloce.</p>
<!-- raw HTML omitted -->
<p>Se per trovare ispirazione amate curiosare nel lavoro degli altri questo è proprio l’oggettino che fa per voi. Se siete programmatori continuerete a usare Firebug ****o Webkit Inspector ma questo strumento è talmente comodo che potreste decidere di aggiungerlo comunque ai vostri strumenti preferiti.</p>]]></content:encoded>
    </item>
    <item>
      <title>Inserire un marchio nelle immagini via JavaScript</title>
      <link>https://nicolaiarocci.com/il-marchio-nelle-immagini-via-javascript/</link>
      <pubDate>Tue, 05 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-marchio-nelle-immagini-via-javascript/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://www.patrick-wied.at/static/watermarkjs/&#34;&gt;Watermark.js&lt;/a&gt;&lt;/strong&gt; è una libreria JavaScript che aggiunge un &lt;!-- raw HTML omitted --&gt;watermark&lt;!-- raw HTML omitted --&gt; (letteralmente &lt;em&gt;filigrana&lt;/em&gt;, ovvero un logo o un marchio) alle immagini presenti sulle pagine web. Contrassegnare le immagini in modo permanente è utile a proteggerle dalla copia oppure, al contrario, ad approfittare della loro riproduzione per diffondere un marchio (&lt;a href=&#34;http://en.wikipedia.org/wiki/Brand_awareness&#34;&gt;brand awareness&lt;/a&gt;). Usare watermark.js è semplice, vediamo quanto.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;come-usare-watermarkjs&#34;&gt;Come usare watermark.js&lt;/h2&gt;
&lt;p&gt;La libreria innesta il marchio nelle immagini marcate con la classe CSS “watermark”. Se il nome della classe non piace è possibile cambiarlo. Se il nostro watermark è in formato JPG la libreria aggiunge per noi un livello di trasparenza, altrimenti possiamo fornirle i più idonei formati PNG e GIF.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><a href="http://www.patrick-wied.at/static/watermarkjs/">Watermark.js</a></strong> è una libreria JavaScript che aggiunge un <!-- raw HTML omitted -->watermark<!-- raw HTML omitted --> (letteralmente <em>filigrana</em>, ovvero un logo o un marchio) alle immagini presenti sulle pagine web. Contrassegnare le immagini in modo permanente è utile a proteggerle dalla copia oppure, al contrario, ad approfittare della loro riproduzione per diffondere un marchio (<a href="http://en.wikipedia.org/wiki/Brand_awareness">brand awareness</a>). Usare watermark.js è semplice, vediamo quanto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="come-usare-watermarkjs">Come usare watermark.js</h2>
<p>La libreria innesta il marchio nelle immagini marcate con la classe CSS “watermark”. Se il nome della classe non piace è possibile cambiarlo. Se il nostro watermark è in formato JPG la libreria aggiunge per noi un livello di trasparenza, altrimenti possiamo fornirle i più idonei formati PNG e GIF.</p>
<p>Prima di tutto inseriamo il riferimento allo script. E’ consigliabile inserirlo in fondo alla pagina, subito prima della chiusura del tag</p>
<p><code>body</code></p>
<!-- raw HTML omitted -->
<p>Al caricamento della pagina chiamamo il metodo <code>wmark.init</code></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La variabile <code>load</code> agisce come un flag e serve a evitare che il codice venga eseguito ad ogni postback. Infine aggiorniamo i tag HTML delle immagini a cui vogliamo aggiungere il nostro watermark</p>
<!-- raw HTML omitted -->
<p>E questo è tutto.</p>
<p>Sul <!-- raw HTML omitted -->sito ufficiale<!-- raw HTML omitted --> sono disponibili un paio di demo funzionanti. La <!-- raw HTML omitted -->seconda<!-- raw HTML omitted --> mostra un uso senz’altro originale della libreria: l’inserimento di <!-- raw HTML omitted -->Codici QR<!-- raw HTML omitted --> nelle immagini. Trattandosi di un progetto open source è possibile scaricare anche il <!-- raw HTML omitted -->codice sorgente<!-- raw HTML omitted --> di watermark.js.</p>
<h2 id="non-tutto-è-oro-quel-che-luccica">Non tutto è oro quel che luccica</h2>
<p>Essendo implementata lato client, la protezione delle immagini non è certo garantita al cento per cento. Dobbiamo decidere cosa è più importante, l’inviolabilità delle nostre immagini o la comodità di non doverle ritoccare prima di inviarle al server. Altro fattore da non trascurare è il calo di prestazioni. Il codice JavaScript deve caricare il watermark e inserirlo nell’immagine originale. Il tempo di caricamento potrebbe risentirne, soprattutto nel caso di pagine ricche di immagini.</p>
<p>Watermark.js è un progetto interessante e ingegnoso che va usato tenendo ben presente i suoi pregi e tutte le possibili controindicazioni.</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Speed ora è anche Online</title>
      <link>https://nicolaiarocci.com/google-speed-ora-e-anche-online/</link>
      <pubDate>Sat, 02 Apr 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-speed-ora-e-anche-online/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;A una settimana esatta dall’uscita della &lt;a href=&#34;http://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/&#34;&gt;estensione per Chrome di Page Speed&lt;/a&gt; Google stupisce tutti aprendo al pubblico &lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Speed Online&lt;!-- raw HTML omitted --&gt;&lt;/strong&gt;, versione web del suo servizio di analisi delle performance dei siti. La versione &lt;em&gt;live&lt;/em&gt; di Google Speed non si limita a misurare la velocità delle pagine ma offre consigli per migliorarne le prestazioni, come già fatto dalle estensioni Firefox e Chrome.&lt;/p&gt;
&lt;p&gt;In questi giorni ho avuto modo di testare Page Speed per Chrome su un certo numero di siti, sia sviluppati da me che da altri. Mi sono reso conto che non sempre i consigli, pur validi, sono facilmente applicabili. Molte inefficienze non sono sotto il nostro controllo perché i contenuti sono forniti da terze parti – annunci pubblicitari, pulsanti, widgets e così via. La stessa Google ha &lt;a href=&#34;http://adsense.blogspot.com/2011/03/making-web-faster-for-all-adsense-for.html&#34;&gt;ottimizzato le prestazioni di AdSense&lt;/a&gt; solo recentemente, prima non era certo un fulmine di guerra.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->A una settimana esatta dall’uscita della <a href="http://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/">estensione per Chrome di Page Speed</a> Google stupisce tutti aprendo al pubblico <strong><!-- raw HTML omitted -->Speed Online<!-- raw HTML omitted --></strong>, versione web del suo servizio di analisi delle performance dei siti. La versione <em>live</em> di Google Speed non si limita a misurare la velocità delle pagine ma offre consigli per migliorarne le prestazioni, come già fatto dalle estensioni Firefox e Chrome.</p>
<p>In questi giorni ho avuto modo di testare Page Speed per Chrome su un certo numero di siti, sia sviluppati da me che da altri. Mi sono reso conto che non sempre i consigli, pur validi, sono facilmente applicabili. Molte inefficienze non sono sotto il nostro controllo perché i contenuti sono forniti da terze parti – annunci pubblicitari, pulsanti, widgets e così via. La stessa Google ha <a href="http://adsense.blogspot.com/2011/03/making-web-faster-for-all-adsense-for.html">ottimizzato le prestazioni di AdSense</a> solo recentemente, prima non era certo un fulmine di guerra.</p>
<p>Altri suggerimenti sono alla nostra portata ma quando ci mettiamo al lavoro ci rendiamo conto che rischiamo di impiegare un mucchio di tempo per ottenere miglioramenti appena percettibili. Un esempio? Il consiglio di combinare le diverse immagini di una pagina in un singolo sprite CSS. E’ abbastanza veloce raccogliere in un file tutte le immagini ma quando ci mettiamo a cambiare il codice HTML, CSS e JavaScript per caricare le porzioni dello sprite nei posti giusti ecco che il tempo necessario a portare a termine (e testare) il lavoro si dilata inesorabilmente.</p>
<p>Finché si lavora su pagine semplici i consigli di servizi come Page Speed (una menzione d’onore la merita <!-- raw HTML omitted --><!-- raw HTML omitted -->YSlow<!-- raw HTML omitted --><!-- raw HTML omitted -->) sono rapidi da implementare. Quando si tratta di ottimizzare siti complessi le cose si fanno più complicate. Il problema è che non c’è modo di predire con precisione <em>quanto</em> miglioreranno le prestazioni. Riprendendo l’esempio delle immagini, Page Speed fornisce una stima dei Kb che risparmierei creando un unico sprite CSS ma non può dirmi <em>quanto tempo risparmierà l’utente</em> che visitera il sito. Otterrò un miglioramento effettivamente percepibile?</p>
<h2 id="cum-grano-salis">Cum grano salis</h2>
<p>L’esperienza ci aiuterà a scegliere quali ottimizzazioni implementare e quali tralasciare. Se fin dall’inizio avremo fatto bene il nostro lavoro non rimarrà molto da migliorare. Se  al contrario ci ritroveremo con decine di consigli di ottimizzazione beh, vorrà dire che la prossima volta dovremo lavorare meglio. In ogni caso usiamo questi strumenti con saggezza non lasciandoci prendere ciecamente dal “demone ottimizzatore”.</p>]]></content:encoded>
    </item>
    <item>
      <title>Flux: il monitor diventa crepuscolare</title>
      <link>https://nicolaiarocci.com/flux-il-monitor-diventa-crepuscolare/</link>
      <pubDate>Thu, 31 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flux-il-monitor-diventa-crepuscolare/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stereopsis.com/flux/&#34;&gt;Flux&lt;/a&gt;&lt;/strong&gt; è una applicazione gratuita per &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;OSX&lt;/strong&gt; e &lt;strong&gt;Linux&lt;/strong&gt; che regola il colore dello schermo in base all’ora del giorno. Detta così può sembrare una sciocchezza, ma vi assicuro che se lavorate spesso nel cuore della notte questa è un’applicazione alla quale non dovreste rinunciare.&lt;/p&gt;
&lt;p&gt;Avete mai notato che di notte, in una stanza poco illuminata, le persone che lavorano al computer sembrano circondate da un inquietante alone blu? Gli schermi per computer garantiscono una buona visione diurna vincendo la luce solare con colori brillanti e freddi (a dominante blu). Di notte, col buio o poca luce, tutto ciò affatica la vista. Mai capitato di alzarvi presto per scrivere codice o finire un articolo e dopo pochi minuti di lavoro ritrovarvi con gli occhi arrossati e irritati?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted --><a href="http://stereopsis.com/flux/">Flux</a></strong> è una applicazione gratuita per <strong>Windows</strong>, <strong>OSX</strong> e <strong>Linux</strong> che regola il colore dello schermo in base all’ora del giorno. Detta così può sembrare una sciocchezza, ma vi assicuro che se lavorate spesso nel cuore della notte questa è un’applicazione alla quale non dovreste rinunciare.</p>
<p>Avete mai notato che di notte, in una stanza poco illuminata, le persone che lavorano al computer sembrano circondate da un inquietante alone blu? Gli schermi per computer garantiscono una buona visione diurna vincendo la luce solare con colori brillanti e freddi (a dominante blu). Di notte, col buio o poca luce, tutto ciò affatica la vista. Mai capitato di alzarvi presto per scrivere codice o finire un articolo e dopo pochi minuti di lavoro ritrovarvi con gli occhi arrossati e irritati?</p>
<p>Flux usa la vostra posizione geografica e l’orologio del computer per determinare le condizioni di luce in cui vi trovate, adattando di conseguenza i colori dello schermo. La prima esperienza con Flux può essere disarmante. Cala la notte e rimanete (molto) perplessi dall’aggiustamento che avviene. Concedete a cervello e occhi il tempo necessario ad abituarsi, dopo qualche minuto non ci farete più caso. Dopo un’ora provate a disattivare Flux usando l’opzione <em>Disable for an hour</em> e… godetevi la cottura rapida della vostra retina. Un esperimento doloroso che non vorrete più ripetere.</p>
<!-- raw HTML omitted -->
<h2 id="qualche-consiglio">Qualche consiglio</h2>
<p>Flux determina la posizione geografica automaticamente, oppure potete impostarla a mano se (come capita al sottoscritto) il vostro provider vi colloca a 200km di distanza dalla posizione reale. Vi consiglio di impostare  una transizione oraria (<em>slow</em>), che renderà più graduale il passaggio dalle condizioni diurne a quelle notturne. In base ai vostri gusti e alle condizioni di luce in cui operate potete scegliere tra quattro colorazioni notturne: <em>Tungsten</em>, <em>Halogen</em>, <em>Fluorescent</em>, <em>Daylight</em>. Io mi trovo bene con <em>Fluorescent</em> ma vi consiglio di provarle tutte. Abilitate l’opzione per lanciare Flux all’avvio del sistema operativo, così diventerà parte integrante delle vostre abitudini. I vostri occhi vi ringrazieranno.</p>
<h2 id="per-molti-ma-non-per-tutti">Per molti ma non per tutti</h2>
<p>Se vi dedicate alla grafica Flux probabilmente non fa per voi, la resa dei colori non è il suo punto di forza. Flux è perfetta per chi scrive e naviga di notte. Sul <a href="http://stereopsis.com/flux/">sito ufficiale</a> sostengono che l’ottimizzazione notturna dei colori concilia il ritmo sonno-veglia. Non so se sia vero ma so per certo che da quando ho installato Flux, una settimana fa, non riesco più a lavorare di notte se questa utility non è attivata. Se la provate fatemi sapere cosa ne pensate!</p>
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Il Formato Valuta in ASP.NET quando il sito è all’estero</title>
      <link>https://nicolaiarocci.com/il-formato-valuta-in-asp-net-quando-il-sito-e-allestero/</link>
      <pubDate>Mon, 28 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-formato-valuta-in-asp-net-quando-il-sito-e-allestero/</guid>
      <description>&lt;p&gt;Una settimana fa abbiamo lanciato il nuovo sito del &lt;a href=&#34;http://gestionaleamica.com&#34; title=&#34;Gestionale Amica&#34;&gt;Gestionale Amica&lt;/a&gt;, il nostro prodotto di punta. E’ scritto in &lt;strong&gt;ASP.NET&lt;/strong&gt; ed è dotato di un sistema di e-commerce sviluppato su misura. Carrello della spesa, checkout, pagamenti con carta di credito, tracciamento ordini, profilo utenti… un lavoro del quale sono piuttosto orgoglioso. Man mano che il giorno del debutto si avvicinava cresceva l’eccitazione; ero impaziente di vederlo funzionare questo gioiellino. Finalmente il 21 marzo è arrivato e con la primavera è sbocciato il nuovo sito. Come è andata? Bene! A parte un piccolo dettaglio. Il mio gioiellino vendeva in Dollari ($) anziché in Euro (€)&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Una settimana fa abbiamo lanciato il nuovo sito del <a href="http://gestionaleamica.com" title="Gestionale Amica">Gestionale Amica</a>, il nostro prodotto di punta. E’ scritto in <strong>ASP.NET</strong> ed è dotato di un sistema di e-commerce sviluppato su misura. Carrello della spesa, checkout, pagamenti con carta di credito, tracciamento ordini, profilo utenti… un lavoro del quale sono piuttosto orgoglioso. Man mano che il giorno del debutto si avvicinava cresceva l’eccitazione; ero impaziente di vederlo funzionare questo gioiellino. Finalmente il 21 marzo è arrivato e con la primavera è sbocciato il nuovo sito. Come è andata? Bene! A parte un piccolo dettaglio. Il mio gioiellino vendeva in Dollari ($) anziché in Euro (€)</p>
<!-- raw HTML omitted -->
<h2 id="come-è-potuto-succedere">Come è potuto succedere?</h2>
<p>In fatto di localizzazione una pagina ASP.NET non è diversa da una normale applicazione WinForms. In assenza di indicazioni diverse il .NET Framework <strong>rappresenta le valute in base alle impostazioni internazionali del computer che lo ospita</strong>. Durante sviluppo e collaudo non abbiamo avuto problemi perché lavoravamo su server aziendali locali. Tuttavia il server di produzione è americano, ed è così che pubblicando il sito ci siamo regalati un bel cambiamento di valuta, il tutto senza toccare una linea di codice.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Restituisce <strong>€1.567,50</strong> in Italia e <strong>$1,567.50</strong> negli Stati Uniti. Probabilmente a questo punto vi starete dicendo due cose:</p>
<ol>
<li>Ma perché hai pubblicato un sito in italiano, per un pubblico italiano, negli Stati Uniti?</li>
<li>Te lo dovevi aspettare, cosa volevi che succedesse? Qualunque sviluppatore con un minimo di esperienza sa queste cose.</li>
</ol>
<p>A proposito del primo punto ci sarebbe da scrivere un articolo intero (e magari lo farò). Basti sapere per ora che, malgrado le apparenze, ci sono (anche) buone ragioni per pubblicare siti italiani all’estero. Sul secondo punto naturalmente avreste ragione. Il fatto è che, nel grande schema delle cose, sono proprio i piccoli dettagli quelli che possono sfuggire. Per fortuna porre rimedio è stato semplice e indolore. Vediamo.</p>
<h2 id="e8217-tutta-questione-di-culture">E’ tutta questione di Culture</h2>
<p>In ogni pagina ASP.NET è possibile impostare il valore delle proprietà <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.culture(v=VS.85).aspx"><strong>Culture</strong></a> e <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.page.uiculture(v=VS.85).aspx"><strong>UICulture</strong></a>. <!-- raw HTML omitted -->Culture<!-- raw HTML omitted --> determina l’output delle funzioni influenzate dalla cultura: date, numeri, valute, orari. <!-- raw HTML omitted -->UICulture<!-- raw HTML omitted --> istruisce la pagina su quali risorse culturali caricare.</p>
<h3 id="impostare-culture-e-uiculture-per-tutto-il-sito">Impostare Culture e UICulture per tutto il sito</h3>
<p>Intervenendo direttamente nel file Web.Config possiamo dire a ASP.NET quale è la cultura da usare in tutto il sito. In questo modo non dovremo preoccuparci di intervenire su ogni in pagina.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Attenzione alle maiuscole. <!-- raw HTML omitted -->uiCulture<!-- raw HTML omitted --> va bene; <!-- raw HTML omitted -->uiculture<!-- raw HTML omitted --> non va bene. Non sprecate mezz’ora per una sciocchezza del genere, l’ho già fatto io per voi.</p>
<h3 id="impostare-culture-e-uiculture-per-una-pagina">Impostare Culture e UICulture per una pagina</h3>
<p>Per modificare Culture e UICulture di una singola pagina è necessario impostare i corrispondenti attributi della direttiva <a href="http://msdn.microsoft.com/it-it/library/ydy4x04a(v=VS.85).aspx">@ Page</a></p>
<!-- raw HTML omitted -->
<p>Questa tecnica può naturalmente venire usata in abbinamento alla precedente anche se devo dire che non mi viene in mente un motivo, uno scenario valido in cui ciò potrebbe essere utile.</p>
<h3 id="adattare-l8217output-alla-lingua-del-browser">Adattare l’output alla lingua del browser</h3>
<p>Per adattare la cultura al linguaggio del browser che visita la pagina basta impostare <strong>UICulture</strong> e <strong>Culture</strong> su <strong>auto</strong> (non l’ho testato personalmente). E’ anche possibile cambiare la cultura dinamicamente via codice. Se volete sapere come fare consultate la <a href="http://msdn.microsoft.com/en-us/library/syy068tk.aspx">documentazione ufficiale</a>.</p>
<h2 id="dimenticavo8230">Dimenticavo…</h2>
<p>C’è un’altra cosuccia che non ha funzionato perfettamente al momento del debutto. Immaginate la sorpresa del cliente che, ordinando un prodotto da €499 + IVA, si è visto proporre l’addebito su carta di credito per <strong>€1 (uno)</strong> IVA inclusa. Ma questa è un’altra storia…</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Page Speed ora gira anche su Chrome</title>
      <link>https://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/</link>
      <pubDate>Wed, 23 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-page-speed-ora-gira-anche-su-chrome/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://code.google.com/speed/page-speed/&#34;&gt;Page Speed&lt;/a&gt; è un servizio Google per la ottimizzazione delle prestazioni delle pagine web. E’ molto apprezzato dagli sviluppatori di tutto il mondo che finora l’hanno usato su web server Apache oppure sotto forma di estensione per Firefox. Finalmente Google ha &lt;a href=&#34;http://googlewebmastercentral.blogspot.com/2011/03/page-speed-for-chrome-and-in-40.html&#34;&gt;annunciato&lt;/a&gt; l’estensione sperimentale &lt;!-- raw HTML omitted --&gt;Page Speed per Chrome&lt;!-- raw HTML omitted --&gt;, disponibile anche in italiano.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><a href="http://code.google.com/speed/page-speed/">Page Speed</a> è un servizio Google per la ottimizzazione delle prestazioni delle pagine web. E’ molto apprezzato dagli sviluppatori di tutto il mondo che finora l’hanno usato su web server Apache oppure sotto forma di estensione per Firefox. Finalmente Google ha <a href="http://googlewebmastercentral.blogspot.com/2011/03/page-speed-for-chrome-and-in-40.html">annunciato</a> l’estensione sperimentale <!-- raw HTML omitted -->Page Speed per Chrome<!-- raw HTML omitted -->, disponibile anche in italiano.</p>
<h2 id="installazione">Installazione</h2>
<p>Trattandosi di una estensione sperimentale l’installazione è più laboriosa del solito. Nella barra degli indirizzi digitate <code>about:flags</code> e premete invio. Abilitate l’opzione <code>API sperimentali di estensione</code> quindi scorrete fino in fondo alla pagina e cliccate sul pulsante <code>Riavvia adesso</code>. Dopo il riavvio sarà finalmente possibile <a href="https://clients2.google.com/service/update2/crx?response=redirect&amp;x=id%3Dgplegfbjlmmehdoakndmohflojccocli%26uc">scaricare l’estensione</a> e completare l’installazione. Per attivare Page Speed andate sulla pagina web che volete collaudare e aprite gli Strumenti per sviluppatori. Per maggiori informazioni consultate la <a href="http://code.google.com/intl/it-IT/speed/page-speed/docs/using_chrome.html">pagina ufficiale dell’estensione</a>.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="perché-la-velocità-del-tuo-sito-è-importante">Perché la velocità del tuo sito è importante</h2>
<p>I siti veloci migliorano l’esperienza dell’utente e questo piace molto ai motori di ricerca, che già oggi misurano le prestazioni di ogni sito indicizzato. I risultati di queste misurazioni sono uno degli indicatori usati per determinare l’importanza dei siti web e quindi la loro <strong>posizione nei risultati delle SERP</strong>. Il fatto che Google stessa sia impegnata a fornire strumenti avanzati di ottimizzazione e misurazione la dice lunga su quanto questo indicatore sarà sempre più determinante nel prossimo futuro.</p>
<p>Se non siete convinti considerate questo: solo qualche giorno fa anche Yahoo a rilasciato la <a href="https://chrome.google.com/extensions/detail/ninejjcohidippngpapiilnmkgllmakh">versione per Chrome</a> di <a href="http://developer.yahoo.com/yslow/">YSlow</a>, la sua sua estensione per la ottimizzazione delle pagine web. Se due indizi non fanno una prova, poco ci manca.</p>]]></content:encoded>
    </item>
    <item>
      <title>Eclipse Foundation lancia la beta pubblica di OrionHub</title>
      <link>https://nicolaiarocci.com/eclipse-foundation-lancia-la-beta-pubblica-di-orionhub/</link>
      <pubDate>Tue, 22 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eclipse-foundation-lancia-la-beta-pubblica-di-orionhub/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.eclipse.org/&#34;&gt;Eclipse Foundation&lt;/a&gt; ha avviato il beta testing di &lt;a href=&#34;http://www.eclipse.org/orion/&#34;&gt;&lt;strong&gt;OrionHub&lt;/strong&gt;&lt;/a&gt;, una implementazione hosted del suo Progetto Orion. Orion è una piattaforma di sviluppo aperta dedicata allo sviluppo per il web, dentro il web. La IDE Orion gira nel browser e fornisce un completo ambiente di produzione per progetti JavaScript, HTML e CSS. Il risultato è ottenuto grazie a un plugin lato client sviluppato in HTML5.&lt;/p&gt;
&lt;p&gt;Per un approfondimento dai una occhiata a &lt;!-- raw HTML omitted --&gt;Il futuro del codice sorgente è online?&lt;!-- raw HTML omitted --&gt;, la panoramica sul Progetto Orion e sulle IDE Online che ho pubblicato qualche tempo fa.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.eclipse.org/">Eclipse Foundation</a> ha avviato il beta testing di <a href="http://www.eclipse.org/orion/"><strong>OrionHub</strong></a>, una implementazione hosted del suo Progetto Orion. Orion è una piattaforma di sviluppo aperta dedicata allo sviluppo per il web, dentro il web. La IDE Orion gira nel browser e fornisce un completo ambiente di produzione per progetti JavaScript, HTML e CSS. Il risultato è ottenuto grazie a un plugin lato client sviluppato in HTML5.</p>
<p>Per un approfondimento dai una occhiata a <!-- raw HTML omitted -->Il futuro del codice sorgente è online?<!-- raw HTML omitted -->, la panoramica sul Progetto Orion e sulle IDE Online che ho pubblicato qualche tempo fa.</p>
]]></content:encoded>
    </item>
    <item>
      <title>SublimeText 2 – Un sofisticato text editor per codice, HTML e prosa</title>
      <link>https://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/</link>
      <pubDate>Sat, 19 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sublimetext-2-un-sofisticato-text-editor-per-codice-html-e-prosa/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;SublimeText 2&lt;!-- raw HTML omitted --&gt; è il mio nuovo text editor preferito. Veloce, ricco di &lt;a href=&#34;http://www.sublimetext.com/features&#34;&gt;funzioni avanzate&lt;/a&gt; eppure semplice grazie a una interfaccia gradevole e minimalista. Mi ci sono imbattuto per caso quando ormai avevo rinunciato a trovare un valido sostituto a TextMate. Cercavo da tempo una soluzione &lt;strong&gt;multi piattaforma&lt;/strong&gt; che mi consentisse di lavorare nello stesso ambiente sia a casa (OSX) che in ufficio (Windows). SublimeText 2 gira su &lt;strong&gt;Windows&lt;/strong&gt;, &lt;strong&gt;OSX&lt;/strong&gt; e &lt;strong&gt;Linux&lt;/strong&gt; e sta raccogliendo attorno a sé una &lt;a href=&#34;http://www.sublimetext.com/forum/&#34;&gt;comunità molto attiva&lt;/a&gt; di supporters e sviluppatori entusiasti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->SublimeText 2<!-- raw HTML omitted --> è il mio nuovo text editor preferito. Veloce, ricco di <a href="http://www.sublimetext.com/features">funzioni avanzate</a> eppure semplice grazie a una interfaccia gradevole e minimalista. Mi ci sono imbattuto per caso quando ormai avevo rinunciato a trovare un valido sostituto a TextMate. Cercavo da tempo una soluzione <strong>multi piattaforma</strong> che mi consentisse di lavorare nello stesso ambiente sia a casa (OSX) che in ufficio (Windows). SublimeText 2 gira su <strong>Windows</strong>, <strong>OSX</strong> e <strong>Linux</strong> e sta raccogliendo attorno a sé una <a href="http://www.sublimetext.com/forum/">comunità molto attiva</a> di supporters e sviluppatori entusiasti.</p>
<p>Mi ha colpito l’interfaccia, davvero al servizio dei contenuti. La <strong>Minimap</strong> è una trovata originale che offre una vista “da diecimila metri di quota” sul codice. Immaginate di levarvi in volo e osservare il vostro codice dall’alto: apparirà come una ‘lenzuolata’ sulla quale potete cliccare per spostarvi rapidamente da una zona all’altra del vostro documento. Notevole anche il <strong>doppio (o triplo) pannello</strong> che consente di lavorare in linea su più files.</p>
<!-- raw HTML omitted -->
<pre><code>      &lt;p class=&quot;wp-caption-text&quot;&gt;
        Doppio pannello per lavorare su più files contemporaneamente
      &lt;/p&gt;
    &lt;/div&gt;&lt;/td&gt; 
    
    &lt;td&gt;
      &lt;p&gt;
        &lt;div id=&quot;attachment_1639&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
          &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1639 &quot; title=&quot;SublimeText 2- Syntax Highlighting&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?w=210&quot; alt=&quot;SublimeText 2- Syntax Highlighting&quot; srcset=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?w=900 900w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=150%2C93 150w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=300%2C187 300w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-SyntaxHighlighting.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 525px) 100vw, 525px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
          
          &lt;p class=&quot;wp-caption-text&quot;&gt;
            Syntax Highlighting di PHP, HTML e JavaScript nella stessa finestra
          &lt;/p&gt;
        &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
        
        &lt;tr&gt;
          &lt;td&gt;
            &lt;p&gt;
              &lt;div id=&quot;attachment_1642&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
                &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1642 &quot; title=&quot;SublimeText 2 - RegEx&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?w=210&quot; alt=&quot;SublimeText 2 - RegEx&quot; srcset=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?w=900 900w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=150%2C93 150w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=300%2C187 300w, http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-RegEx.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 525px) 100vw, 525px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                
                &lt;p class=&quot;wp-caption-text&quot;&gt;
                  Ricerca e sostituzione con le Regular Expression
                &lt;/p&gt;
              &lt;/div&gt;&lt;/td&gt; 
              
              &lt;td&gt;
                &lt;p&gt;
                  &lt;div id=&quot;attachment_1643&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignnone&quot;&gt;
                    &lt;a href=&quot;images/SublimeText2-MultipleSelections.png&quot; rel=&quot;lightbox[1637]&quot;&gt;&lt;img class=&quot;size-full wp-image-1643   &quot; title=&quot;SublimeText 2 - Selezione Multipla&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?fit=210%2C131&quot; alt=&quot;SublimeText 2 - Selezione Multipla&quot; srcset=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?w=900 900w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=150%2C93 150w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=300%2C187 300w, http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/SublimeText2-MultipleSelections.png?resize=480%2C300 480w&quot; sizes=&quot;(max-width: 210px) 100vw, 210px&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                    
                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                      Selezione multipla e Minimap facilitano notevolmente il lavoro
                    &lt;/p&gt;
                  &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; 
                  
                  &lt;p&gt;
                    Tra le altre caratteristiche degne di nota segnalo la ricerca e sostituzione via &lt;strong&gt;regular expression&lt;/strong&gt;, la selezione multipla, il &lt;strong&gt;completamento automatico&lt;/strong&gt;, gli &lt;strong&gt;snippet già pronti&lt;/strong&gt;, l&amp;#8217;&lt;strong&gt;automazione&lt;/strong&gt; dei processi frequenti, l&amp;#8217;evidenziazione degli elementi del linguaggio (&lt;strong&gt;syntax highlighting&lt;/strong&gt;) per ASP, Python, JavaScript, HTML, Java, C#, C++, JSON e molti altri linguaggi. Ci sono decine di &lt;strong&gt;plugin&lt;/strong&gt; e il prodotto è seguito con &lt;strong&gt;aggiornamenti frequenti&lt;/strong&gt; (che al mio adorato TextMate mancano ormai da troppo da tempo).
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    Unica controindicazione che ho riscontrato finora è la non completa aderenza alle combinazioni di tastiera standard a cui OSX mi ha abituato. Per esempio la combinazione di tasti Command-, (virgola) non richiama le Preferenze come invece succede con qualunque programma Mac-nativo.
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    Se siete alla ricerca di un text editor evoluto non fatevi scappare questa piccola gemma.
                  &lt;/p&gt;
                  
                  &lt;p&gt;
                    &lt;em&gt;PS: ho scritto un seguito a questo articolo: &lt;a title=&quot;Sublime Text 2 un anno dopo&quot; href=&quot;http://nicolaiarocci.com/sublime-text-2-un-anno-dopo/&quot;&gt;Sublime Text 2 un anno dopo&lt;/a&gt;.&lt;/em&gt;
                  &lt;/p&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Programmare in Python con Visual Studio 2010</title>
      <link>https://nicolaiarocci.com/python-tools-per-visual-studio-2010/</link>
      <pubDate>Mon, 14 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-tools-per-visual-studio-2010/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;http://pytools.codeplex.com/&#34;&gt;Python Tools per Visual Studio&lt;/a&gt;&lt;/strong&gt; è un plugin gratuito e open source che consente di programmare in Python usando la IDE Microsoft. Nel corso della lunga gestazione di Visual Studio 2010 si era rumoreggiato di un possibile supporto nativo per il linguaggio Python. Qualcosa di vero doveva esserci visto che il progetto è appena stato presentato al &lt;a href=&#34;http://us.pycon.org/2011/home/&#34;&gt;&lt;strong&gt;PyCon 2011&lt;/strong&gt;&lt;/a&gt;, la più importante conferenza Python al mondo, nientemeno che dal &lt;a href=&#34;http://www.microsoft.com/hpc&#34;&gt;Microsoft Technical Computing Group&lt;/a&gt;.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p><strong><a href="http://pytools.codeplex.com/">Python Tools per Visual Studio</a></strong> è un plugin gratuito e open source che consente di programmare in Python usando la IDE Microsoft. Nel corso della lunga gestazione di Visual Studio 2010 si era rumoreggiato di un possibile supporto nativo per il linguaggio Python. Qualcosa di vero doveva esserci visto che il progetto è appena stato presentato al <a href="http://us.pycon.org/2011/home/"><strong>PyCon 2011</strong></a>, la più importante conferenza Python al mondo, nientemeno che dal <a href="http://www.microsoft.com/hpc">Microsoft Technical Computing Group</a>.</p>
<!-- raw HTML omitted -->
<h2 id="progetti-e-soluzioni">Progetti e Soluzioni</h2>
<p>Python Tools è perfettamente integrato nel sistema a progetti tipico di Visual Studio. I file di progetto Python hanno estensione <code>.pyproj</code> e supportano parecchi tipi di applicazione (Console, WPF, MPI, WinForms, ecc.)</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="editor">Editor</h2>
<p>Python Tools supporta gran parte delle caratteristiche che hanno reso famoso l’editor di Visual Studio: evidenziazione degli elementi del linguaggio (syntax color highlighting), riconoscimento di classi e funzioni, navigazione dei metodi nella barra di navigazione, suggerimenti al passaggio del mouse, ricerca di definizioni e occorrenze, IntelliSense.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="debugger">Debugger</h2>
<p>Il potente debugger di Visual Studio è utilizzabile con Python. Valutazione di espressioni (anche nella finestra interattiva), ispezione delle variabili, impostazione dell’istruzione successiva, uscita ed entrata da cicli di codice e/o funzioni (step in, step out).</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="object-browser">Object Browser</h2>
<p>Python Tools supporta l’uso del Object Browser di Visual Studio 2010. Per ogni modulo è disponibile l’elenco delle classi e, per ogni classe, delle funzioni definite. Il pannello sinistro mostra i moduli e le classi mentre quello destro elenca gli attributi della classe selezionata.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Visto chi l’ha realizzato non stupisce che Python Tools per Visual Studio offra anche funzionalità avanzate quali il Profiling (solo su Visual Studio 2010 Ultimate), <a href="http://pytools.codeplex.com/wikipage?title=Detailed%20Walk-thu%20Guide%20-%20HPC%20and%20Cloud%20Features&amp;referringTitle=Home">cluster computing e cloud computing</a>. Clustering e scaling sono già implementati mentre per il supporto di Windows Azure bisognerà aspettare il prossimo aggiornamento. Già disponibili i <a href="http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net">port per .NET delle librerie NumPy e SciPy</a>.</p>
<p>Python Tools per Visual Studio non è una distruzione completa di Python. E comunque necessario installare <a href="http://www.python.it/">CPython</a> o <a href="http://ironpython.codeplex.com/">IronPython</a>. Questa è una buona notizia perché potrai lavorare sia nel modo tradizionale (magari con colleghi abituati ad altre IDE) sia con Visual Studio.</p>
<h2 id="una-grande-opportunità">Una grande opportunità</h2>
<p>Se vieni dal mondo .NET e sei incuriosito dal linguaggio Python (dovresti esserlo!) questa è la tua occasione. Puoi lavorare con Python senza rinunciare al tuo ambiente preferito e puoi concentrarti sulle caratteristiche del linguaggio risparmiandoti l’apprendimento di una nuova IDE. A dire il vero anche IronPython dispone di un suo plugin per VisualStudio ma ora hai l’opportunità di lavorare con CPython, il Python originale.</p>
<p>Per muovere i primi passi comincia con <!-- raw HTML omitted -->Impara Python in 10 minuti<!-- raw HTML omitted -->, guida rapida per il programmatore proveniente da altri linguaggi.</p>
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startup – Il Meglio della Settimana #4</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-4/</link>
      <pubDate>Sun, 13 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-4/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stevecheney.posterous.com/how-facebook-is-killing-your-authenticity&#34;&gt;Facebook sta uccidendo la tua Autenticità&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Steve Cheney propone una riflessione su come Facebook condizioni ormai _l&amp;amp;#8217;autenticità_ dei suoi utenti. Il timore che conoscenti e amici (alcuni non li incontriamo da anni, altri sono parenti stretti) vedano quel che facciamo online ci induce a comportarci in maniera diversa da quel che sarebbe il nostro istintivo sentire.
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;a href=&#34;http://www.distilled.co.uk/excel-for-seo/&#34;&gt;&lt;strong&gt;Tutorial: Microsoft Excel per il SEO&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;Eccellente tutorial su come usare Excel per analizzare al meglio la quantità di dati che raccogliamo durante le nostre indagini SEO.
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;a href=&#34;http://sixrevisions.com/web-development/decrease-webpage-load-times/&#34;&gt;&lt;strong&gt;10 consigli per velocizzare il caricamento delle pagine Web&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;La pazienza è la virtù dei forti, ma per molti è una pratica difficile da applicare. Ciò è vero soprattutto per chi visita siti web. Six Revision ci propone una decina di consigli per velocizzare le nostre pagine web.
&lt;/code&gt;&lt;/pre&gt;</description>
      <content:encoded><![CDATA[<ol>
<li><strong><!-- raw HTML omitted --><a href="http://stevecheney.posterous.com/how-facebook-is-killing-your-authenticity">Facebook sta uccidendo la tua Autenticità</a></strong></li>
</ol>
<pre><code>Steve Cheney propone una riflessione su come Facebook condizioni ormai _l&amp;#8217;autenticità_ dei suoi utenti. Il timore che conoscenti e amici (alcuni non li incontriamo da anni, altri sono parenti stretti) vedano quel che facciamo online ci induce a comportarci in maniera diversa da quel che sarebbe il nostro istintivo sentire.
</code></pre>
<ol start="2">
<li><a href="http://www.distilled.co.uk/excel-for-seo/"><strong>Tutorial: Microsoft Excel per il SEO</strong></a></li>
</ol>
<pre><code>Eccellente tutorial su come usare Excel per analizzare al meglio la quantità di dati che raccogliamo durante le nostre indagini SEO.
</code></pre>
<ol start="3">
<li><a href="http://sixrevisions.com/web-development/decrease-webpage-load-times/"><strong>10 consigli per velocizzare il caricamento delle pagine Web</strong></a></li>
</ol>
<pre><code>La pazienza è la virtù dei forti, ma per molti è una pratica difficile da applicare. Ciò è vero soprattutto per chi visita siti web. Six Revision ci propone una decina di consigli per velocizzare le nostre pagine web.
</code></pre>
<ol start="4">
<li>
<p><a href="http://www.ibtimes.com/articles/120033/20110308/adobe-flash-html-5-wallaby-ios-iphone-ipad-ipad-2-ios-4-3-chrome-safari-windows-nitro-javascript-dre.htm"><strong>Adobe rilascia un convertitore da Flash a HTML5</strong></a></p>
<p>E con questa Adobe ammette, sia pur implicitamente, la morte di Flash. Se mi segui da un pò la mia opinione <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/">la conosci già</a>. L’altro giorno al BE-Wizard 2011 il grande <strong>Avinash Kaushik</strong> ha dichiarato (ero in platea): “ogni volta che usi Flash su una pagina Web, un dolce cucciolo muore”.</p>
</li>
<li>
<p><a href="http://www.html5rocks.com/tutorials/speed/html5/"><strong>Tutorial: Aumentare le prestazioni delle applicazioni HTML5</strong></a></p>
</li>
</ol>
<pre><code>HTML5 ci offre splendidi strumenti per migliorare l&amp;#8217;aspetto delle applicazioni web. Animazioni ed effetti richiedono attenzione alle prestazioni. Ecco un ottimo e approfondito tutorial su come evitare il rischio di passare dalla padella alla brace.
</code></pre>
<ol start="6">
<li><strong><a href="https://developer.apple.com/xcode/">Apple rilascia Xcode 4</a></strong></li>
</ol>
<pre><code>Xcode 4 è la nuova versione del framework Apple per la creazione di applicazioni Mac, iPhone, and iPad. Include la Xcode IDE, Instruments, il simulatore di iOS e le ultime versioni degli SDK per Mac OS X e iOS**.** 
</code></pre>
<ol start="7">
<li><a href="http://mashable.com/2011/03/10/node-js/"><strong>Ecco perché tutti parlano di Node</strong></a></li>
</ol>
<pre><code>Al ventesimo piano di un grattacielo di San Francisco un gruppo di sviluppatori sta lavorando a una nuova tecnologia che sta cambiando (forse) il modo in cui le applicazioni web in real-time saranno costruite e distribuite. Tutti ne parlano. Ecco perché.
</code></pre>
<ol start="8">
<li><a href="http://www.queness.com/post/7018/11-useful-online-tools-for-web-development"><strong>11 Tools Online per Programmatori</strong></a></li>
</ol>
<pre><code>I tools online sono ideali per sbrigare rapidamente piccoli lavoretti. Questo articolo ne presenta una selezione originale.
</code></pre>
<ol start="9">
<li><a href="http://searchenginewatch.com/3641984"><strong>SEO: Massimizzare il CTR nelle ricerche organiche</strong></a></li>
</ol>
<pre><code>Non perdetevi questo articolo se lavorate in ambito SEO/SERP. _Enough said_.
</code></pre>
<ol start="10">
<li><a href="http://mashable.com/2011/03/12/hello-bar-japan/"><strong>Hai un Blog o un sito web? Aiuta il Giappone con un semplice Banner</strong></a></li>
</ol>
<pre><code>Puoi dare una mano inserendo uno snippet di codice che mostra un banner che invita a partecipare alla raccolta fondi per il Giappone avviata dalla Croce Rossa.
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Impara Python in 10 minuti</title>
      <link>https://nicolaiarocci.com/impara-python-in-10-minuti/</link>
      <pubDate>Thu, 10 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/impara-python-in-10-minuti/</guid>
      <description>&lt;p&gt;E così vorresti imparare il linguaggio di programmazione Python. Probabilmente
sei alla ricerca di un tutorial completo e allo stesso tempo conciso. Questa
guida è un tentativo di insegnarti Python in 10 minuti. In effetti più che con
una guida vera e propria hai a che fare con degli appunti che userai per
partire col piede giusto. Naturalmente se davvero vuoi imparare bene dovrai
anche esercitarti molto. Do per scontato che tu sappia già programmare, questo
mi permetterà di concentrarmi sulle caratteristiche intrinseche del linguaggio.
Troverai le parole chiave &lt;em&gt;evidenziate&lt;/em&gt; così potrai individuarle facilmente.
&lt;em&gt;Fai attenzione&lt;/em&gt; perché per brevità alcune cose verranno introdotte
e commentate direttamente nel codice di esempio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>E così vorresti imparare il linguaggio di programmazione Python. Probabilmente
sei alla ricerca di un tutorial completo e allo stesso tempo conciso. Questa
guida è un tentativo di insegnarti Python in 10 minuti. In effetti più che con
una guida vera e propria hai a che fare con degli appunti che userai per
partire col piede giusto. Naturalmente se davvero vuoi imparare bene dovrai
anche esercitarti molto. Do per scontato che tu sappia già programmare, questo
mi permetterà di concentrarmi sulle caratteristiche intrinseche del linguaggio.
Troverai le parole chiave <em>evidenziate</em> così potrai individuarle facilmente.
<em>Fai attenzione</em> perché per brevità alcune cose verranno introdotte
e commentate direttamente nel codice di esempio.</p>
<h3 id="attribuzione">Attribuzione</h3>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.korokithakis.net/tutorials/python">Learn Python in 10
minutes</a>. Ringrazio l&rsquo;amico Stavros Korokithakis per il permesso
di accordatomi.</p>
<h2 id="caratteristiche">Caratteristiche</h2>
<p>Python è un linguaggio fortemente e <em>dinamicamente tipizzato</em> (i tipi dati
esistono e sono necessari ma non è necessario dichiararli esplicitamente),
<em>case sensitive</em> (var e VAR sono due variabili diverse) e <em>object oriented</em>
(tutto in Python è un oggetto).</p>
<h2 id="come-ottenere-aiuto">Come ottenere aiuto</h2>
<p>L&rsquo;interprete di Python fornisce già un valido sistema di aiuto. Per
sapere come usare un oggetto basta digitare <code>help()</code>. Sono utili anche <code>dir</code>,
che elenca gli attributi (metodi) disponibili per l&rsquo;oggetto,  e
<code>.__doc__</code> che mostra la documentazione completa quando disponibile:</p>
<pre><code>&gt;&gt;&gt; help(5)
Help on int object:
(etc etc)

&gt;&gt;&gt; dir(5)
['__abs__', '__add__', ...]

&gt;&gt;&gt; abs.__doc__
'abs(number) -&gt; number\n\nReturn the absolute value of the
argument.'
</code></pre>
<h2 id="sintassi">Sintassi</h2>
<p>In Python *non ci sono terminatori di riga obbligatori e i <em>blocchi sono
specificati con l&rsquo; indentazione</em>. Indenta per cominciare un blocco e rimuovi
l&rsquo;indentazione per concluderlo, tutto qui. Le istruzioni che richiedono un
blocco indentato terminano con i due punti (<code>:</code>). I <em>commenti</em> cominciano col
cancelletto (<code>#</code>) e sono a linea singola. Stringhe su più righe sono usate per
i <em>commenti multi linea</em>. Le <em>assegnazioni</em> si compiono col simbolo di
uguale (<code>=</code>). Per i <em>test di uguaglianza</em> si usa il doppo uguale (<code>==</code>).
Puoi aumentare e diminuire un valore usando gli operatori <code>+=</code> e <code>-=</code> seguiti
dall&rsquo;addendo. Ciò funziona con molti tipi di dati, stringhe incluse. Puoi
assegnare e usare più variabili sulla stessa riga. Alcuni esempi:</p>
<pre><code>&gt;&gt;&gt; myvar = 3
&gt;&gt;&gt; myvar += 2
&gt;&gt;&gt; myvar
5

&gt;&gt;&gt; myvar -= 1
&gt;&gt;&gt; myvar
4

&quot;&quot;&quot;Questo è un commento su più righe.
Le righe seguenti vengono concatenate.&quot;&quot;&quot;
&gt;&gt;&gt; mystring = &quot;Hello&quot;
&gt;&gt;&gt; mystring += &quot; world.&quot;
&gt;&gt;&gt; print mystring
Hello world.

# Il codice seguente scambia due variabili in una sola riga.
# Non ci sono errori di conversione di tipo perché
# i nuovi valori non vengono assegnati. Vengono creati
# nuovi oggetti ai quali le variabili fanno ora riferimento.
&gt;&gt;&gt; myvar, mystring = mystring, myvar
</code></pre>
<h2 id="tipi-di-dati">Tipi di dati</h2>
<p>Le strutture più significative in Python sono <em>liste, tuple e dizionari</em>. I Set
sono integrati in Python a partire dalla versione 2.5 (per le versioni
precedenti sono disponibili nella libreria <code>sets</code>). Le Liste sono simili ad
array mono dimensionali ma è possibile creare liste che contengono altre liste.
I dizionari sono array che contengono coppie di chiavi e valori (hash table)
e le tuple sono oggetti immutabili mono dimensionali. In Python gli array
possono essere di qualunque tipo, quindi puoi mischiare interi, stringhe, ecc
nelle tue liste/dizionari e tuple. L&rsquo;indice del primo oggetto in qualunque tipo
di array è sempre zero. Gli indici negativi sono ammessi e contano a partire
dalla fine dell&rsquo;array, -1 indica l&rsquo;ultimo elemento dell&rsquo;array. Le variabili
possono fare riferimento a funzioni.</p>
<pre><code>&gt;&gt;&gt; esempio = [1, [&quot;un'altra&quot;, &quot;lista&quot;], (&quot;una&quot;, &quot;tupla&quot;)]
&gt;&gt;&gt; mialista = [&quot;Elemento 1&quot;, 2, 3.14]
&gt;&gt;&gt; mialista[0] = &quot;Ancora elemento 1&quot;
&gt;&gt;&gt; mialista[-1] = 3.15
&gt;&gt;&gt; miodizionario = {&quot;Key 1&quot;: &quot;Valore 1&quot;, 2: 3, &quot;pi&quot;: 3.14}
&gt;&gt;&gt; miodizionario[&quot;pi&quot;] = 3.15
&gt;&gt;&gt; miatupla = (1, 2, 3)
&gt;&gt;&gt; miafunzione = len
&gt;&gt;&gt; print miafunzione(mialista)
3
</code></pre>
<p>Puoi ottenere un <em>range di array</em> usando i due punti (<code>:</code>). Non indicare
l&rsquo;indice iniziale del range sottintende il primo elemento; non indicare
l&rsquo;indice finale sottintende l&rsquo;ultimo elemento. Indici negativi contano
a partire dall&rsquo;ultimo elemento (-1 è l&rsquo;ultimo elemento dell&rsquo;array). Quindi:</p>
<pre><code>&gt;&gt;&gt; mialista = [&quot;Elemento 1&quot;, 2, 3.14]
&gt;&gt;&gt; print mialista[:]
['Elemento 1', 2, 3.1400000000000001]

&gt;&gt;&gt; print mialista[0:2]
['Elemento 1', 2]

&gt;&gt;&gt; print mialista[-3:-1]
['Elemento 1', 2]

&gt;&gt;&gt; print mialista[1:]
[2, 3.14]
</code></pre>
<h2 id="stringhe">Stringhe</h2>
<p>Le stringhe in Python sono indicate *indifferentemente con la virgoletta
singola (<code>'</code>) o doppia (<code>&quot;</code>) ed è consentito usare una notazione all&rsquo;interno
di una stringa delimitata dall&rsquo;altra (<code>&quot;Egli disse 'ciao'.&quot;</code> è valida).
Stringhe su più righe sono racchiuse in triple (o singole) virgolette (<code>&quot;&quot;&quot;</code>).
Python *supporta Unicode, basta ricorrere alla sintassi <code>u&quot;Questa è una stringa unicode&quot;</code>. Per <em>inserire valori in una stringa</em> usa l&rsquo;operatore <code>%</code> (modulo)
e una tupla. Ogni % viene sostituito da un elemento della tupla, da sinistra
a destra, ed è consentito usare un dizionario per le sostituzioni.</p>
<pre><code>&gt;&gt;&gt; &quot;Nome: %s\nNumero: %s\nStringa: %s&quot; % (miaclasse.nome, 3, 3 * &quot;-&quot;)
Nome: Poromenos
Numero: 3
Stringa: ---

strString = &quot;&quot;&quot;Questa è
una stringa
multi riga.&quot;&quot;&quot;

# ATTENZIONE: Nota la s finale in &quot;%(key)s&quot;.
&gt;&gt;&gt; print &quot;Questo %(verbo)s un %(nome)s.&quot; % {&quot;nome&quot;: &quot;test&quot;, &quot;verbo&quot;: &quot;è&quot;}
Questo è un test.
</code></pre>
<h2 id="controllo-di-flusso">Controllo di flusso</h2>
<p>Le istruzioni per il controllo di flusso sono <code>if</code>, <code>for</code>, e <code>while</code>. Non esiste il <code>select</code>; al suo posto si usa <code>if</code>. Il <code>for</code> si usa anche per enumerare i membri di una lista. Per ottenere un elenco di numeri si usa <code>range(numero)</code>.</p>
<pre><code>rangelist = range(10)
&gt;&gt;&gt; print rangelist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for number in rangelist:
    # Verifica se numer è uno dei
    # numeri nella tupla.
    if number in (3, 4, 7, 9):
        # &quot;Break&quot; termina un for senza
        # eseguire la clausola &quot;else&quot;.
        break
    else:
        # &quot;Continue&quot; prosegue con l'iterazione successiva
        # del loop. Piuttosto inutile in questo caso,
        # visto che siamo all'ultima istruzione del loop.
        continue
else:
    # Questo &quot;else&quot; è opzionale ed è
    # eseguito solo se il loop non è stato interrotto
    # con &quot;break&quot;.
    pass # Non fa nulla

if rangelist[1] == 2:
    print &quot;Il secondo elemento (le liste sono 0-based) è 2&quot;
elif rangelist[1] == 3:
    print &quot;Il secondo elemento (le liste sono 0-based) è 3&quot;
else:
    print &quot;Non saprei&quot;

while rangelist[1] == 1:
    pass
</code></pre>
<h2 id="funzioni">Funzioni</h2>
<p>Le funzioni sono dichiarate con la la parola chiave <code>def</code>. Eventuali *argomenti
opzionali vanno dichiarati dopo quelli obbligatori e devono avere un valore
assegnato. Quando si chiamano funzioni passando *argomenti per nome
è necessario passare anche il valore. Le funzioni possono restituire una tuple
(lo spacchettamento delle tuple rende possibile la restituzione di *valori
multipli). Le *lambda sono funzioni in linea. I parametri sono passati <em>per
riferimento</em>, ma i tipi immutabili (tuple, interi, stringhe, ecc.) non possono
essere modificati nella funzione. Questo succede perché <em>viene passata solo la
posizione in memoria</em> dell&rsquo;elemento, e assegnare un altro oggetto alla
variabile <em>comporta la perdita del riferimento</em> all&rsquo;oggetto precedente. Per
esempio:</p>
<pre><code># Equivalente a def f(x): return x + 1
funzionevar = lambda x: x + 1
&gt;&gt;&gt; print funzionevar(1)
2

# un_int e una_stringa sono opzionali, hanno valori di default
# da usare se non vengono passati (2 e &quot;Una stringa&quot;, rispettivamente).
def passing_example(una_lista, un_int=2, una_stringa=&quot;Una stringa&quot;):
    una_lista.append(&quot;Nuovo elemento&quot;)
    un_int = 4
    return una_lista, un_int, una_string

&gt;&gt;&gt; mia_lista = [1, 2, 3]
&gt;&gt;&gt; mio_int = 10
&gt;&gt;&gt; print passing_example(mia_lista, mio_int)
([1, 2, 3, 'Nuovo elemento'], 4, &quot;Una stringa&quot;)

&gt;&gt;&gt; mia_lista
[1, 2, 3, 'Nuovo elemento']

&gt;&gt;&gt; mio_int
10
</code></pre>
<h2 id="classi">Classi</h2>
<p>Python supporta la <em>ereditarietà multipla</em> delle classi. Le variabili
e i metodi privati vengono dichiarati per convezione (non è una regola del
linguaggio) precedendoli con due underscore (_). Possiamo assegnare <em>attributi
(proprietà) arbitrari</em> alle istanze di una classe. Un esempio:</p>
<pre><code>class MiaClasse:
    comune = 10
    def __init__(self):
        self.miavariabile = 3
    def miafunzione(self, arg1, arg2):
        return self.miavariabile

# Creiamo una istanza della classe
&gt;&gt;&gt; istanza = MiaClasse()
&gt;&gt;&gt; istanza.miafunzione(1, 2)
3

# Questa variabile è condivisa da tutte le istanze
&gt;&gt;&gt; istanza2 = MiaClasse()
&gt;&gt;&gt; istanza.comune
10

&gt;&gt;&gt; istanza2.comune
10

# Nota come qui usiamo il nome della classe
# invece dell'istanza.
&gt;&gt;&gt; MiaClasse.common = 30
&gt;&gt;&gt; instanza.common
30

&gt;&gt;&gt; instanza2.common
30

# Questo non aggiornerà la variabile nella classe,
# invece assegnerà un nuovo oggetto alla variabile
# della prima istanza.
&gt;&gt;&gt; istanza.common = 10
&gt;&gt;&gt; istanza.common
10

&gt;&gt;&gt; istanza2.common
30

&gt;&gt;&gt; MiaClasse.common = 50

# Il valore non è cambiato perché &quot;common&quot;
# ora è una variabile dell'istanza.
&gt;&gt;&gt; istanza.common
10

&gt;&gt;&gt; istanza2.common
50

# Questa classe eredita da MiaClasse. L'ereditarietà
# multipla viene dichiarata così:
# class AltraClasse(MiaClasse1, MiaClasse2, MiaClasseN)
class AltraClasse(MiaClasse):
    # L'argomento &quot;self&quot; è passato automaticamente
    # e fa riferimento all'istanza della classe, quindi puoi impostare
    # variabili di istanza come sopra, ma dall'interno della classe.
    def __init__(self, arg1):
        self.miavariabile = 3
        print arg1

&gt;&gt;&gt; istanza = AltraClasse(&quot;hello&quot;)
hello

&gt;&gt;&gt; istanza.miafunzione(1, 2)
3

# Questa classe non ha un membro (proprietà) .test member, ma
# possiamo aggiungerne uno all'istanza quando vogliamo. Nota
# che .test sarà un membro della sola istanza.
&gt;&gt;&gt; istanza.test = 10
&gt;&gt;&gt; istanza.test
10
</code></pre>
<h2 id="eccezioni">Eccezioni</h2>
<p>Le eccezioni in Python sono gestite con dei blocchi <code>try-except [nome_eccezione]</code>:</p>
<pre><code>def una_funzione():
    try:
        # Divisione per zero causa una eccezione
        10 / 0
    except ZeroDivisionError:
        print &quot;Oops, errore.&quot;
    else:
        # Non c'è stata eccezione, possiamo proseguire.
        pass
    finally:
        # Questo codice viene eseguito quando il blocco
        # try..except è già eseguito e tutte le eccezioni
        # sono state gestite, anche se si verifica una nuova
        # eccezione direttamente nel blocco.
        print &quot;Abbiamo finito.&quot;

&gt;&gt;&gt; una_funzione()
Oops, errore.
Abbiamo finito.
</code></pre>
<h2 id="importare-librerie">Importare librerie</h2>
<p>Le librerie esterne si importano con <code>import [nomelibreria]</code>. Puoi anche usare la forma <code>[nomelibreria] import [nomefunzione]</code> per importare singole funzioni. Ecco un esempio:</p>
<pre><code>import random
from time import clock

randomint = random.randint(1, 100)

&gt;&gt;&gt; print randomint
64
</code></pre>
<h2 id="input-e-output">Input e Output</h2>
<p>Python vanta una vasta gamma di librerie per gestire input/output di files. In
questo esempio vediamo come <em>serializzare</em> (convertire strutture dati in
stringhe) usando la libreria <code>pickle</code>:</p>
<pre><code>import pickle
mialista = [&quot;Questo&quot;, &quot;è&quot;, 4, 13327]

# Apre il file C:\binary.dat in scrittura. La lettera r
# prima del nome file serve a evitare l'escaping
# del backslash.
miofile = file(r&quot;C:\binary.dat&quot;, &quot;w&quot;)

pickle.dump(mialista, miofile)
miofile.close()

miofile = file(r&quot;C:\text.txt&quot;, &quot;w&quot;)
miofile.write(&quot;Questa è una stringa di prova&quot;)
miofile.close()

miofile = file(r&quot;C:\text.txt&quot;)

&gt;&gt;&gt; print miofile.read()
'Questa è una stringa di prova'

miofile.close()

# Apre il file in lettura.
miofile = file(r&quot;C:\binary.dat&quot;)
listadafile = pickle.load(miofile)
miofile.close()

&gt;&gt;&gt; print listadafile
['Questo', 'è', 4, 13327]
</code></pre>
<h2 id="varie-ed-eventuali">Varie ed eventuali</h2>
<p>I *test possono essere concatenati. <code>1 &gt; a &lt; 3</code> verifica che a sia minore di  3
e maggiore di 1. Puoi usare <code>del</code> per <em>cancellare variabili o elementi di
array</em>. Le <em>comprensioni di lista</em> sono uno strumento potente per creare
e manipolare le liste. Consistono in una espressione seguita da una clausola
<code>for</code> seguita da zero o più clausole <code>if</code>. Quindi:</p>
<pre><code>&gt;&gt;&gt; lst1 = [1, 2, 3]
&gt;&gt;&gt; lst2 = [3, 4, 5]
&gt;&gt;&gt; print [x * y for x in lst1 for y in lst2]
[3, 4, 5, 6, 8, 10, 9, 12, 15]
&gt;&gt;&gt; print [x for x in lst1 if 4 &gt; x &gt; 1]
[2, 3]

# Verifica se almeno un elemento ha una determinata
# caratteristica.
# &quot;any&quot; restituisce true se qualunque elemento nella
# lista è vero.
&gt;&gt;&gt; any([i % 3 for i in [3, 3, 4, 4, 3]])
True
# Funziona perché 4 % 3 = 1, e 1 in Python è true,
# quindi any() restituisce True.

# Verifica quanto elemento hanno una determinata
# caratteristica.
&gt;&gt;&gt; sum(1 for i in [3, 3, 4, 4, 3] if i == 4)
2

&gt;&gt;&gt; del lst1[0]
&gt;&gt;&gt; print lst1
[2, 3]

&gt;&gt;&gt; del lst1
</code></pre>
<p>Le <em>variabili globali</em> vengono dichiarate all&rsquo;esterno delle funzioni
senza dichiarazioni particolari, ma se desideri modificarle in una funzione
devi dichiararle con la parola <code>global</code> all&rsquo;inizio della funzione,
altrimenti Python assegnerà quell&rsquo;oggetto a una nuova variabile locale
(presta attenzione, si tratta di un piccolo dettaglio che può metterti
facilmente nei guai). Per esempio: numero = 5</p>
<pre><code>def miafunz():
    # Questo stamperà 5.
    print numero

def altrafunz():
    # Questo solleva una eccezione perché la variabile
    # non è stata ancora assegnata. Python crea un
    # nuovo oggetto locale invece di accedere al globale
    print numero
    numero = 3

def ancorafunz():
    global numero
    # Questo cambierà il valore alla variabile globale
    numero = 3
</code></pre>
<h2 id="epilogo">Epilogo</h2>
<p>Questa non intende essere una guida completa (e nemmeno parziale) a Python.
Python ha una vasta gamma di librerie e molte, moltissime funzionalità che
dovrai scoprire con altri mezzi, come <a href="http://it.diveintopython.net/">Dive Into Python</a> (tradotto in
italiano) o l&rsquo;eccellente <a href="http://www.amazon.it/gp/product/0596158068/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=0596158068&amp;linkCode=as2&amp;tag=nicoiaro-21">Learning Python di Mark Lutz</a>, libro che consiglio
a chiunque voglia davvero imparare e capire Python.</p>
<p>Mi auguro di averti aiutato nella transizione verso Python. Lasciami un
commento se pensi che ci sia qualcosa da migliorare o se c&rsquo;é qualcos&rsquo;altro
che vorresti approfondire.</p>
<p>Sono <a href="http://twitter.com/nicolaiarocci">@nicolaiarocci</a> su Twitter.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cancellare tutte le Tabelle da un Database SQL Server</title>
      <link>https://nicolaiarocci.com/cancellare-tutte-le-tabelle-da-un-database-sql-server/</link>
      <pubDate>Wed, 09 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/cancellare-tutte-le-tabelle-da-un-database-sql-server/</guid>
      <description>&lt;p&gt;In rari casi può capitare la necessità di cancellare tutto, ma proprio tutto, da un database SQL Server. &lt;strong&gt;Tabelle&lt;/strong&gt;, &lt;strong&gt;Stored Procedure&lt;/strong&gt;, &lt;strong&gt;Funzioni&lt;/strong&gt;, &lt;strong&gt;Viste&lt;/strong&gt;, &lt;strong&gt;Relazioni&lt;/strong&gt; e &lt;strong&gt;Chiavi Primarie&lt;/strong&gt;. A questo punto tanto varrebbe cancellare il database e ricrearlo, direte voi. Vero, ma non sempre si dispone delle autorizzazioni per farlo. Nel mio caso si tratta di un database ospitato su un server remoto e condiviso. Posso creare e cancellare quel che voglio all’interno del database, ma non posso rinominare o cancellare il db stesso.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In rari casi può capitare la necessità di cancellare tutto, ma proprio tutto, da un database SQL Server. <strong>Tabelle</strong>, <strong>Stored Procedure</strong>, <strong>Funzioni</strong>, <strong>Viste</strong>, <strong>Relazioni</strong> e <strong>Chiavi Primarie</strong>. A questo punto tanto varrebbe cancellare il database e ricrearlo, direte voi. Vero, ma non sempre si dispone delle autorizzazioni per farlo. Nel mio caso si tratta di un database ospitato su un server remoto e condiviso. Posso creare e cancellare quel che voglio all’interno del database, ma non posso rinominare o cancellare il db stesso.</p>
<p>Ecco una <a href="http://stackoverflow.com/questions/536350/sql-server-2005-drop-all-the-tables-stored-procedures-triggers-constriants-an">comoda routine</a> che fa al caso nostro. Dopo averla eseguita vi troverete il database completamente vuoto, come se fosse stato appena creato.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Anche questa routine (come <a href="http://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/">quella vista ieri che cancella le sole Stored Procedure</a>) accede alla tabella di sistema <code>sys.objects</code> per reperire lo schema del database. Cambia però la tecnica di accesso alle informazioni. Invece di usare un cursore qui selezioniamo il primo record utile per poi inoltrarci in un ciclo di cancellazioni ripetute. Il ciclo termina quando non ci sono più record che soddisfano i parametri di ricerca. Per evitare problemi coi vincoli relazionali è importante cancellare prima le relazioni e solo dopo le tabelle.</p>
<h2 id="nota-bene">Nota Bene</h2>
<p>Probabilmente c’è una ottima ragione per cui non disponete dei diritti di cancellazione del database. Prima di lanciare questo codice chiedetevi almeno dieci volte se 1) state sul database giusto, 2) siete coscienti delle conseguenze di quel che state per fare e 3) disponete di un backup dei dati. In ogni caso se perdete dati preziosi <strong>non venite a lamentarvi dal sottoscritto! 😉</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Come rimuovere tutte le Stored Procedure da un database SQL Server?</title>
      <link>https://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/</link>
      <pubDate>Tue, 08 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-rimuovere-tutte-le-stored-procedure-da-un-database-sql/</guid>
      <description>&lt;p&gt;In questi giorni sto lavorando sui database &lt;strong&gt;SQL Server&lt;/strong&gt; che fanno da back-end ai nostri web services e ne approfitto per fare un po’ manutenzione straordinaria. __Stamattina mi è capitato di dover cancellare tutte le &lt;strong&gt;Stored Procedure&lt;/strong&gt; di un database e ho &lt;a href=&#34;http://www.devasp.net/net/articles/display/309.html&#34;&gt;scovato&lt;/a&gt; questa routine che mi ha fatto risparmiare un mucchio di tempo&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In questi giorni sto lavorando sui database <strong>SQL Server</strong> che fanno da back-end ai nostri web services e ne approfitto per fare un po’ manutenzione straordinaria. __Stamattina mi è capitato di dover cancellare tutte le <strong>Stored Procedure</strong> di un database e ho <a href="http://www.devasp.net/net/articles/display/309.html">scovato</a> questa routine che mi ha fatto risparmiare un mucchio di tempo</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La tecnica è quella di sfruttare la tabella di sistema <em>sys.objects</em> che elenca tutti gli oggetti contenuti nel database. Le Stored Procedure hanno tutte type = ‘P’ per cui è facile individuarle. A questo punto ci sono due possibilità: memorizzarne i nomi in una tabella temporanea per poi lanciare un loop che le cancelli una per una, oppure usare un cursore ed eseguire le cancellazioni con la funzione EXEC. La nostra routine usa il secondo approccio, senz’altro più performante.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startup – Il Meglio della Settimana #3</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-3/</link>
      <pubDate>Sun, 06 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startup-il-meglio-della-settimana-3/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.</p>
<ol>
<li>
<p><strong><a href="http://cdixon.org/2011/03/05/seo-is-no-longer-a-viable-marketing-strategy-for-startups/">SEO non è più una strategia valida per le Startup</a></strong></p>
<p>Opinione fuori dal coro quella di Chris Dixon, CEO di Hunch e investitore seriale (Skype, Foursquare, Stack Overflow e altri). Chris sostiene che le Startup dovrebbero smetterla di puntare su SEO. Alla base del successo di molte Startup dell’ultimo decennio, l’industria SEO è cresciuta talmente che il mercato ne é saturo. Al punto che Google ormai fatica a distinguere i contenuti di qualità da quelli <em>SEO-optimized</em>. Nei commenti una discussione vivace alle quale partecipano investitori famosi e SEO guru internazionali.</p>
</li>
<li>
<p><strong><a href="http://www.marioconcina.it/blog/mobile-development/analisi-sullo-sviluppo-di-applicazioni-per-smartphone.html">Analisi sullo sviluppo di applicazioni per Smartphone</a></strong></p>
</li>
</ol>
<pre><code>Secondo molti lo sviluppo di applicazioni mobile è il futuro. Ma quale è la piattaforma sulla quale puntare investendo tempo e denaro? Mario Concina ci offre una bella panoramica su linguaggi, costi e pro e contro di ognuna delle piattaforme tecnologiche più importanti (iPhone, Android, Windows Mobile, Symbian, BlackBerry)
</code></pre>
<ol start="3">
<li>**[<!-- raw HTML omitted -->Settimana ricca di avvenimenti anche questa. SEO, Startup e applicazioni per Smartphone in primo piano ma non mancano altre chicche per buongustai. Al decimo posto una curiosità non ha nulla da spartire con gli argomenti trattati di solito, ma quelle foto dovevo segnalarvele. Ringrazio chi mi ha contattato via mail, Facebook e Twitter. A quanto pare la rubrica piace e farò il possibile per portarla avanti migliorando la qualità delle selezioni, come sempre assolutamente arbitrarie.</li>
</ol>
<ol>
<li><strong><a href="http://cdixon.org/2011/03/05/seo-is-no-longer-a-viable-marketing-strategy-for-startups/">SEO non è più una strategia valida per le Startup</a></strong></li>
</ol>
<pre><code>Opinione fuori dal coro quella di Chris Dixon, CEO di Hunch e investitore seriale (Skype, Foursquare, Stack Overflow e altri). Chris sostiene che le Startup dovrebbero smetterla di puntare su SEO. Alla base del successo di molte Startup dell&amp;#8217;ultimo decennio, l&amp;#8217;industria SEO è cresciuta talmente che il mercato ne é saturo. Al punto che Google ormai fatica a distinguere i contenuti di qualità da quelli _SEO-optimized_. Nei commenti una discussione vivace alle quale partecipano investitori famosi e SEO guru internazionali.
</code></pre>
<ol start="2">
<li><strong><a href="http://www.marioconcina.it/blog/mobile-development/analisi-sullo-sviluppo-di-applicazioni-per-smartphone.html">Analisi sullo sviluppo di applicazioni per Smartphone</a></strong></li>
</ol>
<pre><code>Secondo molti lo sviluppo di applicazioni mobile è il futuro. Ma quale è la piattaforma sulla quale puntare investendo tempo e denaro? Mario Concina ci offre una bella panoramica su linguaggi, costi e pro e contro di ognuna delle piattaforme tecnologiche più importanti (iPhone, Android, Windows Mobile, Symbian, BlackBerry)
</code></pre>
<ol start="3">
<li><strong>]<a href="http://www.pcworld.com/article/221159/5_new_ways_build_iphone_android_browser_apps.html">3</a></strong> Molte Startup lanciano in questi giorni prodotti e soluzioni che promettono di semplificare la creazione di applicazioni mobile. In questo articolo PC World ne presenta cinque. Alcune promettono la luna: creazione rapida di applicazioni mobile per tutti, programmatori e non.</li>
<li><a href="http://www.attackofdesign.com/coder-who-cant-design-and-designers-who-cant-code/"><strong>Programmatori che non sono Designer, Designer che non sono Programmatori</strong></a></li>
</ol>
<pre><code>Il programmatore incapace di accoppiare due colori. Il designer inetto col codice. O ci riconosciamo in una di queste figure (io nella prima), o ne abbiamo incontrate nella nostra carriera. Questo breve articolo ne traccia il profilo.
</code></pre>
<ol start="5">
<li><strong><a href="http://www.bigthink.it/facebook-e-i-nuovi-commenti-sincronizzati/">Facebook e i nuovi commenti sincronizzati</a></strong></li>
</ol>
<pre><code>Facebook è in gran spolvero di questi tempi. Solo quindici giorni fa aggiornava subdolamente il Like Button e questa settimana mette mano al plugin dei Commenti. La novità è destinata a influire pesantemente sulla penetrazione di Facebook nel &amp;#8216;resto della rete&amp;#8217;. Con la solita dovizia di particolari BigThink ci spiega gli aspetti pratici di questo aggiornamento.

&lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://www.bigthink.it/facebook-e-i-nuovi-commenti-sincronizzati/&quot;&gt;&lt;/a&gt;
</code></pre>
<ol start="6">
<li><a href="http://startup.wikli.it/"><strong>Startup.Wikli.it</strong></a></li>
</ol>
<pre><code>Startup, web, acquisizioni e venture capital. Wikli seleziona e commenta le news tematiche più interessanti della settimana, le confeziona e te le fa trovare puntuali nella casella di posta ogni venerdì alle 8.00. Idea brillante e molto ben congegnata. Vi invito ad iscrivervi a questa innovativa mailing list. Non ve ne pentirete.
</code></pre>
<ol start="7">
<li><a href="http://www.fabiolalli.com/2011/03/02/yeplike-startup-in-72-ore/"><strong>YepLike! Startup in 72 ore</strong></a></li>
</ol>
<pre><code>In preda a delirio febbricitante Fabio Lalli si inventa una idea da lanciare in 72 ore. Leggete il suo racconto. PS: nel frattempo le 72 ore sono trascorse, l&amp;#8217;applicazione è su iPhone e a quanto pare riscuote buon successo.
</code></pre>
<ol start="8">
<li><a href="http://rgarg.posterous.com/20-software-development-best-practices"><strong>Venti consigli pratici per il programmatore</strong></a></li>
</ol>
<pre><code>Di post di questo tipo se ne trovano tanti in rete ma questo mi ha colpito perché contiene alcune chicche interessanti che denotano esperienza diretta da parte dell&amp;#8217;autore. Da non perdere se siete principianti. Se siete esperti vi riconoscerete senz&amp;#8217;altro in alcune di queste situazioni.
</code></pre>
<ol start="9">
<li><a href="http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read"><strong>Quale è il libro fondamentale che ogni programmatore dovrebbe leggere nella vita?</strong></a></li>
</ol>
<pre><code>Su Stack Overflow se ne è discusso a lungo. Il risultato è una selezione di alcuni tra i libri più importanti di sempre. Il fatto che il Kernighan &amp; Ritchie non sia il primo in classifica la dice lunga sulla mia vetustità. Sono un collezionista di prime edizioni, ammetto che vedere riuniti così tanti testi fondamentali mi ha fatto prudere le mani.
</code></pre>
<ol start="10">
<li><a href="http://www.howtobearetronaut.com/2011/02/shackletons-antarctica-in-colour-1915/"><strong>Shackleton, L’Antartide a Colori – 1915</strong></a></li>
</ol>
<pre><code>Nel 1915 Shackleton e i suoi uomini furono costretti ad abbandonare la &amp;#8216;Endurance&amp;#8217;, inesorabilmente intrappolata dai ghiacci. Frank Hurley, il fotografo dela spedizione, riuscì miracolosamente a salvare le lastre fotografiche di quella spedizione. In questa magnifica galleria vediamo le foto (a colori) di quella spedizione
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Microsoft, mi tocca boicottare pure IE6countdown.com</title>
      <link>https://nicolaiarocci.com/microsoft-mi-tocca-boicottare-pure-ie6countdown-com/</link>
      <pubDate>Sat, 05 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/microsoft-mi-tocca-boicottare-pure-ie6countdown-com/</guid>
      <description>&lt;p&gt;Col suo sito &lt;a href=&#34;http://www.ie6countdown.com/&#34;&gt;IE6countdown.com&lt;/a&gt; Microsoft riconosce finalmente che l’ormai decenne (2001) Internet Explorer 6 ha fatto il suo tempo. E’ ora di guardare avanti.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Il sito invita i web master di tutto il mondo a unirsi alla crociata per la distruzione della vetusta reliquia aggiungendo un banner alle loro home page. Il banner compare solo quando la pagina è aperta da IE6, spiegando al visitatore che il suo browser è obsoleto e di scarsa qualità (questo in effetti dimentica di dirlo) e suggerendo di aggiornarlo.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Col suo sito <a href="http://www.ie6countdown.com/">IE6countdown.com</a> Microsoft riconosce finalmente che l’ormai decenne (2001) Internet Explorer 6 ha fatto il suo tempo. E’ ora di guardare avanti.</p>
<!-- raw HTML omitted -->
<p>Il sito invita i web master di tutto il mondo a unirsi alla crociata per la distruzione della vetusta reliquia aggiungendo un banner alle loro home page. Il banner compare solo quando la pagina è aperta da IE6, spiegando al visitatore che il suo browser è obsoleto e di scarsa qualità (questo in effetti dimentica di dirlo) e suggerendo di aggiornarlo.</p>
<!-- raw HTML omitted -->
<p>E’ probabile che decine di migliaia di siti adotteranno il banner. E’ interesse comune che IE6 abbandoni le scene al più presto. Tutti vorremmo che le nostre pagine venissero visitate da browser moderni che supportano HTML5 e CSS3. Giusto?</p>
<h2 id="piccolo-dettaglio-insignificante">Piccolo dettaglio insignificante</h2>
<p>C’è però un dettaglio, prontamente segnalato da <a href="http://statichtml.com/2011/ie6-countdown-a-wolf-in-sheeps-clothing.html">Steve Webster</a>, che non quadra. Cliccando sul banner veniamo indirizzati al <a href="http://www.microsoft.com/windows/internet-explorer/default.aspx">sito di Internet Explorer</a> dove siamo invitati a scaricare l’ultimo aggiornamento. Quando va bene chi oggi usa ancora IE6 sta su piattaforma Windows XP. E’ cosa nota che <a href="http://www.theregister.co.uk/2010/09/16/no_ie9_9_on_windows_xp/">Internet Explorer 9 non gira su sistemi precedenti a Vista SP2</a>. L’unica opzione di aggiornamento valida rimane…</p>
<p>…Internet Explorer 8. Un browser vecchio di due anni che si trova sull’orlo dell’obsolescenza e non supporta affatto HTML5. Certo sempre meglio di IE6 ma c’è in giro di molto meglio, non trovate? Fate la cosa giusta e mettete mano al codice che trovate su IE6countdown.com. Fate puntare il vostro banner a <a href="http://google.com/chrome">Chrome</a>, <a href="http://www.getfirefox.com/">Firefox</a>, <a href="http://www.opera.com/">Opera</a> o <a href="http://www.apple.com/it/safari/">Safari</a>. Già che ci siete aggiungete il tag <em>alt</em> (se lo sono scordato) e sostituite l’immagine con una che non ricordi gli anni 90 del secolo scorso.</p>]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Terza Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/</guid>
      <description>&lt;p&gt;Benvenuto alla terza e ultima parte della nostra &lt;em&gt;Introduzione alle Regular
Expression&lt;/em&gt;. Concluso il capitolo sarai  in grado di affrontare la maggior
parte dei problemi di ricerca nel testo. Se ancora non l&amp;rsquo;hai fatto ti
consiglio di leggere la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34;&gt;Prima Parte&lt;/a&gt; e la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/&#34;&gt;Seconda Parte&lt;/a&gt;. Ricorda che
puoi usare la &lt;!-- raw HTML omitted --&gt;pagina di
prova&lt;!-- raw HTML omitted --&gt; per testare le query della guida.&lt;/p&gt;
&lt;h2 id=&#34;avidità&#34;&gt;Avidità&lt;/h2&gt;
&lt;p&gt;Il problema della avidità degli operatori regex diventa evidente quando si
comincia a lavorare su ricerche avanzate. Un caso tipico è il parsing di file
XML o HTML.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Benvenuto alla terza e ultima parte della nostra <em>Introduzione alle Regular
Expression</em>. Concluso il capitolo sarai  in grado di affrontare la maggior
parte dei problemi di ricerca nel testo. Se ancora non l&rsquo;hai fatto ti
consiglio di leggere la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">Prima Parte</a> e la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">Seconda Parte</a>. Ricorda che
puoi usare la <!-- raw HTML omitted -->pagina di
prova<!-- raw HTML omitted --> per testare le query della guida.</p>
<h2 id="avidità">Avidità</h2>
<p>Il problema della avidità degli operatori regex diventa evidente quando si
comincia a lavorare su ricerche avanzate. Un caso tipico è il parsing di file
XML o HTML.</p>
<pre><code>&lt;p&gt;questo è un &lt;b&gt;paragrafo&lt;/b&gt;&lt;/p&gt;
</code></pre>
<p>Supponiamo di voler trovare tutti i tag usati.</p>
<pre><code>&lt;.*&gt; # cerca tutti i tag
</code></pre>
<p>Il risultato della query non è quello che ci si potrebbe aspettare.
L&rsquo;operatore <code>*</code> è <em>avido</em>, ovvero cerca di catturare più caratteri
possibili. Una volta trovato il primo <code>&lt;</code> prosegue avidamente selezionando tutto
fino all&rsquo;ultimo <code>&gt;</code>. In questo caso vogliamo che si fermi al primo <code>&gt;</code>, non
all&rsquo;ultimo. E&rsquo; questa una distinzione importante, da comprendere
a fondo. Possiamo disattivare il comportamento avido aggiungendo il carattere?</p>
<pre><code>&lt;.*?&gt; # ora otteniamo quel che vogliamo (niente avidità)
</code></pre>
<p>Se desideriamo usare l&rsquo;operatore <code>+</code> (1 o più) al posto del <code>*</code> (zero o più),
la nostra query diventa <code>&lt;.+?&gt;</code>.</p>
<h2 id="confini">Confini</h2>
<p>Nella <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">seconda parte</a> del nostro tutorial abbiamo convalidato un numero
telefonico nel formato 555-12345678</p>
<pre><code>555-\d{8}   # 555- seguito da 8 cifre
</code></pre>
<p>Anche se tecnicamente corretta questa query non è perfetta. Se la testiamo con
queste stringhe:</p>
<pre><code>testoDavanti 555-12345678
555-12345678 il mio telefono
</code></pre>
<p>scopriamo che vengono accettate perché la regola <code>555-\d{8}</code> è ancora valida.
In realtà noi desideriamo accettare il solo il numero telefonico, niente
altro. La soluzione richiede l&rsquo;uso degli operatori di confine:</p>
<pre><code>^555-\d{8}$
</code></pre>
<p>I confini sono caratteri speciali perché non occupano spazio. Sono dei
segnaposto che servono a delimitare il testo da cercare. Dopo l&rsquo;inizio
<code>(^)</code> deve esserci il nostro numero di telefono; prima della fine <code>($)</code> deve
esserci il nostro numero di telefono.</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td style=&quot;vertical-align: top;&quot;&gt;
  Inizio del testo. Sfortunatamente gli inventori di regex hanno scelto lo stesso carattere usato per la negazione. E&amp;#8217; importante riconoscerne il significato in base al contesto. Quando non è compreso tra [ e ] il carattere ^ è un confine e indica l&amp;#8217;inizio del testo.
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  fine del testo
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<p>Quindi</p>
<pre><code>a   #  trova qualunque a
^a  #  trova solo il testo che comincia per a
a$  #  trova solo il testo che finisce per a
</code></pre>
<p>C&rsquo;è un altro confine, quello di parola <code>(\b)</code>. Vediamo un esempio. Vogliamo
cercare le parole &ldquo;for&rdquo; e &ldquo;she&rdquo; nella nostra <!-- raw HTML omitted -->pagina di test<!-- raw HTML omitted -->.</p>
<pre><code>(for|she)  # trova for e she
</code></pre>
<p>Non va male. Trova tutte le occorrenze di &ldquo;she&rdquo; e &ldquo;for&rdquo;, tuttavia viene
selezionata anche la parola &ldquo;before&rdquo;. Non è il comportamento desiderato.
Potremmo tentare cercando solo le occorrenze precedute e succedute da uno
spazio.</p>
<pre><code>[ ](for|she)[ ]  # cerca for o she
</code></pre>
<p>Va meglio. Non seleziona più before. Abbiamo però un nuovo problema. Nel testo
c&rsquo;è la frase &ldquo;for she had plenty of time&rdquo;. La nostra regex non ha individuato
la parola &ldquo;she&rdquo; contenuta nella frase. Per quale motivo?</p>
<pre><code>for she had plenty of time
</code></pre>
<p>Con il &ldquo;for&rdquo; iniziale abbiamo già rintracciato lo spazio che precede &ldquo;she&rdquo;, che
quindi viene escluso. Sono queste le situazioni un cui un confine di parola può
risolvere il problema.</p>
<pre><code>\b(for|she)\b  # trova she oppure for
</code></pre>
<p>Il confine <code>\b</code> definisce dove la parola comincia e finisce, proprio come
succede con i confini visti prima. Abbiamo detto prima che i &ldquo;confini non
occupano spazio&rdquo;. Nell&rsquo;esempio qui sopra cerchiamo esattamente
&ldquo;for&rdquo; o &ldquo;she&rdquo;. Non cerchiamo la stringa <code>\b</code> e questa non occupa alcuno spazio
durante la ricerca, a differenza di quel che è successo quando abbiamo tentato
di usare la <code>[cornice]</code>. E&rsquo; un dettaglio importate perché con tutti gli
altri operatori regex ciò che è nella query &ldquo;occupa spazio&rdquo; e non
può essere trovato <em>di nuovo</em>.</p>
<h2 id="il-finale-ricerca-e-sostituzione">Il Finale: Ricerca e Sostituzione</h2>
<p>Ce l&rsquo;hai fatta! Sei arrivato in fondo. Congratulazioni. Il meglio arriva ora.
Ricerca e sostituzione è senz&rsquo;altro il mio argomento preferito. Qui la pagina
di test non ci può aiutare, occorre qualche tipo di editor oppure una IDE
(Eclipse/Notepad++/Wordpad).</p>
<p>Supponiamo di avere un file composto da 100 righe come queste</p>
<pre><code>31-01-10_backup32
24-01-10_backup1
24-02-10_backup_mona
11-03-09_backup_lisa
</code></pre>
<p>Vogliamo correggere le date portandole dal formato europeo a quello americano
(da <code>gg-mm-aa</code> a <code>mm-gg-aaaa</code>).</p>
<pre><code>\d{2}-\d{2}-\d{2}_backup.*  // trova le nostre righe
</code></pre>
<p>Per ogni riga desideriamo sostituire aree specifiche quindi ricorriamo
all&rsquo;operatore di raggruppamento già visto nella <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">seconda parte</a> di
questa guida.</p>
<pre><code>(\d{2})-(\d{2})-(\d{2})_backup(.*)  // ci siamo
</code></pre>
<p>A questo punto tutto quel che dobbiamo fare è sostituire le righe trovate con</p>
<p><!-- raw HTML omitted -->{Gruppo2}<!-- raw HTML omitted -->–<!-- raw HTML omitted -->{Gruppo1}<!-- raw HTML omitted -->-20<!-- raw HTML omitted -->{Gruppo3}<!-- raw HTML omitted -->_backup<!-- raw HTML omitted -->{Gruppo4}<!-- raw HTML omitted --></p>
<p>Il che si traduce nella seguente espressione di sostituzione</p>
<pre><code>\2-\1-20\3_backup\4
</code></pre>
<p>Facile no? Niente più lavori ripetitivi. La mia regola è: se un testo richiede
la modifica di più di cinque righe è giunta l&rsquo;ora di ricorrere alle
regex. Potrebbe sembrare una esagerazione. Eppure un programmatore dovrebbe
rifiutarsi per principio di ripetere manualmente un lavoro che può essere
automatizzato.</p>
<p>Buona fortuna.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-3/">Regex Primer: Part 3</a>.
Ringrazio l&rsquo;autore per il permesso accordatomi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>TEMPO: mostrare dati JSON con solo codice HTML</title>
      <link>https://nicolaiarocci.com/tempo-mostrare-dati-json-con-solo-codice-html/</link>
      <pubDate>Thu, 03 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/tempo-mostrare-dati-json-con-solo-codice-html/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Lanciata da pochi giorni, &lt;a href=&#34;http://tempojs.com/&#34;&gt;&lt;!-- raw HTML omitted --&gt;Lanciata da pochi giorni,&lt;/a&gt; è una piccola (4Kb) e brillante libreria JavaScript che ci mette a disposizione un &lt;em&gt;rendering engine&lt;/em&gt; JSON controllabile con puro codice HTML. La separazione tra HTML e JavaScript rende più facile il lavoro con contenuti AJAX, aumenta la leggibilità del codice e ne facilita la manutenzione. Tempo è compatibile con tutti i browser (IE6 incluso), si integra alla perfezione con jQuery ed è davvero facile da usare.&lt;/p&gt;
&lt;h2 id=&#34;json&#34;&gt;JSON&lt;/h2&gt;
&lt;p&gt;JSON è un formato di scambio dati sempre più diffuso. Un flusso di dati JSON è relativamente compatto (soprattutto rispetto al suo rivale XML) ed è facile da interpretare sia per un umano che per un computer. Ormai tutte le Web API più usate (Facebook, Twitter, ecc.) supportano ampiamente JSON. Ecco un esempio di array JSON:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Lanciata da pochi giorni, <a href="http://tempojs.com/"><!-- raw HTML omitted -->Lanciata da pochi giorni,</a> è una piccola (4Kb) e brillante libreria JavaScript che ci mette a disposizione un <em>rendering engine</em> JSON controllabile con puro codice HTML. La separazione tra HTML e JavaScript rende più facile il lavoro con contenuti AJAX, aumenta la leggibilità del codice e ne facilita la manutenzione. Tempo è compatibile con tutti i browser (IE6 incluso), si integra alla perfezione con jQuery ed è davvero facile da usare.</p>
<h2 id="json">JSON</h2>
<p>JSON è un formato di scambio dati sempre più diffuso. Un flusso di dati JSON è relativamente compatto (soprattutto rispetto al suo rivale XML) ed è facile da interpretare sia per un umano che per un computer. Ormai tutte le Web API più usate (Facebook, Twitter, ecc.) supportano ampiamente JSON. Ecco un esempio di array JSON:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="javascript">JavaScript</h2>
<p>Dopo aver <a href="https://github.com/twigkit/tempo/zipball/master">scaricato</a> la libreria includiamola nella nostra pagina:</p>
<!-- raw HTML omitted -->
<h3 id="tempoprepareelement">Tempo.prepare(element)</h3>
<p>Tempo.Prepare() cerca uno o più data-template in un contenitore HTML, li mette in cache e li rimuove dalla pagina (verranno sostituiti dai dati in fase di rendering). Restituisce infine una istanza specializzata del <em>renderer</em> che, grazie alle indicazioni contenute nei data-template, sa già come mostrare i dati. Se stiamo usando jQuery possiamo passare direttamente l’oggetto jQuery.</p>
<h3 id="rendererrenderdata">renderer.render(data)</h3>
<p>Il metodo <em>render</em> si applica alla instanza del renderer restituita da Tempo.prepare(). Accetta come argomento i dati JSON e li mostra finalmente nella nostra pagina HTML.</p>
<!-- raw HTML omitted -->
<h2 id="html">HTML</h2>
<h3 id="span-stylefont-size-13px-font-weight-normaltempo-riconosce-come-template-qualunque-tag-con-attributo-emdata-template-emche-siacontenuto-nell8217elemento-html-da-noi-indicato-indichiamo-i-campi-dell8217array-json-col-nome-racchiuso-tra-doppie-parentesi-span"><!-- raw HTML omitted -->Tempo riconosce come template qualunque tag con attributo <!-- raw HTML omitted -->data-template <!-- raw HTML omitted -->che sia contenuto nell’elemento HTML da noi indicato. Indichiamo i campi dell’array JSON col nome racchiuso tra doppie parentesi {{}}<!-- raw HTML omitted --></h3>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>il codice viene reso con:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Per le funzionalità avanzate (condizioni se-allora, data-template nidificati, supporto jQuery e gestione callbacks ed eventi) vi rimando alla <a href="http://tempojs.com/">pagina ufficiale</a> della libreria, dalla quale peraltro ho tratto gran parte di questo esempio. Vi trovate anche un <a href="http://tempojs.com/examples/twitter">esempio funzionante</a> di rendering di un flusso proveniente da Twitter e recuperato via jQuery.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ecco Cloud9 IDE la Piattaforma per Programmare nel Cloud</title>
      <link>https://nicolaiarocci.com/arriva-cloud9-ide-la-piattaforma-per-il-software-online/</link>
      <pubDate>Tue, 01 Mar 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/arriva-cloud9-ide-la-piattaforma-per-il-software-online/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Se crei applicazioni per il web non avrebbe senso svilupparle online? Con questa domanda e con uno slogan ben congegnato (&lt;em&gt;Il tuo codice sempre disponibile, ovunque tu sia&lt;/em&gt;) &lt;strong&gt;&lt;a href=&#34;http://cloud9ide.com/&#34;&gt;Cloud9 IDE&lt;/a&gt;&lt;/strong&gt; si presenta finalmente al pubblico. L’idea iniziale era una piattaforma online condivisa e open source per sviluppare codice JavaScript direttamente nel browser. Talento e ambizione hanno consentito di puntare più in alto e Cloud9 è diventata una piattaforma completa per la produzione di software &lt;em&gt;in the cloud&lt;/em&gt; (&lt;a href=&#34;http://en.wikipedia.org/wiki/Platform_as_a_service&#34;&gt;PaaS&lt;/a&gt;). Ma vediamo meglio di cosa si tratta.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Se crei applicazioni per il web non avrebbe senso svilupparle online? Con questa domanda e con uno slogan ben congegnato (<em>Il tuo codice sempre disponibile, ovunque tu sia</em>) <strong><a href="http://cloud9ide.com/">Cloud9 IDE</a></strong> si presenta finalmente al pubblico. L’idea iniziale era una piattaforma online condivisa e open source per sviluppare codice JavaScript direttamente nel browser. Talento e ambizione hanno consentito di puntare più in alto e Cloud9 è diventata una piattaforma completa per la produzione di software <em>in the cloud</em> (<a href="http://en.wikipedia.org/wiki/Platform_as_a_service">PaaS</a>). Ma vediamo meglio di cosa si tratta.</p>
<p>Già un mese fa <a href="http://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/">presentando il Progetto Orion</a> accennavo a Cloud9, allora in beta avanzata. Erano disponibili pochi dettagli e soprattutto mancavano i prezzi. Partiamo dalle caratteristiche salienti.</p>
<h2 id="punti-di-forza">Punti di forza</h2>
<p>Cloud9 si vanta di possedere il miglior editor online per linguaggi dinamici. In effetti l’editor è un progetto originale Mozilla (<a href="http://mozillalabs.com/skywriter/">Skywriter</a>), poi integrato in <a href="http://ace.ajax.org/">Ace</a>. Il codice viene convalidato in tempo reale ed è possibile fare debug e lanciare applicazioni direttamente dal browser. Molte le funzioni per la collaborazione: chat integrato, modifiche condivise in tempo reale, team management e, <em>dulcis in fundo</em>, integrazione completa con <a href="https://github.com/">GitHub</a> (una UI per GitHub è in lavorazione, al momento è disponibile la classica linea di comando). Vedere per credere:</p>
<!-- raw HTML omitted -->
<pre><code>      &lt;p class=&quot;wp-caption-text&quot;&gt;
        Editor per linguaggi dinamici integrato nel browser
      &lt;/p&gt;
    &lt;/div&gt;&lt;/td&gt; 
    
    &lt;td&gt;
      &lt;p&gt;
        &lt;div id=&quot;attachment_1274&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
          &lt;a href=&quot;images/cloud9_2.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1274  &quot; title=&quot;Convalida del codice JavaScript in tempo reale&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_2-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
          
          &lt;p class=&quot;wp-caption-text&quot;&gt;
            Convalida del codice JavaScript in tempo reale
          &lt;/p&gt;
        &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
        
        &lt;tr&gt;
          &lt;td&gt;
            &lt;p&gt;
              &lt;div id=&quot;attachment_1275&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                &lt;a href=&quot;http://i2.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_21.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1275   &quot; title=&quot;Chat intengrato in Cloud9&quot; src=&quot;images/cloud9_21-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                
                &lt;p class=&quot;wp-caption-text&quot;&gt;
                  Chat intengrato in Cloud9
                &lt;/p&gt;
              &lt;/div&gt;&lt;/td&gt; 
              
              &lt;td&gt;
                &lt;p&gt;
                  &lt;div id=&quot;attachment_1276&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                    &lt;a href=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_4.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1276    &quot; title=&quot;Gruppi di lavoro&quot; src=&quot;http://i0.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_4-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                    
                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                      Gruppi di lavoro
                    &lt;/p&gt;
                  &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
                  
                  &lt;tr&gt;
                    &lt;td&gt;
                      &lt;p&gt;
                        &lt;div id=&quot;attachment_1277&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                          &lt;a href=&quot;images/cloud9_5.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1277  &quot; title=&quot;Run e Debug online&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_5-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                          
                          &lt;p class=&quot;wp-caption-text&quot;&gt;
                            Run e Debug online
                          &lt;/p&gt;
                        &lt;/div&gt;&lt;/td&gt; 
                        
                        &lt;td&gt;
                          &lt;p&gt;
                            &lt;div id=&quot;attachment_1278&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                              &lt;a href=&quot;images/cloud9_6.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1278  &quot; title=&quot;Integrazione con GitHub&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_6-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                              
                              &lt;p class=&quot;wp-caption-text&quot;&gt;
                                Integrazione con GitHub
                              &lt;/p&gt;
                            &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; 
                            
                            &lt;tr&gt;
                              &lt;td&gt;
                                &lt;p&gt;
                                  &lt;div id=&quot;attachment_1279&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                                    &lt;a href=&quot;http://i2.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_7.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1279  &quot; title=&quot;Team Management&quot; src=&quot;images/cloud9_7-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                                    
                                    &lt;p class=&quot;wp-caption-text&quot;&gt;
                                      Team Management
                                    &lt;/p&gt;
                                  &lt;/div&gt;&lt;/td&gt; 
                                  
                                  &lt;td&gt;
                                    &lt;p&gt;
                                      &lt;div id=&quot;attachment_1280&quot; style=&quot;width: 220px&quot; class=&quot;wp-caption alignright&quot;&gt;
                                        &lt;a href=&quot;images/cloud9_8.png&quot; rel=&quot;lightbox[1208]&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-1280  &quot; title=&quot;Accedi al codice ovunque tu sia&quot; src=&quot;http://i1.wp.com/nicolaiarocci.com/wp-content/uploads/cloud9_8-150x100.png?w=150&quot; alt=&quot;&quot; data-recalc-dims=&quot;1&quot; /&gt;&lt;/a&gt;
                                        
                                        &lt;p class=&quot;wp-caption-text&quot;&gt;
                                          Accedi al codice ovunque tu sia
                                        &lt;/p&gt;
                                      &lt;/div&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; 
                                      
                                      &lt;h2&gt;
                                        Linguaggi e Frameworks
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        JavaScript naturalmente è supportato al 100%. Ruby anche, seppure parzialmente. Cloud9 mira a integrare tutti i linguaggi e i framework più diffusi. Per quanto riguarda i linguaggi della galassia Microsoft per ora nulla da fare (ma c&amp;#8217;è sempre &lt;strong&gt;&lt;a href=&quot;http://www.coderun.com/&quot;&gt;CodeRun&lt;/a&gt;&lt;/strong&gt;), anche se ho colto un (molto) blando accenno a un futuro supporto per Mono. Cloud9 supporterà il &lt;em&gt;one-click-deploy&lt;/em&gt; su altre piattaforme cloud e il mounting di drive locali per consentire l&amp;#8217;accesso ai files remoti da parte di applicazioni esterne. Insomma il menù è ricco e invitante, bisognerà vedere a che ritmo si succederanno le implementazioni.
                                      &lt;/p&gt;
                                      
                                      &lt;h2&gt;
                                        Piani tariffari
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        Qui la faccenda si fa ancor più interessante e per certi versi sorprendente. I progetti open source possono accedere a Cloud9 gratuitamente. Quelli commerciali possono scegliere tra due piani tariffari, uno giornaliero (€0.33/giorno) e uno mensile (€39/mese). Il piano giornaliero mi incuriosisce parecchio. Se ho ben capito si pagano solo i giorni di uso effettivo, se così fosse si tratterebbe di una soluzione davvero valida oltre che originale. Ad ogni buon conto è previsto un periodo di prova di 30 giorni.
                                      &lt;/p&gt;
                                      
                                      &lt;h2&gt;
                                        Coraggio!
                                      &lt;/h2&gt;
                                      
                                      &lt;p&gt;
                                        Sono intrigato un bel pò, l&amp;#8217;avrete capito. Le titubanze sono legittime, per carità. Sicurezza e riservatezza sono aspetti importanti; queste piattaforme cloud potranno garantirle? Molti di noi hanno superato da tempo queste paure appoggiandosi (per progetti aperti e privati) a GitHub, Mercurial e altri servizi repository. E&amp;#8217; forse giunto il momento di cominciare a sporcarsi le mani. Prima o poi dovremo farci i conti comunque, non credete?
                                      &lt;/p&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startups – Il Meglio della Settimana #2</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-2/</link>
      <pubDate>Mon, 28 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-2/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Eccoci alla selezione delle notizie e i link che ho trovato più interessanti questa settimana. E’ stata una settimana ricca di avvenimenti e non è stato facile decidere cosa lasciare fuori. Andiamo a cominciare:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Eccoci alla selezione delle notizie e i link che ho trovato più interessanti questa settimana. E’ stata una settimana ricca di avvenimenti e non è stato facile decidere cosa lasciare fuori. Andiamo a cominciare:</p>
<h2 id="like-button-facebook-cambia-le-regole">Like Button: Facebook cambia le regole</h2>
<p>Questa settimana Facebook ha sorpreso tutti cambiando radicalmente il funzionamento del pulsante Mi Piace. Su <strong>BigThink</strong> Daniele Ghidoli è tra i primi ad accorgersene e a segnalare la novità. <a href="http://www.bigthink.it/like-button-facebook-cambia/">Leggi l’articolo su BigThink</a>.</p>
<h2 id="google-migliora-l8217algoritmo-di-indicizzazione-del-web">Google migliora l’algoritmo di indicizzazione del web</h2>
<p>Negli ultimi mesi le critiche sulla qualità ****delle ricerche Google si sono moltiplicate. Le famigerate <em>content farm</em> hanno conquistato le prime posizioni per molte ricerche sulle keyword più importanti. Il gigante di Mountain View annuncia a sorpresa la contromossa, ossia l’aggiornamento del suo algoritmo più importante. L’obiettivo è penalizzare i siti di scarsa qualità e migliorare il ranking di quelli con contenuti validi. <a href="http://googleblog.blogspot.com/2011/02/finding-more-high-quality-sites-in.html">Leggi l’annuncio sul blog ufficiale di Google</a>.</p>
<h2 id="e8217-in-arrivo-una-nuova-bolla-delle-dot-com">E’ in arrivo una nuova Bolla delle Dot-Com?</h2>
<p>Le incredibili valutazioni economiche di servizi come Twitter e Facebook inducono molti a sostenere che ci troviamo nel bel mezzo della seconda bolla delle Dot-Com, declinata questa volta ai social network. <strong>TagliaBlog</strong> pubblica la traduzione di un bell’articolo del Wall Street Journal che, prendendo spunto dalla situazione di Twitter, tenta di fare il punto della situazione. <a href="http://blog.tagliaerbe.com/2011/02/nuova-bolla-dot-com.html">Leggi l’articolo su TagliaBlog</a></p>
<h2 id="come-un-tweet-sbagliato-può-portare-al-successo-commerciale-e-a-una-raccolta-di-sangue">Come un Tweet sbagliato può portare al successo commerciale (e a una raccolta di sangue)</h2>
<p>Quando Gloria Huang si accorge di aver twittato per sbaglio la sua richiesta di birra fresca dall’account del datore di lavoro (la Croce Rossa) non immagina certo di scatenare una donazione di sangue di massa e il successo commerciale della sua birra preferita. <a href="http://money.cnn.com/2011/02/17/smallbusiness/dogfish_redcross/index.htm">Leggi questa storia sul sito della CNN</a></p>
<h2 id="lo-stato-attuale-del-web-design-trends-2010">Lo stato attuale del Web Design: Trends 2010</h2>
<p>Il Web Design sta vivendo un’epoca d’oro. Abbiamo a disposizione strumenti potenti (CSS3, HTML5, il font-embedding), migliaia di risorse gratuite e decine di vivaci comunità online. Ma quali sono le nuove tendenze? Quali le tecniche, i concetti e le idee che si stanno affermando? Questa settimana <strong>Smashing Magazine</strong> tenta di anticipare il Web Design del prossimo futuro. <a href="http://www.smashingmagazine.com/2010/05/04/web-design-trends-2010/">Leggi l’articolo di Smashing Magazine</a>.</p>
<h2 id="diffondiamo-la-cultura-digitale-in-italia">Diffondiamo la Cultura Digitale in Italia</h2>
<p>Interessante il progetto Cultura Digitale curato e ideato da Fabio Lalli e dagli Indigeni Digitali. “Si vuole creare un libro gratuito da distribuire on line e off line che parli della Cultura Digitale, di cosa significa per ognuno di noi”. Chiunque può contribuire pubblicando il proprio pensiero sul wall di Cultura Digitale. L’idea è ingegnosa e ben implementata. Funziona anche perché solletica l’ego di ognuno di noi e sfrutta abilmente i meccanismi virali propri del web 2.0. I contributi affluiscono copiosi.  <a href="http://culturadigitale.com/">Visita il sito di Cultura Digitale</a></p>
<h2 id="mono-210">Mono 2.10</h2>
<p>La versione 2.10 di Mono, la piattaforma open source e multi piattaforma alternativa al Microsoft NET Framework, è stata rilasciata questa settimana. Tra le novità aggiornamenti ai compilatori C# e VB, supporto a MVC3, F# e Native Client Google oltre alla soluzione di molti problemi conosciuti. <a href="http://www.mono-project.com/Release_Notes_Mono_2.10">Leggi le Release Notes ufficiali</a>.</p>
<h2 id="python-32">Python 3.2</h2>
<p>Questa è anche la settimana che ha visto l’uscita dell’ultima release del linguaggio Python, la 3.2. La documentazione ufficiale è stata aggiornata con un documento che illustra accuratamente le novità introdotte con questo aggiornamento. <a href="http://docs.python.org/dev/whatsnew/3.2.html">Leggi le novità su Python 3.2</a>.</p>
<h2 id="google-cloud-connect">Google Cloud Connect</h2>
<p>Google Cloud Connect è un plugin per Microsoft Office che consente di sincronizzare i documenti Office appoggiandosi alla piattaforma Google Docs. Rilasciato da Google, questo plugin rende semplice la collaborazione tra utenti che non vogliono o non possono rinunciare alla suite Microsoft. I documenti possono essere aggiornati sia offline che online. <a href="http://www.readwriteweb.com/enterprise/2011/02/google-releases-microsoft-offi.php">Leggi tutto su Google Cloud Connect</a>.</p>
<h2 id="i-5-migliori-tool-gratuiti-per-sql-server">I 5 migliori tool gratuiti per SQL Server</h2>
<p>Sei pigro e la tua azienda è al verde. Che fare? Brent Ozar, guru SQL Server e uno dei progettisti di Stack Overflow, propone cinque tools gratuiti per la gestione e manutenzione di SQL Server. <a href="http://www.brentozar.com/archive/2011/02/my-favorite-free-sql-server-downloads/">Leggi l’articolo sul sito di Brent Ozar</a>.</p>
<h2 id="introduzione-alle-regular-expression">Introduzione alle Regular Expression</h2>
<p>Concludo con una svergognata auto promozione. Introduzione alle Regular Expression è una serie in tre parti, attualmente in pubblicazione, che ha l’ambizione di consentire a chiunque di avvicinarsi alle Regular Expression. Le RegEx sono un strumento potente e spesso incompreso, utile non solo ai programmatori ma a chiunque abbia a che fare con le ricerche su testo. <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">Leggi la prima parte della Introduzione alle Regular Expression.</a></p>
<p>Vi è piaciuta questa selezione? Fatemi sapere che ne pensate con un bel commento qui sotto, lo apprezzerei molto. Alla prossima settimana!</p>]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Seconda Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/</link>
      <pubDate>Sat, 26 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/</guid>
      <description>&lt;p&gt;Questa è la seconda parte della serie &lt;em&gt;Introduzione alle Regular Expression&lt;/em&gt;.
Se non hai ancora letto la &lt;a href=&#34;http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/&#34;&gt;prima parte&lt;/a&gt; ti consiglio di farlo. Puoi usare
la &lt;!-- raw HTML omitted --&gt;pagina demo&lt;!-- raw HTML omitted --&gt; per provare
le query della guida.&lt;/p&gt;
&lt;h2 id=&#34;negazione-&#34;&gt;Negazione [^]&lt;/h2&gt;
&lt;p&gt;Abbiamo già conosciuto la &lt;code&gt;[cornice]&lt;/code&gt;. Una caratteristica importante di cui non
abbiamo ancora parlato è la negazione. Supponiamo di voler cercare qualunque
carattere &lt;em&gt;eccetto la lettera a&lt;/em&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Questa è la seconda parte della serie <em>Introduzione alle Regular Expression</em>.
Se non hai ancora letto la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">prima parte</a> ti consiglio di farlo. Puoi usare
la <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> per provare
le query della guida.</p>
<h2 id="negazione-">Negazione [^]</h2>
<p>Abbiamo già conosciuto la <code>[cornice]</code>. Una caratteristica importante di cui non
abbiamo ancora parlato è la negazione. Supponiamo di voler cercare qualunque
carattere <em>eccetto la lettera a</em>.</p>
<pre><code>[^a] # trova b,c,d,e,f,\n .... qualunque carattere eccetto 'a'
</code></pre>
<p>La negazione si applica a tutti i caratteri della cornice in cui compare
l&rsquo;operatore <code>ˆ</code>. Non è possibile limitarla a solo alcuni.</p>
<pre><code>[^0123456789] # trova qualunque carattere non numerico
</code></pre>
<h2 id="gli-alias">Gli Alias</h2>
<p>Ora siamo pronti per affrontare qualche esempio realistico di regular
expression. Uno degli usi più frequenti delle regex è la convalida di Stringhe.
Proviamo a verificare la correttezza di un ipotetico numero telefonico da
esprimere nel formato 555-12345678. Di norma divideremmo l&rsquo;input in due
parti e proveremmo a convertirle in numeri. Ora tuttavia conosciamo le regex
e possiamo sbrigarcela meglio.</p>
<pre><code>555-[0-9]{7}
</code></pre>
<p>Fatto. Stiamo convalidando 555 seguito da un trattino seguito da 7 caratteri
numerici. Possiamo essere addirittura più sintetici, vediamo come.</p>
<p>I range <code>[0-9]</code> e <code>[a-z]</code>  sono talmente frequenti da saltar fuori continuamente,
tanto che sono state create scorciatoie (alias) dedicate ai range più usati.
Nel nostro caso ci torna utile <code>\d</code>, che sta per digit (carattere numerico)
ed è semanticamente identico a <code>[0-9]</code>.</p>
<pre><code>555-\d{7} # identico a 555-[0-9]{7}
</code></pre>
<p>Gli alias non sono certo indispensabili, puoi ottenere gli stessi risultati
usando la cornice in modo esteso. Tuttavia sono molto comodi.</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;

&lt;th&gt;
  coorrisponde a
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  digit (numero)
&lt;/td&gt;

&lt;td&gt;
  [0-9]
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  word (parola)
&lt;/td&gt;

&lt;td&gt;
  [a-zA-Z0-9_]  Include il carattere underscore
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  spazio, tab o newline
&lt;/td&gt;

&lt;td&gt;
  [ \t\r\n]
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  qualsiasi non numerico
&lt;/td&gt;

&lt;td&gt;
  ^\d
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  quasiasi non alfanumerico
&lt;/td&gt;

&lt;td&gt;
  ^\w
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  quasiasi ma non lo spazio
&lt;/td&gt;

&lt;td&gt;
  ^\s
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<p><strong>Suggerimento:</strong> nota come ad ogni alias ne corrisponde uno dal significato
opposto, tutto in maiuscolo. Impara i primi tre per conoscerli tutti e sei.</p>
<h2 id="il-punto">Il Punto</h2>
<p>Il punto è un alias un pò speciale. Ne parlo soprattutto perchè può capitare di
notarlo nel codice scritto da altri. Il punto cerca tutto eccetto il new line
(<code>\n</code>). Il problema è che il carattere new line non è lo stesso su tutte le
piattaforme.</p>
<pre><code>.   # trova tutti i caratteri
.*  # equivalente a [^\n], trova tutti i paragrafi
</code></pre>
<p>Il punto spesso crea confusione. Consiglio di ricorrere a combinazioni di alias
e cornici per ottenere gli stessi risultati senza rischiare errori.</p>
<h2 id="escaping">Escaping</h2>
<p>Capita a volte di dover cercare proprio il punto, oppure i caratteri [ o ].
Poiché fanno parte della sintassi regex in questi casi è necessario riccorrere
all&rsquo;escaping, ovvero precederli col carattere <code>\</code> che rappresenta
l&rsquo;escape. Per esempio</p>
<pre><code>\.    # cerca il punto invece che tutto quanto
\*    # trova tutti gli asterischi
\\    # trova tutti gli escape
</code></pre>
<h2 id="raggruppamenti-e-or">Raggruppamenti e OR</h2>
<p>Torniamo alla convalida. Questa volta vogliamo verificare la validità di un
indirizzo email. Prima di tutto stabiliamo le regole (semplificate) a cui una
stringa deve attenersi per venire convalidata come indirizzo email: 1) il nome
utente può contenere lettere, numeri, underscore e trattini ma deve cominciare
con una lettera; 2) il dominio può contenere solo lettere seguite da un punto
seguito da altre lettere. Quindi domain.fakecom è valido per noi</p>
<pre><code>[a-z][\w-]*@[a-z]+\.[a-z]+
</code></pre>
<p>Presta attenzione all&rsquo;escaping del punto! Un&rsquo;altro dettaglio
importante è il quantificatore <code>+</code> che abbiamo visto nel <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/">primo articolo</a> di
questa serie. Nel dominio infatti vogliamo <em>almeno</em> una lettera, non zero
o più.</p>
<p>Supponiamo ora di voler aggiornare le regole in modo da convalidare solo
i domini più importanti. Il nostro indirizzo email deve finire con com oppure
net. Non possiamo risolvere questo problema con quel che abbiamo imparato
finora. La nostra query regex dovrà ricorrere a due nuovi concetti,
l&rsquo;operatore OR e i gruppi.</p>
<pre><code>[a-z][\w-]*@[a-z]+\.(com|net)
</code></pre>
<p>Vediamo l&rsquo;OR all&rsquo;opera</p>
<pre><code>com|net  #  trova com oppure net
a|b|c    # lo stesso di [abc].
</code></pre>
<p>L&rsquo;aggiunta delle parentesi () si rende necessaria per chiarire che non
vogliamo trovare <em>tutte</em> le occorrenze della parte di regex alla loro sinistra.
Se volessimo &ldquo;Brad Pitt&rdquo; oppure &ldquo;Angelina Pitt&rdquo;</p>
<pre><code>Brad|Angelina Pitt  # trova sia 'Brad' che 'Angelina Pitt'
(Brad|Angelina) Pitt  # ora ci siamo!
</code></pre>
<p>Per un programmatore il concetto del raggruppamento (grouping) con le parentesi
dovrebbe essere facilmente comprensibile. Di fatto possiamo combinarlo con
altri operatori che già conosciamo</p>
<pre><code>(dog)+   #  trova dog,dogdog,dogdogdog ...
java(bean)?    #  trova java o javabean
</code></pre>
<h2 id="conclusione">Conclusione</h2>
<p>Questo conclude la seconda parte della guida. La prossima e ultima parte verrà
pubblicata tra qualche giorno. Nel frattempo raccomando di giocare con la <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted --> per fare un
pò di pratica.</p>
<p>E&rsquo; ora disponibile anche la <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-terza-parte/">terza parte</a> di questo tutorial.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-2/">Regex Primer: Part 2</a>. Ringrazio l&rsquo;autore per il permesso accordatomi.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Introduzione alle Regular Expression – Prima Parte</title>
      <link>https://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/</link>
      <pubDate>Wed, 23 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/introduzione-alle-regular-expression-prima-parte/</guid>
      <description>&lt;p&gt;Quando si tratta fare ricerche in blocchi di testo le &lt;a href=&#34;http://it.wikipedia.org/wiki/Espressione_regolare&#34;&gt;&lt;strong&gt;regular
expression&lt;/strong&gt;&lt;/a&gt; (regex) sono la soluzione ideale. Come programmatore studiare
le regex è stata una delle cose migliori che ho fatto per migliorare la mia
produttività.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Valide in ogni linguaggio e indipendenti dalla piattaforma, le regex sono
un investimento sempre valido. Java, JavaScript, Ruby, .Net, Python…
le regex non cambiano.&lt;/li&gt;
&lt;li&gt;Rendono ricerca e sostituzione del testo &lt;em&gt;enormemente&lt;/em&gt; più potenti&lt;/li&gt;
&lt;li&gt;Soddisfano pienamente il principio &lt;a href=&#34;http://en.wikipedia.org/wiki/Pareto_principle#In_software&#34;&gt;80/20&lt;/a&gt;. Basta conoscerne il 20% per
risolvere l&#39;80% dei problemi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ho preparato una &lt;!-- raw HTML omitted --&gt;pagina di
prova&lt;!-- raw HTML omitted --&gt; per testare le regex del tutorial. In alternativa è sempre possibile
usare una IDE, praticamente tutte supportano le regular expressions.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quando si tratta fare ricerche in blocchi di testo le <a href="http://it.wikipedia.org/wiki/Espressione_regolare"><strong>regular
expression</strong></a> (regex) sono la soluzione ideale. Come programmatore studiare
le regex è stata una delle cose migliori che ho fatto per migliorare la mia
produttività.</p>
<ol>
<li>Valide in ogni linguaggio e indipendenti dalla piattaforma, le regex sono
un investimento sempre valido. Java, JavaScript, Ruby, .Net, Python…
le regex non cambiano.</li>
<li>Rendono ricerca e sostituzione del testo <em>enormemente</em> più potenti</li>
<li>Soddisfano pienamente il principio <a href="http://en.wikipedia.org/wiki/Pareto_principle#In_software">80/20</a>. Basta conoscerne il 20% per
risolvere l'80% dei problemi.</li>
</ol>
<p>Ho preparato una <!-- raw HTML omitted -->pagina di
prova<!-- raw HTML omitted --> per testare le regex del tutorial. In alternativa è sempre possibile
usare una IDE, praticamente tutte supportano le regular expressions.</p>
<h2 id="partiamo-dalla-cornice">Partiamo dalla [cornice]</h2>
<p>La regex più semplice? Eccola:</p>
<pre><code>bank
</code></pre>
<p>La quale cerca &ldquo;bank&rdquo;. Cambiamola leggermente, immaginiamo di voler cercare sia &ldquo;bank&rdquo; che &ldquo;tank&rdquo; nello stesso blocco di testo.</p>
<pre><code>[bt]ank  // cerca sia bank che tank
</code></pre>
<p>La [cornice] rappresenta comunque 1 carattere. Stiamo ancora cercando una
parola di 4 caratteri, ma il primo può essere &ldquo;b&rdquo; oppure &ldquo;t&rdquo;. I caratteri
inclusi nelle parentesi [] sono legati da una relazione di tipo OR. La loro
posizione è irrilevante, <code>[tb]ank</code> è semanticamente identico. Ecco altri esempi
d’uso della [cornice]:</p>
<pre><code>[abc]1              // trova a1, b1 o c1
[cba]1              // trova a1, b1 o c1
file[0123456789]    // trova file0,file1,file2 ... o file9
file[0-9]           // trova file0,file1,file2 ... o file9
[a-z]               // trova a, b, c oppure ... z
</code></pre>
<p>Avrai notato che abbiamo introdotto un nuovo operatore. Usando il carattere
<code>-</code> definiamo un <em>range</em>. Il range ci permette di evitare costrutti
assurdamente lunghi come questo: <code>[abcdefghijklmnopqrstuvwyz]</code>. E’ una
scorciatoia.</p>
<h2 id="proseguiamo-coi-quantificatori">Proseguiamo coi Quantificatori</h2>
<p>Riprendiamo dall’esempio iniziale. Immaginiamo di voler trovare <em>tank</em>,
<em>bank</em>, <em>tanks</em>, e <em>banks</em>. Potremmo provare in questo modo:</p>
<pre><code>[bt]anks?
</code></pre>
<p>Abbiamo aggiunto il <em>quantificatore</em> <code>?</code> che agisce sul carattere
che si trova direttamente alla sua sinistra. Significa <em>una occorrenza oppure
nessuna</em>, quindi nel nostro caso stiamo dicendo &ldquo;cerca [bt]ank con una
&rsquo;s&rsquo; finale o meno&rdquo;. Un quantificatore può essere affiancato a qualunque
carattere e addirittura a una <code>[cornice]</code>. Dai una occhiata a questi esempi:</p>
<pre><code>[bt]anks         // trova banks o tanks
[bt]anks?        // trova bank, tank, banks oppure tanks
[bt]?ank         // trova bank, tank oppure ank
ab?c?            // trova a, ab, abc oppure ac
</code></pre>
<p>Riassumendo, quando usiamo un carattere senza quantificatore indichiamo che ne
cerchiamo una singola occorrenza. Quando aggiungiamo un quantificatore cambia
il numero di occorrenze che vogliamo trovare. Nella tabella seguente trovi
l’elenco dei quantificatori disponibili:</p>
<!-- raw HTML omitted -->
<pre><code>&lt;th&gt;
  significato
&lt;/th&gt;

&lt;th&gt;
  regex
&lt;/th&gt;

&lt;th&gt;
  esempio
&lt;/th&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  zero o 1
&lt;/td&gt;

&lt;td&gt;
  abc?
&lt;/td&gt;

&lt;td&gt;
  ab, abc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  zero o più
&lt;/td&gt;

&lt;td&gt;
  abc*
&lt;/td&gt;

&lt;td&gt;
  ab,abc,abcc,abccc,abcccc,… etc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  uno o più
&lt;/td&gt;

&lt;td&gt;
  abc+
&lt;/td&gt;

&lt;td&gt;
  abc,abcc,abccc,abcccc,…etc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  esattamente n volte
&lt;/td&gt;

&lt;td&gt;
  abc{2}
&lt;/td&gt;

&lt;td&gt;
  abcc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<pre><code>&lt;td&gt;
  da n a m volte
&lt;/td&gt;

&lt;td&gt;
  abc{2,3}
&lt;/td&gt;

&lt;td&gt;
  abcc,abccc
&lt;/td&gt;
</code></pre>
<!-- raw HTML omitted -->
<h2 id="concludendo">Concludendo</h2>
<p>Abbiamo appreso la sintassi base che ci consente di fare un pò di pratica.
E’ una buona idea fare quale esperimento in una IDE oppure sulla <!-- raw HTML omitted -->pagina demo<!-- raw HTML omitted -->.</p>
<p>La seconda parte di questa guida è ora <a href="http://nicolaiarocci.com/introduzione-alle-regular-expression-seconda-parte/">pubblicata</a>.</p>
<p>Questo articolo è una traduzione autorizzata di <a href="http://www.agillo.net/regex-primer-part-1/">Regex Primer: Part 1</a>.
Ringrazio l’autore per il permesso accordatomi.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione, SEO, Startups – Il Meglio della Settimana #1</title>
      <link>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-1/</link>
      <pubDate>Mon, 21 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-seo-startups-il-meglio-della-settimana-1/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Vi propongo una scelta delle risorse più interessanti e curiose che ho scovato questa settimana in rete. Ce né per tutti i gusti: programmazione, SEO, Startups e curiosità. Andiamo a cominciare:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Vi propongo una scelta delle risorse più interessanti e curiose che ho scovato questa settimana in rete. Ce né per tutti i gusti: programmazione, SEO, Startups e curiosità. Andiamo a cominciare:</p>
<ol>
<li>
<p><strong><a href="http://docs.python.org/dev/howto/pyporting.html">Da Python 2 a Python 3</a></strong></p>
<p>Python 3 è il futuro, ma Python 2 è attualmente la versione più usata al mondo. Ora finalmente la documentazione ufficiale è arricchita da una bella guida alle migliori strategie per supportare entrambe le versioni di Python.</p>
<p><a href="http://docs.python.org/dev/howto/pyporting.html"></a></p>
</li>
<li>
<p><a href="http://blogs.nationalgeographic.com/blogs/news/breakingorbit/2011/01/400-volunteer-for-one-way-mars-trip.html"><strong>Per quale motivo 400 persone si sono offerte volontarie per una viaggio di sola andata verso Marte?</strong></a></p>
</li>
</ol>
<pre><code>Il numero Ottobre-Novembre 2010 del _Journal of Cosmology_ contiene uno speciale di 55 pagine intitolato &amp;#8220;Missione Umana su Marte: Colonizzare il Pianeta Rosso&amp;#8221;. Secondo gli scienziati una missione di sola andata destinata a colonizzare Marte sarebbe possibile entro 20 anni. Cosa ha spinto ben quattrocento lettori a offrirsi come volontari per la missione?
</code></pre>
<ol start="3">
<li><strong><a href="http://www.seomoz.org/blog/tweets-effect-rankings-unexpected-case-study">Il sorprendente effetto di un singolo Tweet sul Page Rank di Google</a></strong></li>
</ol>
<pre><code>Google ha ammesso recentemente che i link provenienti dai social network sono segnali usati nella valutazione dell&amp;#8217;importanza dei siti web. I ragazzi di SEOmoz (tra i migliori esperti SEO in circolazione) sono rimasti esterrefatti dagli effetti che un singolo tweet ha causato sul page rank della loro _Beginners Guide to SEO_.
</code></pre>
<ol start="4">
<li><a href="http://www.lucasartoni.com/lavoro/open-letter-to-an-event-organizer"><strong>Lettera aperta a un organizzatore di eventi</strong></a></li>
</ol>
<pre><code>Per mestiere Luca Sartoni partecipa (come speaker, spettatore o organizzatore) a molte conferenze , seminari e workshops. In questa lettera elenca quelli che secondo lui sono i cinque errori commessi più spesso dagli organizzatori di eventi. E suggerisce come evitarli.
</code></pre>
<ol start="5">
<li><a href="http://en.blog.wordpress.com/2011/02/17/how-is-wordpress-com-made/"><strong>Come si fa WordPress?</strong></a></li>
</ol>
<pre><code>A quanto pare WordPress, pur avendo una sede a San Francisco, è una realtà capillarmente distribuita. Gran parte dei dipendenti lavora da casa ed è disseminata per il mondo, coprendone quasi tutti i fusi orari. In questo articolo sul blog ufficiale dell&amp;#8217;azienda Scott Berkun racconta come si svolge una giornata di lavoro in una azienda di questo tipo.
</code></pre>
<ol start="6">
<li><a href="http://www.allthingsdistributed.com/2011/02/website_amazon_s3.html"><strong>Come ospitare un intero sito (statico) su Amazon S3</strong></a></li>
</ol>
<pre><code>Da qualche tempo Werner Vogels, CTO di Amazon, ospita il suo sito direttamente su S3, la potente piattaforma di _cloud storage_ di Amazon. Una soluzione di questo tipo offre diversi vantaggi, primo fra tutti la scalabilità. In questo articolo Vogels ci spiega come raggiungere lo stesso risultato.
</code></pre>
<ol start="7">
<li><a href="http://www.limedaring.com/im-a-designer-who-learned-django-and-launched-her-first-webapp-in-6-weeks/"><strong>Sono una Designer e ho lanciato la mia prima applicazione in 6 settimane</strong></a></li>
</ol>
<pre><code>Tracy è una designer che non sa quasi nulla di programmazione. Ha una idea su un sito innovativo e tenta senza successo di ottenere un finanziamento che le consenta di assumere un programmatore esperto. Cosa fare? Tracy si rimbocca le maniche e in sei settimane riesce a lanciare una variante (semplificata) della sua idea originale. In Python/Django, ovviamente.
</code></pre>
<ol start="8">
<li><a href="http://sixrevisions.com/web-applications/new-facebook-page/"><strong>La Guida Definitiva al Design delle Pagine Facebook</strong></a></li>
</ol>
<pre><code>Facebook ha aggiornato le Pagine Fan introducendo parecchie novità significative. In questo articolo Six Revisions ci spiega quali sono e come sfruttarle al meglio.
</code></pre>
<ol start="9">
<li><a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-00-introduction-to-computer-science-and-programming-fall-2008/video-lectures/"><strong>I filmati completi del Corso di Programmazione (Python) del MIT</strong></a></li>
</ol>
<pre><code>Ventiquattro filmati completi, di ottima qualità, per imparare a programmare direttamente dai professori del famoso MIT di Boston. Il materiale è di qualità eccellente.
</code></pre>
<ol start="10">
<li><a href="http://www.cenedella.com/job-search/leonardo-da-vincis-resume/"><strong>Il curriculum vitae di Leonardo Da Vinci</strong></a></li>
</ol>
<pre><code>Prima di Mona Lisa, dell&amp;#8217;Ultima Cena e dell&amp;#8217;invenzione dell&amp;#8217;elicottero anche a Leonardo Da Vinci è toccato scrivere il suo bel curriculum. Nel 1482, a trent&amp;#8217;anni, Leonardo lo inviò a Ludovico il Moro, Duca di Milano. In questo splendido articolo possiamo vedere l&amp;#8217;originale e leggerne la trascrizione. Perché? Per imparare un paio di trucchetti che potrebbero tornarci utili.
</code></pre>
<ol start="11">
<li><a href="http://mattoufoutu.rafale.org/ebooks/Doc_diverse/Cours%20Prog/Python/Books/Natural%20Language%20Processing%20with%20Python%20(2009).pdf"><strong>Processare il Linguaggio Naturale in Python</strong></a></li>
</ol>
<pre><code>L&amp;#8217;intero contenuto del libro _Natural Processing Language With Python_ in formato PDF, liberamente accessibile.
</code></pre>
<p>Queste sono solo alcune delle segnalazioni che giorno per giorno pubblico su Twitter. Se volete più notizie, spunti e link interessanti <a href="http://twitter.com/#!/nicolaiarocci">seguitemi anche su Twitter</a>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Il Processo Creativo nell’Era Moderna</title>
      <link>https://nicolaiarocci.com/il-processo-creativo-nellera-moderna/</link>
      <pubDate>Sat, 19 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-processo-creativo-nellera-moderna/</guid>
      <description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    <item>
      <title>TuoGuru – Il mercato italiano del Know How</title>
      <link>https://nicolaiarocci.com/tuoguru-il-mercato-italiano-del-know-how/</link>
      <pubDate>Fri, 18 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/tuoguru-il-mercato-italiano-del-know-how/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Una interessante startup italiana muove i primi passi proprio in questi giorni. &lt;strong&gt;&lt;a href=&#34;http://tuoguru.com/&#34;&gt;TuoGuru&lt;/a&gt;&lt;/strong&gt; si presenta come il &lt;strong&gt;primo Marketplace Italiano del Know How&lt;/strong&gt;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Una interessante startup italiana muove i primi passi proprio in questi giorni. <strong><a href="http://tuoguru.com/">TuoGuru</a></strong> si presenta come il <strong>primo Marketplace Italiano del Know How</strong>.</p>
<h2 id="come-funziona">Come funziona</h2>
<p>La registrazione è gratuita e comprende la fornitura di 12 crediti spendibili subito per pubblicare domande sul sito. Chi fornirà la risposta migliore si aggiudicherà il <strong>premio in denaro</strong> (2€, 5€, 10€, ecc.) messo in palio dall’autore della domanda. Le categorie disponibili in questo momento sono Grafica, Programmazione,  SEO &amp; Marketing, CMS, Social Media, Fisco e Contabilità, Software, Hardware, Dominio + Hosting. Altre verranno aggiunte nel tempo.</p>
<!-- raw HTML omitted -->
<h2 id="il-modello-di-business">Il modello di business</h2>
<p>Avete letto bene. Su TuoGuru girano soldi! Esauriti i 12 crediti iniziali per porre domande dovrete acquistarne altri (oppure invitare amici sul sito). Al costo dei crediti dovrete poi aggiungere il premio da corrispondere nel caso qualcuno vi fornisca la risposta che cercate. Riassumendo:</p>
<ol>
<li>Il sito incassa vendendo crediti.</li>
<li>Chi risponde ha la possibilità di guadagnare fornendo la risposta migliore.</li>
<li>Chi fa domande compra la <em>possibilità</em> di ottenere risposte veloci, precise e attendibili.</li>
</ol>
<p>Di questi tempi potrebbe sembrare un controsenso pagare per ottenere risposte. Ci sono miriadi di forum e siti Q&amp;A gratuiti. La scommessa di un servizio come questo è infatti la nicchia, ovvero scommettere su coloro che pur di proseguire il lavoro e ottenere rapidamente una risposta qualificata non hanno problemi a investire una cifra tutto sommato modesta.</p>
<h2 id="la-chiave-del-successo">La chiave del successo</h2>
<p>In questi schemi il personaggio chiave è l’<strong>esperto</strong>, colui/colei che decide di investire il proprio tempo fornendo risposte di qualità sperando di guadagnarci qualcosa. Più risposte qualificate, rapide e attendibili arriveranno più è probabile che gli utenti decideranno di usare il servizio a pagamento. Rispondere alle domande è gratuito, consente di migliorare la propria fama (esiste un meccanismo di classifiche interne), può essere divertente e può dare una mano a far quadrare i conti a fine mese. Perché non provarci?</p>
<h2 id="i-primi-passi">I primi passi</h2>
<p>In due giorni dall’apertura al pubblico ci sono già più di <strong>500 utenti registrati</strong>. Le domande cominciano circolare e, soprattutto, le riposte fioccano. Bei segnali positivi. Questi ragazzi ci stanno provando seriamente e stanno lavorando bene. Si meritano un grosso <strong>in bocca al lupo</strong>!</p>]]></content:encoded>
    </item>
    <item>
      <title>Disponibile il programma completo di BE-Wizard 2011</title>
      <link>https://nicolaiarocci.com/disponibile-il-programma-di-be-wizard-2011/</link>
      <pubDate>Thu, 17 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/disponibile-il-programma-di-be-wizard-2011/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Sul sito ufficiale di &lt;strong&gt;BE-Wizard 2011&lt;/strong&gt; è disponibile il &lt;a href=&#34;http://admin.abc.sm/upload/2156/programma_be-wizard.pdf&#34;&gt;programma completo&lt;/a&gt; della due giorni SEO/Web Marketing che si terrà a San Marino i prossimi 11 e 12 marzo. Come scrivevo già &lt;a href=&#34;http://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/&#34;&gt;qualche tempo fa&lt;/a&gt; quest’anno BE-Wizard porta in italia i &lt;strong&gt;guru internazionali di SEO e Web Marketing&lt;/strong&gt;: Rand Fishkin (SEOmoz), Avinash Kaushik (Google), Marcus Tandler &amp;amp; Nils Döerje (Tandler &amp;amp; Döerje Partners), Tom Critchlow (Distilled) e altri.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Sul sito ufficiale di <strong>BE-Wizard 2011</strong> è disponibile il <a href="http://admin.abc.sm/upload/2156/programma_be-wizard.pdf">programma completo</a> della due giorni SEO/Web Marketing che si terrà a San Marino i prossimi 11 e 12 marzo. Come scrivevo già <a href="http://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/">qualche tempo fa</a> quest’anno BE-Wizard porta in italia i <strong>guru internazionali di SEO e Web Marketing</strong>: Rand Fishkin (SEOmoz), Avinash Kaushik (Google), Marcus Tandler &amp; Nils Döerje (Tandler &amp; Döerje Partners), Tom Critchlow (Distilled) e altri.</p>
<h2 id="il-programma">Il Programma</h2>
<p>Il programma è ricco di argomenti interessanti. Per solleticare il tuo appetito (ci sono ancora posti disponibili) ti propongo una selezione degli interventi che personalmente attendo con grande curiosità:</p>
<ul>
<li><strong>Google Ranking</strong>: novità e scoperte inedite su come Google classifica i risultati organici, alla luce delle ultime ricerche svolte da SEOmoz.org (Rand Fishkin)</li>
<li><strong>Comunicare On-line con i Video</strong>. Video marketing: i fattori che determinano il successo di un video online e la diffusione virale. Video Analytics: misurare l’impatto dei propri video e calcolare il ritorno dell’investimento (Paolo Zanzottera)</li>
<li><strong>Ranking e comportamento dell’utente</strong>: come perfezionare il ranking attraverso l’analisi di Click-Through e Bounce Rate (Marcus Tandler)</li>
<li><strong>Come video, news e immagini hanno influito sulle tradizionali tecniche di posizionamento</strong>. Come applicare delle strategie ad hoc per la Universal Search (Neils Dörje)</li>
<li><strong>Link building</strong>: Dieci strategie avanzate per una link popularity efficace (Marcus Tandler)</li>
<li><strong>Ottimizzazione del Tasso di Conversione</strong>: come trasformare un sito locale in un “Conversion Funnel”, tracciare i dati e migliorare il tasso di conversione (Rand Fishkin)</li>
</ul>
<p>Per vedere l’elenco completo degli interventi consulta il <a href="http://admin.abc.sm/upload/2156/programma_be-wizard.pdf">programma ufficiale</a> sul sito ufficiale.</p>
<h2 id="incontriamoci">Incontriamoci!</h2>
<p>Ribadisco l’invito già fatto in passato. Se anche tu sarai presente fammelo sapere, magari organizziamo <strong>due chiacchiere</strong> davanti a un caffè o un aperitivo!</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Testa Il Feedback Utente Come Segnale di Ranking</title>
      <link>https://nicolaiarocci.com/google-testa-il-feedback-utente-come-segnale-di-ranking/</link>
      <pubDate>Tue, 15 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-testa-il-feedback-utente-come-segnale-di-ranking/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Google ha appena annunciato una estensione per &lt;strong&gt;&lt;a href=&#34;http://www.google.com/chrome?hl=it&#34;&gt;Chrome&lt;/a&gt;&lt;/strong&gt; che permette agli utenti del browser di escludere dai risultati delle ricerche i siti di scarsa qualità o poco interessanti.&lt;/p&gt;
&lt;p&gt;Estensioni di questo tipo esistono da tempo ma questa si distingue per un motivo importante. Nel suo &lt;a href=&#34;http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html&#34;&gt;annuncio&lt;/a&gt; &lt;strong&gt;Matt Cutts&lt;/strong&gt;, responsabile Google per i motori di ricerca, afferma che i siti bloccati da &lt;a href=&#34;https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef&#34;&gt;&lt;strong&gt;Personal Blocklist&lt;/strong&gt;&lt;/a&gt; (questo il nome dell’estensione) verranno registrati in un database. In futuro Google potrebbe escludere questi siti dai risultati organici delle ricerche:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Google ha appena annunciato una estensione per <strong><a href="http://www.google.com/chrome?hl=it">Chrome</a></strong> che permette agli utenti del browser di escludere dai risultati delle ricerche i siti di scarsa qualità o poco interessanti.</p>
<p>Estensioni di questo tipo esistono da tempo ma questa si distingue per un motivo importante. Nel suo <a href="http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html">annuncio</a> <strong>Matt Cutts</strong>, responsabile Google per i motori di ricerca, afferma che i siti bloccati da <a href="https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef"><strong>Personal Blocklist</strong></a> (questo il nome dell’estensione) verranno registrati in un database. In futuro Google potrebbe escludere questi siti dai risultati organici delle ricerche:</p>
<blockquote>
<p>One of the signals we’re exploring is explicit feedback from users. To that end, today we’re launching an early, experimental Chrome extension so people can block sites from their web search results. If installed, <strong>the extension also sends blocked site information to Google, and we will study the resulting feedback and explore using it as a potential ranking signal for our search results</strong>.</p></blockquote>
<p>Un sito bloccato da migliaia di utenti potrebbe indurre Google a classificarlo come <a href="http://en.wikipedia.org/wiki/Content_farm"><strong>content farm</strong></a> ed escluderlo dai risultati delle ricerche. E’ probabile (e auspicabile!) che, almeno in una prima fase, questi siti saranno sottoposti a uno scrutinio accurato prima di venire depennati.</p>
<h2 id="web-20-all8217ennesima-potenza">Web 2.0 all’ennesima potenza</h2>
<p>Finora Google ha sempre dichiarato di puntare fermamente a una soluzione algoritmica al problema della classificazione dei siti web. Con l’annuncio di oggi pare aprirsi una crepa in questa filosofia. Per la prima volta gli utenti potrebbero avere la possibilità di <strong>partecipare in maniera attiva</strong> alla selezione qualitativa dei risultati proposti da un motore da ricerca.</p>
<h2 id="un-sistema-abusabile">Un sistema abusabile?</h2>
<p>Probabilmente è presto per preoccuparsi di questo ma c’è da augurarsi, se mai ci si arriverà, che l’implementazione finale tenga ben conto del rischio di abusi. Una azienda con pochi scrupoli potrebbe pensare di investire quattrini sonanti in una campagna di discredito nei confronti di un concorrente. Certo non sarebbe semplice né economico, ma pur sempre fattibile.</p>
<h2 id="che-ne-pensate">Che ne pensate?</h2>
<p>Questa mi pare una innovazione interessante sia dal punto di vista pratico-funzionale che ‘sociale’, passatemi il termine.  Voi cosa ne pensate?</p>
<h3 id="approfondimenti">Approfondimenti</h3>
<ul>
<li><a href="http://googleblog.blogspot.com/2011/02/new-chrome-extension-block-sites-from.html">Annuncio della nuova Estensione per Google Chrome</a></li>
<li><a href="https://chrome.google.com/webstore/detail/nolijncfnkgaikbjbdaogikpmpbdcdef">Pagina ufficiale di Personal Blocklist</a></li>
<li><a href="http://www.seroundtable.com/google-personal-blocklist-12958.html">Dettagli sul funzionamento dell’estensione su Search Engine Roundtable</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>SourceKit – Scrivere codice in Google Chrome e salvarlo su DropBox</title>
      <link>https://nicolaiarocci.com/sourcekit-chrome-dropbox/</link>
      <pubDate>Thu, 10 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/sourcekit-chrome-dropbox/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://chrome.google.com/webstore/detail/iieeldjdihkpoapgipfkeoddjckopgjg&#34;&gt;&lt;strong&gt;SourceKit&lt;/strong&gt;&lt;/a&gt; è una applicazione per Google Chrome che permette di scrivere codice direttamente nel browser usando &lt;a href=&#34;https://www.dropbox.com/&#34;&gt;DropBox&lt;/a&gt; come disco dati/repository. Un &lt;a href=&#34;http://macromates.com/&#34;&gt;TextMate&lt;/a&gt; &lt;em&gt;in the cloud&lt;/em&gt; insomma.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p><a href="https://chrome.google.com/webstore/detail/iieeldjdihkpoapgipfkeoddjckopgjg"><strong>SourceKit</strong></a> è una applicazione per Google Chrome che permette di scrivere codice direttamente nel browser usando <a href="https://www.dropbox.com/">DropBox</a> come disco dati/repository. Un <a href="http://macromates.com/">TextMate</a> <em>in the cloud</em> insomma.</p>
<!-- raw HTML omitted -->
<p>Se avete installato DropBox su ognuno dei vostri computer (un Mac a casa e un PC al lavoro per esempio) il risultato sarà quello di lavorare nel </p>
<p><em>cloud</em> mantenendo però copie locali, sincronizzate, dei vostri sorgenti. Potrete spostarvi da un computer all’altro e riprendere la scrittura del codice come se niente fosse. L’editor integrato è Mozilla Skywriter (ora <a href="http://ace.ajax.org/">Ace</a>) e supporta parecchi linguaggi: C/C++, C#, Ruby, Python, PHP, HTML, JavaScript, Java.</p>
<p>Proprio l’altro giorno raccontando del progetto <strong>Orion Eclipse</strong> mi (e <em>vi</em>) chiedevo <a href="http://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/">se il futuro del codice sorgente non sia online</a>. SourceKit ci da la possibilità di provare subito “l’effetto che fa”, come diceva una vecchia pubblicità. Provare per credere!</p>]]></content:encoded>
    </item>
    <item>
      <title>Google Shopping, è imminente il lancio italiano</title>
      <link>https://nicolaiarocci.com/google-shopping-e-imminente-il-lancio-italiano/</link>
      <pubDate>Mon, 07 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/google-shopping-e-imminente-il-lancio-italiano/</guid>
      <description>&lt;p&gt;Oggi Google ha &lt;a href=&#34;http://googlemerchantblog.blogspot.com/2011/02/google-merchant-center-launches-in.html&#34;&gt;Oggi Google ha&lt;/a&gt; che presto il servizio &lt;strong&gt;&lt;a href=&#34;http://www.google.com/products&#34;&gt;Google Shopping&lt;/a&gt;&lt;/strong&gt; sarà attivato in Italia. Si tratta di un motore specializzato nella ricerca delle migliori occasioni di acquisto. Basta farsi un giro sulla &lt;a href=&#34;http://www.google.com/products&#34;&gt;versione inglese del servizio&lt;/a&gt;, già operativa da qualche tempo, per rendersi conto che questo strumento ha serie possibilità di cambiare radicalmente il modo di vendere e fare acquisti online.&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;</description>
      <content:encoded><![CDATA[<p>Oggi Google ha <a href="http://googlemerchantblog.blogspot.com/2011/02/google-merchant-center-launches-in.html">Oggi Google ha</a> che presto il servizio <strong><a href="http://www.google.com/products">Google Shopping</a></strong> sarà attivato in Italia. Si tratta di un motore specializzato nella ricerca delle migliori occasioni di acquisto. Basta farsi un giro sulla <a href="http://www.google.com/products">versione inglese del servizio</a>, già operativa da qualche tempo, per rendersi conto che questo strumento ha serie possibilità di cambiare radicalmente il modo di vendere e fare acquisti online.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Già dalla home page è evidente come in Google si siano ingegnati per offrire una</p>
<p><strong>esperienza di ricerca del tutto simile a quella classica</strong> alla quale gli utenti sono abituati (verrebbe da dire <em>condizionati</em>) da tempo. L’integrazione è tale che basta un click per spostarsi dalla ricerca in Google Shopping a quella in Google Classico.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il visitatore può ordinare o filtrare i risultati in base al prezzo, oppure può confrontare le offerte che i diversi commercianti propongono per lo stesso prodotto. E’ presente anche un carrello della spesa nel quale inserire i prodotti e le offerte più interessanti.</p>
<h2 id="cosa-ci-guadagna-il-commerciante">Cosa ci guadagna il commerciante?</h2>
<p>Una volta compiuta la scelta l’utente viene <strong>indirizzato</strong> <strong>sul sito del commerciante</strong>. E’ dunque il commerciante stesso a <strong>realizzare direttamente la vendita</strong>**.**</p>
<p>Il servizio è <strong>gratuito</strong> e non sembra che Google sia interessata a provvigioni o voglia applicare tariffe per l’iscrizione al catalogo (verificherò con calma nelle prossime ore). Un dettaglio da considerare con attenzione: il visitatore che arriva sul nostro sito via Google Shopping è <strong>fortemente motivato all’acquisto</strong>: conosce il prezzo e ha scelto di sua iniziativa di venire a trovarci. Tocca a noi giocarcela bene offrendogli una ottima esperienza di acquisto!</p>
<h2 id="come-ci-guadagna-google">Come ci guadagna Google?</h2>
<p>Innanzi tutto grazie alla integrazione (già annunciata) con <strong><a href="http://www.google.it/intl/it/adwords/jumpstart/phone.html">AdWords</a></strong>. Le confezioni dei prodotti appariranno anche nella ricerca classica, integrate negli annunci AdWords. C’è poi <strong>Checkout</strong>, il servizio Google per i pagamenti online. Non è un caso che il primo filtro che appare in Google Shopping sia proprio la selezione dei soli prodotti acquistabili via Checkout.</p>
<p>C’è infine il fattore strategico. Se il servizio decollerà Google diventerà uno strumento indispensabile per mettere in contatto venditori e acquirenti. In futuro sarà molto difficile rinunciarvi, qualunque saranno le condizioni o i servizi (a pagamento?) che Google vorrà veicolare via Google Shopping.</p>
<h2 id="cominciare-subito">Cominciare subito</h2>
<p>Benché il servizio non sia ancora aperto al pubblico è già possibile registrarsi a <!-- raw HTML omitted -->Google Merchant Center<!-- raw HTML omitted -->, il sito per commercianti sul quale registrare i propri prodotti. Il sistema è basato su <em>feeds</em> ed è piuttosto sofisticato (ma non troppo complicato), il che testimonia l’interesse di Google per l’intero progetto.</p>]]></content:encoded>
    </item>
    <item>
      <title>Il meglio di Stack Overflow in una collana di eBook gratuiti</title>
      <link>https://nicolaiarocci.com/il-meglio-di-stack-overflow-una-collana-di-ebook-gratuiti/</link>
      <pubDate>Wed, 02 Feb 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-meglio-di-stack-overflow-una-collana-di-ebook-gratuiti/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;a href=&#34;http://stackoverflow.com/&#34;&gt;&lt;strong&gt;Stack Overflow&lt;/strong&gt;&lt;/a&gt; è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera &lt;strong&gt;minera di informazioni&lt;/strong&gt; &lt;strong&gt;preziose&lt;/strong&gt; e  meriterebbe maggiore attenzione…&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1-"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-1">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--1"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con]<a href="http://www.amazon.com/dp/B002Y27P3M/?tag=gocous-20&amp;hvadid=5729120357&amp;ref=pd_sl_blgu0nkyl_b">7</a> e credo con altri lettori di eBook. Ricordo che è possibile leggere i libri per Kindle con l’applicazione <strong>gratuita</strong> disponibile per <a href="http://www.amazon.com/gp/feature.html/ref=kcp_pc_mkt_lnd?docId=1000426311">PC</a>, <a href="http://www.amazon.com/gp/feature.html/ref=kcp_mac_mkt_lnd?docId=1000464931">Mac</a>, [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-2">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--2"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con [<!-- raw HTML omitted --><a href="http://stackoverflow.com/"><strong>Stack Overflow</strong></a> è la risorsa per programmatori più famosa e apprezzata della Rete. Purtroppo domande e risposte pubblicate sul sito si succedono a un ritmo tale che è impossibile seguire gli aggiornamenti in tempo reale. Per questo motivo la gran parte degli utenti (sottoscritto incluso!) ricorre a Stack Overflow solo al momento del bisogno, quando è necessario trovare in fretta la soluzione a un problema critico. E’ un peccato perchè Stack Overflow è una vera <strong>minera di informazioni</strong> <strong>preziose</strong> e  meriterebbe maggiore attenzione…</p>
<h2 id="gli-ebooks-di-stack-overflow-3">Gli eBooks di Stack Overflow</h2>
<h2 id="img-classsize-full-wp-image-794-alignright-titlestack-overflow-ebook-srchttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgfit2002c267-altstack-overflow-ebook-srcsethttpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgw200-200w-httpi2wpcomnicolaiaroccicomwp-contentuploads201102stack_overflow_ebookjpgresize1122c150-112w-sizesmax-width-200px-100vw-200px-data-recalc-dims1--3"><!-- raw HTML omitted --></h2>
<p>Recentemente <a href="http://meta.stackoverflow.com/users/893/greg-hewgill">Greg Hewkill</a> ha <a href="http://meta.stackoverflow.com/questions/74399/stack-overflow-top-20-tags-in-ebook-format">annunciato</a> la creazione di <a href="https://github.com/ghewgill/so-static">uno script open source</a> che genera un eBook per ognuno dei <strong>20 tag più popolari</strong> di Stack Overflow. Ogni libro contiene le domande (e risposte) più votate nella sua categoria. Il risultato è una vera e propria <a href="http://hewgill.com/~greg/stackoverflow/ebooks/"><em>collana Stack Overflow</em></a> che propone il <strong>concentrato dei migliori contenuti del sito</strong>. Basta scorrere i <em>titoli</em> (tag) per rendersi conto che ce n’è davvero per tutti i gusti. Ecco una lista parziale:</p>
<ul>
<li>JAVA (26M)</li>
<li>C# (24M), C++ (21M), C (11M)</li>
<li>NET (21M)</li>
<li>PYTHON (20M), DJANGO (1.6M)</li>
<li>JAVASCRIPT (15M)</li>
<li>PHP (9.6M)</li>
<li>IPHONE (7.3M)</li>
<li>HTML (6.0M), HTML 5 (3.0M)</li>
<li>CSS (5.7M)</li>
<li>JQUERY (5.5M)</li>
<li>ASP.NET (4.8M)</li>
<li>DATABASE (4.8M)</li>
<li>RUBY (3.1M), RUBY ON RAILS (1.9M)</li>
<li>ANDROID (2.7M)</li>
<li>MY SQL (2.5M), ORACLE (662K), SQL SERVER (2.8M), SQL (5.1M)</li>
<li>AJAX (2.1M)</li>
<li>COCOA (1.5M), OBJECTIVE-C (3.1M)</li>
<li>VB.NET (1.5M)</li>
<li>SILVERLIGHT (1.1M)</li>
<li>FLASH (509K)</li>
</ul>
<p>Alcuni sono di dimensioni notevoli il che ne fa ideali letture da divano! Il formato usato per confezionare gli eBook è <a href="http://www.mobipocket.com/dev/article.asp?BaseFolder=prcgen&amp;File=mobiformat.htm">Mobipocket</a>, compatibile con]<a href="http://www.amazon.com/dp/B002Y27P3M/?tag=gocous-20&amp;hvadid=5729120357&amp;ref=pd_sl_blgu0nkyl_b">7</a> e credo con altri lettori di eBook. Ricordo che è possibile leggere i libri per Kindle con l’applicazione <strong>gratuita</strong> disponibile per <a href="http://www.amazon.com/gp/feature.html/ref=kcp_pc_mkt_lnd?docId=1000426311">PC</a>, <a href="http://www.amazon.com/gp/feature.html/ref=kcp_mac_mkt_lnd?docId=1000464931">Mac</a>,]<a href="http://www.amazon.com/gp/feature.html/ref=kcp_iphone_mkt_lnd?docId=1000301301">10</a> e <a href="http://www.amazon.com/gp/feature.html?ie=UTF8&amp;docId=165849822">Android</a>.</p>
<p><strong>Buona lettura!</strong></p>]]></content:encoded>
    </item>
    <item>
      <title>Il futuro del codice sorgente è online?</title>
      <link>https://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/</link>
      <pubDate>Sat, 29 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/il-futuro-del-codici-sorgente-e-online/</guid>
      <description>&lt;p&gt;Gli ambienti di sviluppo (IDE) online sono una delle opportunità più originali che il &lt;a href=&#34;http://it.wikipedia.org/wiki/Cloud_computing&#34;&gt;cloud computing&lt;/a&gt; mette a disposizione dei programmatori web. In generale si tratta di editor di codice, debugger e strumenti per il controllo di versione da usare nel browser web senza bisogno di installare alcun software sul client. Per il momento le soluzioni disponibili offrono funzionalità limitate che tuttavia lasciano intravedere le possibilità che questi strumenti metteranno a nostra disposizione.&lt;/p&gt;
&lt;h2 id=&#34;il-progetto-orion&#34;&gt;Il Progetto Orion&lt;/h2&gt;
&lt;p&gt;Semplici editor di codice sorgente sono disponibili online già da tempo, ma progetti come &lt;strong&gt;Orion&lt;/strong&gt; portano il concetto di programmazione online a un livello superiore. &lt;a href=&#34;http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/&#34;&gt;Annunciato pochi giorni fa&lt;/a&gt; dal team di sviluppo di &lt;strong&gt;Eclipse&lt;/strong&gt;, una IDE Open Source molto diffusa e apprezzata, il progetto Orion è qualcosa di nuovo:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Gli ambienti di sviluppo (IDE) online sono una delle opportunità più originali che il <a href="http://it.wikipedia.org/wiki/Cloud_computing">cloud computing</a> mette a disposizione dei programmatori web. In generale si tratta di editor di codice, debugger e strumenti per il controllo di versione da usare nel browser web senza bisogno di installare alcun software sul client. Per il momento le soluzioni disponibili offrono funzionalità limitate che tuttavia lasciano intravedere le possibilità che questi strumenti metteranno a nostra disposizione.</p>
<h2 id="il-progetto-orion">Il Progetto Orion</h2>
<p>Semplici editor di codice sorgente sono disponibili online già da tempo, ma progetti come <strong>Orion</strong> portano il concetto di programmazione online a un livello superiore. <a href="http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/">Annunciato pochi giorni fa</a> dal team di sviluppo di <strong>Eclipse</strong>, una IDE Open Source molto diffusa e apprezzata, il progetto Orion è qualcosa di nuovo:</p>
<blockquote>
<p>E’ una piattaforma di sviluppo aperta focalizzata totalmente allo sviluppo per il web, dentro il web. I tools sono scritti in JavaScript e girano nel browser. A differenza di altri tentativi di realizzare strumenti di sviluppo integrati nel browser, Orion non è una IDE che gira in una singola scheda del browser. I links funzionano e possono essere condivisi. Puoi aprire files in schede diverse e grande cura è stata messa nel fornire una ottima web experience durante lo sviluppo del codice</p></blockquote>
<!-- raw HTML omitted -->
<pre><code>  &lt;p class=&quot;wp-caption-text&quot;&gt;
    Codice JavaScript sviluppato direttamente in Google Chrome - Progetto Orion/Eclipse
  &lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
  Orion supporta JavaScript e presto funzionerà anche con PHP, HTML, CSS e Java.
&lt;/p&gt;

&lt;h2&gt;
  Cloud9 e gli altri
&lt;/h2&gt;

&lt;p&gt;
  &lt;img class=&quot;alignleft&quot; title=&quot;Cloud9 IDE&quot; src=&quot;images/2011/01/cloud9ide.png?resize=147%2C150&quot; alt=&quot;Cloud9 IDE&quot; data-recalc-dims=&quot;1&quot; /&gt;Anche &lt;strong&gt;Mozilla&lt;/strong&gt; lavora da tempo (2008) a qualcosa di simile. &lt;a href=&quot;http://mozillalabs.com/skywriter/&quot;&gt;Skywriter&lt;/a&gt;, semplice editor online ora integrato in &lt;a href=&quot;http://ace.ajax.org/&quot;&gt;Ace&lt;/a&gt;, è alla base della piattaforma &lt;a style=&quot;font-weight: bold;&quot; href=&quot;http://cloud9ide.com/&quot;&gt;Cloud9 IDE&lt;/a&gt;. Attualmente in beta, Cloud9 è una IDE JavaScript integrata in Google Chrome che promette prestazioni uguali a quelle offerte da editor e IDE tradizionali, integrazione tra codice sorgente locale e remoto, debugging e deployment integrati.
&lt;/p&gt;

&lt;p&gt;
  Altro brillante esempio è &lt;strong&gt;&lt;a href=&quot;http://www.coderun.com/&quot;&gt;CodeRun&lt;/a&gt;&lt;/strong&gt;, IDE online già funzionante e gratuita dedicata soprattutto a sviluppatori ASP.NET, Silverlight e WPF. Il mondo IDE insomma è in gran fermento.
&lt;/p&gt;

&lt;h2&gt;
  Vantaggi e svantaggi di sviluppare nel cloud
&lt;/h2&gt;

&lt;p&gt;
  Immaginate un &lt;a href=&quot;http://docs.google.com/&quot;&gt;Google Documents&lt;/a&gt; per programmatori. Oggi possiamo creare online fogli di calcolo, testi e presentazioni; domani potremo sviluppare i nostri programmi nel browser. Ma quali sono i vantaggi e gli svantaggi di affidarsi a un ambiente di sviluppo online? Gli stessi offerti da un ambiente di produttività come Google Documents.
&lt;/p&gt;

&lt;h3&gt;
  Accessibilità
&lt;/h3&gt;

&lt;p&gt;
  Possiamo accedere al nostro ambiente di lavoro da qualunque località nel mondo. Bastano un accesso internet e un browser per metterci al lavoro. Siamo a Bangkok e abbiamo un paio di ore a disposizione? Entriamo in un internet cafe e pochi minuti dopo stiamo scrivendo codice o revisionando il lavoro dei colleghi. Il che ci porta al prossimo punto.
&lt;/p&gt;

&lt;h3&gt;
  Collaborazione e condivisione semplificate
&lt;/h3&gt;

&lt;p&gt;
  Nei progetti più importanti è spesso necessario installare strumenti di gestione e controllo dei team di sviluppo. Il codice sorgente memorizzato su un server remoto e accessibile a chiunque rende collaborazione e condivisione del codice più semplice. Tutte le cloud IDE promettono il supporto per team di sviluppo.
&lt;/p&gt;

&lt;h3&gt;
  Indipendenza dalla piattaforma hardware
&lt;/h3&gt;

&lt;p&gt;
  Con le cloud IDE scriviamo codice in un web browser. Compilazione, linking e debugging sono processi svolti su una macchina remota che (si suppone) offrirà prestazioni adeguate al compito. Trovarsi momentaneamente su un computer poco performante non sarà un problema. Sviluppare su computers diversi (Mac a casa e PC in ufficio, per esempio) non comporterà differenze sostanziali.
&lt;/p&gt;

&lt;h3&gt;
  Riservatezza
&lt;/h3&gt;

&lt;p&gt;
  Il nostro codice sarà memorizzato su un dispositivo sul quale non potremo esercitare un controllo assoluto. Difficilmente avremo garanzia di totale riservatezza. Applicazioni particolarmente delicate non potranno probabilmente essere sviluppate &lt;em&gt;sulle nuovole &lt;/em&gt;anche se servizi di successo come &lt;strong&gt;&lt;a href=&quot;https://github.com/&quot;&gt;GitHub&lt;/a&gt; &lt;/strong&gt;offrono supporto a progetti open source e privati garantendo a questi ultimi la riservatezza necessaria.
&lt;/p&gt;

&lt;h3&gt;
  Sicurezza
&lt;/h3&gt;

&lt;p&gt;
  Che succede se il mio codice sorgente viene perduto in seguito a un guasto hardware del sistema remoto che lo ospita? L&amp;#8217;affidabilità è senz&amp;#8217;altro un aspetto delicato e costituisce uno dei deterrenti all&amp;#8217;adozione dei sistemi di cloud computing in generale. Affidare i nostri codici a terzi non ci impedirebbe di conservarne copie locali. Come già successo per i sistemi di &lt;a href=&quot;http://it.wikipedia.org/wiki/Cloud-storage&quot;&gt;cloud storage&lt;/a&gt;, i servizi di cloud development dovranno offrire elevati standard di sicurezza e affidabilità.
&lt;/p&gt;

&lt;h2&gt;
  Conclusioni
&lt;/h2&gt;

&lt;p&gt;
  Lo sviluppo di applicazioni &lt;em&gt;sulle nuvole&lt;/em&gt; è senz&amp;#8217;altro una prospettiva affascinante che presto sarà di attualità. Non sono poche le perplessità degli sviluppatori, soprattutto negli ambienti &lt;em&gt;enterprise&lt;/em&gt; o nei settori nei quali la riservatezza è un elemento determinante. Le applicazioni web saranno le prime implementate con queste tecnologie, per le altre bisognerà probabilmente attendere a lungo.
&lt;/p&gt;

&lt;h4&gt;
  Approfondimenti
&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/&quot;&gt;Introducing Orion&lt;/a&gt;, di Mike Milinkovich
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://borisoneclipse.blogspot.com/2011/01/orion.html&quot;&gt;Orion&lt;/a&gt;, di Boris Bukowski
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://jaxenter.com/eclipse-orion-the-new-ide-paradigm-33431.html&quot;&gt;Eclipse Orion: The New IDE Paradigm&lt;/a&gt;, intervista a B. Bukowski
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://www.i-programmer.info/news/90-tools/1872-mozilla-and-eclipse-take-programming-into-the-cloud.html&quot;&gt;Mozilla and Eclipse take programming into the cloud&lt;/a&gt;, di Mike James
  &lt;/li&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://dotnet.dzone.com/articles/online-ides-%E2%80%93-perspectives&quot;&gt;Online IDEs – perspectives?&lt;/a&gt; Di Den Delimarsky
  &lt;/li&gt;
&lt;/ul&gt;
</code></pre>]]></content:encoded>
    </item>
    <item>
      <title>La banda larga simmetrica porterà Internet fuori dal medioevo</title>
      <link>https://nicolaiarocci.com/la-banda-larga-simmetrica-portera-internet-fuori-dal-medioevo/</link>
      <pubDate>Wed, 26 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/la-banda-larga-simmetrica-portera-internet-fuori-dal-medioevo/</guid>
      <description>&lt;p&gt;In questa bella intervista &lt;strong&gt;&lt;a href=&#34;http://www.gaspartorriero.it/&#34;&gt;Gaspar Torriero&lt;/a&gt;&lt;/strong&gt; discute con &lt;a href=&#34;http://eraclito.telecomitaliahub.it/2011/01/tempo-stimato-25-anni/&#34;&gt;Massimo Mantellini&lt;/a&gt; dell’importanza della &lt;strong&gt;banda larga simmetrica&lt;/strong&gt;. Secondo Torriero ci troviamo ancora nel medioevo della Rete e la simmetria delle connessioni sarà la chiave che aprirà la porta a un futuro in gran parte ancora inimmaginabile. Dieci minuti ben spesi:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>In questa bella intervista <strong><a href="http://www.gaspartorriero.it/">Gaspar Torriero</a></strong> discute con <a href="http://eraclito.telecomitaliahub.it/2011/01/tempo-stimato-25-anni/">Massimo Mantellini</a> dell’importanza della <strong>banda larga simmetrica</strong>. Secondo Torriero ci troviamo ancora nel medioevo della Rete e la simmetria delle connessioni sarà la chiave che aprirà la porta a un futuro in gran parte ancora inimmaginabile. Dieci minuti ben spesi:</p>]]></content:encoded>
    </item>
    <item>
      <title>Humans TXT – Il robots.txt per gli esseri umani</title>
      <link>https://nicolaiarocci.com/humans-txt-il-robots-txt-per-gli-esseri-umani/</link>
      <pubDate>Sun, 23 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/humans-txt-il-robots-txt-per-gli-esseri-umani/</guid>
      <description>&lt;p&gt;**&lt;!-- raw HTML omitted --&gt;**Introdotta dallo slogan &lt;em&gt;Siamo Uomini Non Macchine&lt;/em&gt;, &lt;!-- raw HTML omitted --&gt;Humans TXT&lt;!-- raw HTML omitted --&gt; è una iniziativa che consente di conoscere gli autori di un sito web. Per ragioni di immagine i committenti sono spesso &lt;!-- raw HTML omitted --&gt;riluttanti&lt;!-- raw HTML omitted --&gt; a consentire che sulle loro homepage appaiano i nomi degli autori. Non sempre è evidente chi ha sviluppato un sito, cosa certo non gradita all’autore che avrebbe tutto il diritto (e l’interesse) di &lt;strong&gt;firmare&lt;/strong&gt; le proprie opere.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>**<!-- raw HTML omitted -->**Introdotta dallo slogan <em>Siamo Uomini Non Macchine</em>, <!-- raw HTML omitted -->Humans TXT<!-- raw HTML omitted --> è una iniziativa che consente di conoscere gli autori di un sito web. Per ragioni di immagine i committenti sono spesso <!-- raw HTML omitted -->riluttanti<!-- raw HTML omitted --> a consentire che sulle loro homepage appaiano i nomi degli autori. Non sempre è evidente chi ha sviluppato un sito, cosa certo non gradita all’autore che avrebbe tutto il diritto (e l’interesse) di <strong>firmare</strong> le proprie opere.</p>
<h2 id="cosa-è-humanstxt">Cosa è Humans.txt?</h2>
<p>Un semplice file di testo che contiene informazioni sulle persone che hanno contribuito alla costruzione del sito. Il file non è intrusivo e non causa <!-- raw HTML omitted -->decadimento delle <!-- raw HTML omitted -->prestazioni perché collocato all’esterno della gerarchia del sito vero e proprio. Viene salvato nella web root, proprio là dove di solito risiede il <a href="http://it.wikipedia.org/wiki/Robots.txt"><em>robots.txt</em></a>. Se consentito dal committente si potrebbe aggiungere un riferimento nella homepage:</p>
<!-- raw HTML omitted -->
<p>Nel file si può indicare più di un nome: il programmatore, il designer, il copywriter, il web master, il SEO/SEM, eventuali dediche. Le possibilità sono tante quante sono le persone che normalmente intervengono nella creazione di un sito. Potremmo immaginare <em>humans.txt</em> come l’equivalente della sigla di una trasmissione televisiva, oppure di un film.</p>
<h2 id="alla-ricerca-di-uno-standard">Alla ricerca di uno standard</h2>
<p>Gli autori dell’iniziativa propongono delle <a href="http://humanstxt.org/humans.txt"><strong>linee guida</strong></a> per la compilazione del file <em>humans.txt</em> e si dicono pronti ad accettare suggerimenti da chiunque. L’idea di standardizzare il contenuto del file è senz’altro valida perché consentirebbe, tra le altre cose, la creazione di tools di ricerca e certificazione. Pensate per esempio a una estensione del browser che consenta di vedere i <em>credits</em> del sito che stiamo visitando. Ci sono parecchie possibilità di applicazione da esplorare.</p>
<h2 id="una-iniziativa-superflua">Una iniziativa superflua?</h2>
<p>Lo standard HTML <a href="http://www.w3.org/TR/html401/struct/global.html#h-7.4.4.2">contempla già</a> un tag Meta Name per l’autore. Si tratta di un elemento opzionale e non indicizzato dai motori di ricerca. Il problema con questo tag è che il committente potrebbe non gradirlo. Lo standard prevede di indicare un solo autore mentre, come abbiamo visto, <!-- raw HTML omitted -->in<!-- raw HTML omitted --> <em>humans.txt</em> possiamo indicare più persone. Le due soluzioni possono coesistere, dando spazio a soluzioni interessanti: <!-- raw HTML omitted -->un’agenzia potrebbe inserire <!-- raw HTML omitted -->il proprio nome nel meta tag ed elencare i membri del team in <em>humans.txt</em>. La discussione comunque <a href="http://news.ycombinator.com/item?id=2131692">è piuttosto accesa</a>. C’è chi ritiene superflua l’iniziativa. Ci sono i soliti complottisti che vedono dietro a tutto questo chissà quale oscura manovra a fin di lucro e c’è infine chi ci vuol credere davvero sostenendo i ragazzi spagnoli che hanno messo in piedi il progetto.</p>
<h2 id="comincia-subito">Comincia subito</h2>
<p>Niente impedisce di aderire all’iniziativa già da ora. Deposita il tuo <em>humans.txt</em> nella root del tuo sito e sei a bordo. E’ anche possibile <a href="http://humanstxt.org/Im-human.php">inviare il proprio file</a> <em>humans.txt</em> agli autori dell’iniziativa i quali sostengono di voler compilare una lista globale che, stranamente, al momento non è consultabile. Ho chiesto loro come mai. La riposta è stata <em>we’re looking to create something “different” to show humans</em>. Qualcosa bolle in pentola.</p>]]></content:encoded>
    </item>
    <item>
      <title>BE-Wizard 2011 porta in Italia i guru di SEO e Web Marketing</title>
      <link>https://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/</link>
      <pubDate>Wed, 19 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/be-wizard-2011-porta-in-italia-i-guru-di-seo-e-web-marketing/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://www.be-wizard.com&#34;&gt;&lt;!-- raw HTML omitted --&gt;&lt;/a&gt;I giorni 11 e 12 marzo parteciperò a &lt;!-- raw HTML omitted --&gt;BE-Wizard 2011&lt;!-- raw HTML omitted --&gt;, evento SEO e Web Marketing dal programma molto ricco e interessante. Tra i relatori celebrità internazionali come &lt;a href=&#34;http://www.seomoz.org/team/randfish&#34;&gt;Rand Fishkin&lt;/a&gt; (SEOmoz), &lt;a href=&#34;http://www.kaushik.net/avinash/about&#34;&gt;Avinash Kaushik&lt;/a&gt; (Google), &lt;a href=&#34;http://www.tandlerdoerjepartner.com/&#34;&gt;Marcus Tandler &amp;amp; Nils Döerje&lt;/a&gt; (Tandler &amp;amp; Döerje Partners) e &lt;a href=&#34;http://www.distilled.co.uk/company/people/tom-critchlow.html&#34;&gt;Tom Critchlow&lt;/a&gt; (Distilled). Chi lavora nell’ambito SEO/SEM riconoscerà senz’altro questi nomi, Fishkin e Kaushik sono stelle di prima grandezza (di Kaushik raccomando senz’altro &lt;a href=&#34;http://www.webanalytics20.com/&#34;&gt;Web Analytics 2.0&lt;/a&gt;, uscito recentemente anche &lt;a href=&#34;http://www.amazon.it/Analytics-Misurare-successo-nellera-Internet/dp/882034498X/ref=sr_1_2?ie=UTF8&amp;amp;qid=1295446745&amp;amp;sr=8-2&#34;&gt;in italiano&lt;/a&gt;).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><a href="http://www.be-wizard.com"><!-- raw HTML omitted --></a>I giorni 11 e 12 marzo parteciperò a <!-- raw HTML omitted -->BE-Wizard 2011<!-- raw HTML omitted -->, evento SEO e Web Marketing dal programma molto ricco e interessante. Tra i relatori celebrità internazionali come <a href="http://www.seomoz.org/team/randfish">Rand Fishkin</a> (SEOmoz), <a href="http://www.kaushik.net/avinash/about">Avinash Kaushik</a> (Google), <a href="http://www.tandlerdoerjepartner.com/">Marcus Tandler &amp; Nils Döerje</a> (Tandler &amp; Döerje Partners) e <a href="http://www.distilled.co.uk/company/people/tom-critchlow.html">Tom Critchlow</a> (Distilled). Chi lavora nell’ambito SEO/SEM riconoscerà senz’altro questi nomi, Fishkin e Kaushik sono stelle di prima grandezza (di Kaushik raccomando senz’altro <a href="http://www.webanalytics20.com/">Web Analytics 2.0</a>, uscito recentemente anche <a href="http://www.amazon.it/Analytics-Misurare-successo-nellera-Internet/dp/882034498X/ref=sr_1_2?ie=UTF8&amp;qid=1295446745&amp;sr=8-2">in italiano</a>).</p>
<h2 id="il-programma">Il programma</h2>
<p>Il <a href="http://www.be-wizard.com/ita-programma.php">programma</a> prevede le conferenze dei Big Speakers nella prima giornata e gli approfondimenti tecnici (E-Commerce o Turismo) nella seconda. Per quest’ultima è già disponibile l’elenco degli argomenti trattati mentre per la prima bisognerà attendere ancora qualche giorno. Qui riporto il programma della sessione E-Commerce, quella a cui parteciperò io:</p>
<ul>
<li>Introduzione agli strumenti per la promozione online</li>
<li>E-commerce e diritto</li>
<li>E-commerce con eBay e altri marketplaces</li>
<li>Social Networks &amp; Web Analytics 2.0</li>
<li>Case History Keyword Advertising</li>
<li>Intervista/Testimonianza</li>
<li>Case History e-mail marketing</li>
<li>Case history SEO da “oltreoceano”</li>
<li>Strategie SEO e SEM</li>
</ul>
<h2 id="incontriamoci">Incontriamoci!</h2>
<p>Questi eventi in genere sono ottime occasioni per fare nuove conoscenze e scambiarsi opinioni ed esperienze. Se qualcuno dei lettori di questo sito prevede di partecipare me lo faccia sapere, magari organizziamo <strong>due chiacchiere</strong> davanti a un caffè o un aperitivo!</p>
<p><em>Potrebbe sembrare il contrario, ma vi assicuro che n<!-- raw HTML omitted -->on sono coinvolto in alcun modo nella organizzazione o promozione di questo evento.<!-- raw HTML omitted --></em></p>]]></content:encoded>
    </item>
    <item>
      <title>Come aumentare del 250% la conversion rate del tuo sito</title>
      <link>https://nicolaiarocci.com/come-aumentare-del-250-la-conversion-rate-del-tuo-sito/</link>
      <pubDate>Sun, 16 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/come-aumentare-del-250-la-conversion-rate-del-tuo-sito/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Nel web marketing il &lt;strong&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Conversion_rate&#34;&gt;conversion rate&lt;/a&gt;&lt;/strong&gt; è la percentuale di visitatori unici che hanno effettuato l’operazione desiderata visitando il sito. L’azione desiderata potrebbe essere condurre vendite, effettuare acquisti, osservare una pagina chiave del sito, o altre azioni misurabili (fonte: &lt;em&gt;wikipedia&lt;/em&gt;)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;E’ possibile &lt;strong&gt;aumentare del 250% il conversione rate&lt;/strong&gt; grazie a una sola, banale modifica al sito? I signori di &lt;a href=&#34;http://www.kajabiapp.com/&#34;&gt;Kajabi&lt;/a&gt; sostengono di esserci riusciti nel corso di un esperimento durato una settimana. La loro home page è organizzata in modo da convogliare l’attenzione del visitatore su un unico, grande pulsante che invita il visitatore a consultare le tariffe del servizio offerto in abbonamento. Lasciando invariato il resto della pagina hanno ritoccato il contenuto del pulsante, registrando poi il numero di click ottenuti in un dato periodo di tempo. Il ciclo è stato ripetuto quattro volte, ogni volta con un testo diverso. Ecco come è andata:&lt;/p&gt;</description>
      <content:encoded><![CDATA[<blockquote>
<p>Nel web marketing il <strong><a href="http://en.wikipedia.org/wiki/Conversion_rate">conversion rate</a></strong> è la percentuale di visitatori unici che hanno effettuato l’operazione desiderata visitando il sito. L’azione desiderata potrebbe essere condurre vendite, effettuare acquisti, osservare una pagina chiave del sito, o altre azioni misurabili (fonte: <em>wikipedia</em>)</p></blockquote>
<p>E’ possibile <strong>aumentare del 250% il conversione rate</strong> grazie a una sola, banale modifica al sito? I signori di <a href="http://www.kajabiapp.com/">Kajabi</a> sostengono di esserci riusciti nel corso di un esperimento durato una settimana. La loro home page è organizzata in modo da convogliare l’attenzione del visitatore su un unico, grande pulsante che invita il visitatore a consultare le tariffe del servizio offerto in abbonamento. Lasciando invariato il resto della pagina hanno ritoccato il contenuto del pulsante, registrando poi il numero di click ottenuti in un dato periodo di tempo. Il ciclo è stato ripetuto quattro volte, ogni volta con un testo diverso. Ecco come è andata:</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="l8217importanza-del-giusto-messaggio">L’importanza del giusto messaggio</h2>
<!-- raw HTML omitted -->
<h2 id="un-pò-di-prudenza-non-guasta">Un pò di prudenza non guasta</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Eric Meyer aggiorna il suo famoso CSS Reset</title>
      <link>https://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/</link>
      <pubDate>Thu, 13 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/eric-meyer-aggiorna-il-suo-famoso-css-reset/</guid>
      <description>&lt;p&gt;Quattro anni fa Eric Meyer pubblicò la prima versione del suo CSS
Reset. Concepito come un prototipo da condividere con altri
sviluppatori dediti alla creazione di uno standard, il modulo riscosse subito
grande successo diffondendosi rapidamente. In poche settimane venne adottato,
spesso inconsapevolmente, da decine di migliaia di programmatori e designer
web. Oggi gran parte dei siti web nel mondo includono nel loro codice almeno
una traccia di quello che è universalmente noto come Eric Meyer
Reset.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Quattro anni fa Eric Meyer pubblicò la prima versione del suo CSS
Reset. Concepito come un prototipo da condividere con altri
sviluppatori dediti alla creazione di uno standard, il modulo riscosse subito
grande successo diffondendosi rapidamente. In poche settimane venne adottato,
spesso inconsapevolmente, da decine di migliaia di programmatori e designer
web. Oggi gran parte dei siti web nel mondo includono nel loro codice almeno
una traccia di quello che è universalmente noto come Eric Meyer
Reset.</p>
<h2 id="una-evoluzione-continua">Una evoluzione continua</h2>
<p>I piccoli problemi e le nuove incompatibilità che inevitabilmente accompagnano
ogni aggiornamento dei browser esistenti, nonché le uscite di quelli nuovi
(Google Chrome su tutti) costringono spesso a rivedere fogli di stile e codice
JavaScript. Così nel tempo altri programmatori  hanno dato il loro contribuito
proponendo variazioni e aggiornamenti al tema originale. Ci sono poi le nuove
tecnologie che si affacciano sulla scena; una delle revisoni più famose del
Eric Mayer Reset è infatti l’<a href="http://html5doctor.com/html-5-reset-stylesheet/"><strong>HTML5 Reset Stylesheet</strong></a>.</p>
<h2 id="eric-meyer-reset-versione-2011"><strong>Eric Meyer Reset versione 2011</strong></h2>
<p>Ed ecco che a sopresa lo stesso Meyer torna sulla scena proponendo
l’<a href="http://meyerweb.com/eric/thoughts/2011/01/03/reset-revisited/">ultima incarnazione</a> del suo CSS Reset. Questo aggiornamento prende
spunto dall’<a href="http://meyerweb.com/eric/tools/css/reset/">originale</a> ma tiene conto anche del lavoro svolto nel
frattempo dalla comunità, a partire proprio dal <a href="http://html5doctor.com/html-5-reset-stylesheet/">HTML5 Reset</a>. Ecco il nuovo
codice:</p>
<pre><code>/* http://meyerweb.com/eric/tools/css/reset/
v2.0b1 | 201101
NOTE: WORK IN PROGRESS
USE WITH CAUTION AND TEST WITH ABANDON */

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    outline: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}

/* remember to define visible focus styles!
:focus {
    outline: ?????;
} */

/* remember to highlight inserts somehow! */
ins {
    text-decoration: none;
}
del {
    text-decoration: line-through;
}

table {
    border-collapse: collapse;
    border-spacing: 0;
}
</code></pre>
<p>Come annotato a caratteri cubitali nelle note iniziali ci troviamo di fronte
a un lavoro non ancora definitivo. Sarà mia cura segnalare eventuali
aggiornamenti, tuttavia una prima occhiata al codice fa pensare che questa
prima stesura sia già valida.</p>
<h2 id="ne-vale-la-pena">Ne vale la pena?</h2>
<p>C’è un discussione in corso da tempo tra chi <a href="http://covertprestige.info/css/base-stylesheet/">sostiene</a> che tutto
sommato il CSS Reset non sia necessario e chi, al contrario, lo difende a spada
stratta. Non risolve certo tutti i problemi di compatibilità tra browsers ma
senz’altro CSS Reset contribuisce a ridurne sensibilmente il numero. Per
approfondire l’argomento puoi cominciare dando una occhiata a <a href="http://sixrevisions.com/css/should-you-reset-your-css/">Should You
Reset Your CSS?</a> (Six Revisions) e leggendo le opinioni degli utenti di
<a href="http://stackoverflow.com/questions/167531/is-it-ok-to-use-a-css-reset-stylesheet">Stack Overflow</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Python vince il TIOBE Programming Language Award 2010</title>
      <link>https://nicolaiarocci.com/python-vince-il-tiobe-programming-language-award-2010/</link>
      <pubDate>Mon, 10 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-vince-il-tiobe-programming-language-award-2010/</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;!-- raw HTML omitted --&gt;Python&lt;/strong&gt; è il &lt;strong&gt;&lt;a href=&#34;http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html&#34;&gt;Linguaggio di Programmazione del 2010&lt;/a&gt;&lt;/strong&gt;. Il riconoscimento viene assegnato da &lt;a href=&#34;http://www.tiobe.com/&#34;&gt;TIOBE&lt;/a&gt; al linguaggio di programmazione che ha conquistato più quote di mercato nel corso dell’anno. La crescita di Python è stata +1.81% da gennaio 2010, di poco superiore al risultato  di Objective-C (+1.63%), secondo classificato. Objective-C è il linguaggio usato nello sviluppo di applicazioni iPhone e IPad; è andato molto bene nella prima parte dell’anno ma ha perso quote negli ultimi mesi.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><strong><!-- raw HTML omitted -->Python</strong> è il <strong><a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Linguaggio di Programmazione del 2010</a></strong>. Il riconoscimento viene assegnato da <a href="http://www.tiobe.com/">TIOBE</a> al linguaggio di programmazione che ha conquistato più quote di mercato nel corso dell’anno. La crescita di Python è stata +1.81% da gennaio 2010, di poco superiore al risultato  di Objective-C (+1.63%), secondo classificato. Objective-C è il linguaggio usato nello sviluppo di applicazioni iPhone e IPad; è andato molto bene nella prima parte dell’anno ma ha perso quote negli ultimi mesi.</p>
<h2 id="non-solo-web-e-scripting">Non solo web e scripting</h2>
<p>TIOBE sottolinea come in questi anni Python sia diventato il linguaggio standard per lo scripting, sostituendo di fatto Perl. Da questo ambito tutto sommato ristretto negli ultimi anni Python si è diffuso in molti altri campi, primo fra tutti il web, dove ha riscosso grande successo anche grazie al framework <a href="http://www.djangoproject.com/"><strong>Django</strong></a>. Python è facile da imparare e molte università lo stanno adottando come linguaggio principale per l’insegnamento della programmazione. Tra i <a href="http://www.python.org/about/quotes/">grandi nomi che sviluppano in Python</a> ricordo Google, YouTube, il gioco multiplayer EVE Online, la NASA.</p>
<h2 id="il-tiobe-index-come-strumento-strategico">Il TIOBE Index come strumento strategico</h2>
<p>Il TIOBE Programming Community index è un indicatore annuale della popolarità dei linguaggi di programmazione. La classifica è calcolata tenendo conto anche dei giudizi espressi da ingegneri  e sviluppatori di chiara fama, oltre che tracciando i risultati di corsi di addestramento tenuti in tutto il mondo. I risultati forniti dai motori di ricerca più importanti (Google, MSN, Yahoo!, Wikipedia e YouTube) vengono a loro volta inclusi nell’elaborazione della classifica.</p>
<p>TIOBE non è un indice che tenta di individuare il <em>migliore</em> linguaggio di programmazione, serve piuttosto a indicare quali sono le tendenze in corso a livello planetario. Si tratta di una valida risorsa per verificare l’attualità delle proprie competenze e per pianificare strategicamente i prossimi linguaggi di programmazione su cui investire. Come spunto di riflessione consiglio caldamente la lettura del celebre <a href="http://invece.org/translations/pparadox.html"><strong>Paradosso di Python</strong></a>, formulato da <a href="http://www.paulgraham.com/">Paul Graham</a> nell’ormai lontano 2004. Forse i tempi stanno cambiando?</p>
<h2 id="l8217ultimo-decennio-chi-sale-e-chi-scende">L’ultimo decennio: chi sale e chi scende</h2>
<!-- raw HTML omitted -->
<pre><code>&lt;p class=&quot;wp-caption-text&quot;&gt;
  Andamento dell'indice TIOBE nell'ultimo decennio (2000-2010)
&lt;/p&gt;
</code></pre>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Oltre il 50% degli utenti web ora supporta il formato video HTML5</title>
      <link>https://nicolaiarocci.com/oltre-il-50-degli-utenti-web-ora-supporta-il-formato-video-html5/</link>
      <pubDate>Sat, 08 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/oltre-il-50-degli-utenti-web-ora-supporta-il-formato-video-html5/</guid>
      <description>&lt;p&gt;Proprio ieri in &lt;a href=&#34;http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/&#34;&gt;Adobe Flash è una Pessima Idea&lt;/a&gt; concludevo sostenendo che l’adozione dei nuovi standard HTML5 e CSS3 sarà molto più rapida di quanto non si immagini. Nemmeno ventiquattro ore dopo ecco la notizia che &lt;a href=&#34;http://videojs.com/2011/01/html5-video-statistics/&#34;&gt;&lt;strong&gt;oltre il 50% degli utenti web supporta già il formato video HTML5&lt;/strong&gt;&lt;/a&gt;. La fonte dei dati è &lt;a href=&#34;http://gs.statcounter.com/#browser_version-ww-daily-20101201-20101231&#34;&gt;StatCounter&lt;/a&gt;, ancora oggi una delle piattaforme più usate al mondo per tracciare la navigazione sui siti web.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Proprio ieri in <a href="http://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/">Adobe Flash è una Pessima Idea</a> concludevo sostenendo che l’adozione dei nuovi standard HTML5 e CSS3 sarà molto più rapida di quanto non si immagini. Nemmeno ventiquattro ore dopo ecco la notizia che <a href="http://videojs.com/2011/01/html5-video-statistics/"><strong>oltre il 50% degli utenti web supporta già il formato video HTML5</strong></a>. La fonte dei dati è <a href="http://gs.statcounter.com/#browser_version-ww-daily-20101201-20101231">StatCounter</a>, ancora oggi una delle piattaforme più usate al mondo per tracciare la navigazione sui siti web.</p>
<h2 id="html5-in-rapida-diffusione">HTML5 in rapida diffusione</h2>
<h2 id="span-stylefont-weight-normalspan"><!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<h2 id="span-stylefont-weight-normal-font-size-13pxp"><!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->]]></content:encoded>
    </item>
    <item>
      <title>Adobe Flash è una Pessima Idea</title>
      <link>https://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/</link>
      <pubDate>Thu, 06 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/flash-adobe-e-una-pessima-idea/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘&lt;a href=&#34;http://en.wikipedia.org/wiki/Adobe_Flash&#34;&gt;multimedia platform&lt;/a&gt;‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘<a href="http://en.wikipedia.org/wiki/Adobe_Flash">multimedia platform</a>‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.</p>
<p>Eppure ci sono tante buone ragioni per <strong>non</strong> ricorrere a Flash:</p>
<ol>
<li>Non è sicuro. Probabilmente Flash è l’unico prodotto che fa concorrenza a Microsoft Windows in quanto a numero di <em>security fixes</em>. Non per niente è stato definito <a href="http://www.zdnet.com/blog/bott/how-secure-is-flash-heres-what-adobe-wont-tell-you/2152">il nuovo Windows Vista</a></li>
<li>E’ una tecnologia obsoleta, che si affida pesantemente ai plugin di terze parti (vedi alla voce sicurezza)</li>
<li>Rende lenta l’apertura delle pagine web, a meno che non si intervenga con ottimizzazioni ad-hoc</li>
<li>Consuma molta, troppa memoria</li>
<li>Richiede un forte impegno della CPU</li>
<li>Sui dispositivi portatili consuma velocemente la batteria</li>
<li>Non è supportato sui dispositivi iOS/Apple (iPhone, iPad)</li>
<li>Gira comunque male su buona parte degli altri dispositivi portatili, SmartPhones soprattutto</li>
<li>Ha seri problemi di compatibilità e prestazioni su piattaforme Mac/OSX</li>
<li>Molti utenti e (soprattutto) aziende bloccano Flash sui loro browsers proprio a causa dei problemi di sicurezza, stabilità e prestazioni</li>
<li>I contenuti Flash non sono facili da archiviare. Gli utenti medi hanno grosse difficoltà a salvare copie locali delle pagine. I servizi tipo <a href="http://www.archive.org/">Internet Archive</a> non riescono a memorizzare il sito</li>
<li>Flash è il nemico numero uno dei motori di ricerca. Google, Bing e gli altri hanno da sempre grosse difficoltà ad indicizzarne i contenuti</li>
<li>Flash rende problematica, quando non impossibile, l’ottimizzazione ai fini del posizionamento sui motori di ricerca (SEO)</li>
<li>E’ un sistema proprietario chiuso</li>
</ol>
<p>E’ vero che ricorrendo a ottimizzazioni e tools dedicati alcune (poche) di queste limitazioni possono essere aggirate. Le prossime release di Flash promettono sviluppi interessanti, tra i quali ottimizzazioni per i dispositivi mobili e riduzione del peso dell’intera infrastruttura.</p>
<h2 id="considera-le-alternative"><strong>Considera le alternative</strong></h2>
<p>Non sono necessarie soluzioni esoteriche. Troppo spesso si ricorre a Flash per produrre effetti, transizioni e animazioni realizzabili anche con strumenti consolidati, leggeri e SEO-friendly quali <strong>JavaScript</strong>, <strong>HTML</strong> e <strong>CSS.</strong> In una parola, <strong><a href="http://it.wikipedia.org/wiki/AJAX">AJAX</a></strong>. Cose ormai scontate. O forse no, a giudicare da quel che ancora oggi si pubblica in rete. A ben guardare la battaglia tra Apple e Adobe, quella culminata con la [<!-- raw HTML omitted -->E’ incredibile la quantità di siti che ancora oggi vengono sviluppati con Flash. Il fenomeno colpisce soprattutto i siti-vetrina: negozi, attività commerciali, ristoranti, artigiani. Basta farsi un giro sui siti di venditori di mobili, per esempio, per godersi il trionfo della ‘<a href="http://en.wikipedia.org/wiki/Adobe_Flash">multimedia platform</a>‘ di Adobe. Bisogna prenderne atto: nel 2011 migliaia di aziende italiane di ogni dimensione affidano la loro identità web ad Adobe Flash. Consulenti e agenzie continuano a produrre siti con tecnologie assimilate anni fa. Reticenti all’aggiornamento delle proprie competenze, si accontentano del loro confortante orticello che, tutto sommato, assicura lo stipendio.</p>
<p>Eppure ci sono tante buone ragioni per <strong>non</strong> ricorrere a Flash:</p>
<ol>
<li>Non è sicuro. Probabilmente Flash è l’unico prodotto che fa concorrenza a Microsoft Windows in quanto a numero di <em>security fixes</em>. Non per niente è stato definito <a href="http://www.zdnet.com/blog/bott/how-secure-is-flash-heres-what-adobe-wont-tell-you/2152">il nuovo Windows Vista</a></li>
<li>E’ una tecnologia obsoleta, che si affida pesantemente ai plugin di terze parti (vedi alla voce sicurezza)</li>
<li>Rende lenta l’apertura delle pagine web, a meno che non si intervenga con ottimizzazioni ad-hoc</li>
<li>Consuma molta, troppa memoria</li>
<li>Richiede un forte impegno della CPU</li>
<li>Sui dispositivi portatili consuma velocemente la batteria</li>
<li>Non è supportato sui dispositivi iOS/Apple (iPhone, iPad)</li>
<li>Gira comunque male su buona parte degli altri dispositivi portatili, SmartPhones soprattutto</li>
<li>Ha seri problemi di compatibilità e prestazioni su piattaforme Mac/OSX</li>
<li>Molti utenti e (soprattutto) aziende bloccano Flash sui loro browsers proprio a causa dei problemi di sicurezza, stabilità e prestazioni</li>
<li>I contenuti Flash non sono facili da archiviare. Gli utenti medi hanno grosse difficoltà a salvare copie locali delle pagine. I servizi tipo <a href="http://www.archive.org/">Internet Archive</a> non riescono a memorizzare il sito</li>
<li>Flash è il nemico numero uno dei motori di ricerca. Google, Bing e gli altri hanno da sempre grosse difficoltà ad indicizzarne i contenuti</li>
<li>Flash rende problematica, quando non impossibile, l’ottimizzazione ai fini del posizionamento sui motori di ricerca (SEO)</li>
<li>E’ un sistema proprietario chiuso</li>
</ol>
<p>E’ vero che ricorrendo a ottimizzazioni e tools dedicati alcune (poche) di queste limitazioni possono essere aggirate. Le prossime release di Flash promettono sviluppi interessanti, tra i quali ottimizzazioni per i dispositivi mobili e riduzione del peso dell’intera infrastruttura.</p>
<h2 id="considera-le-alternative-1"><strong>Considera le alternative</strong></h2>
<p>Non sono necessarie soluzioni esoteriche. Troppo spesso si ricorre a Flash per produrre effetti, transizioni e animazioni realizzabili anche con strumenti consolidati, leggeri e SEO-friendly quali <strong>JavaScript</strong>, <strong>HTML</strong> e <strong>CSS.</strong> In una parola, <strong><a href="http://it.wikipedia.org/wiki/AJAX">AJAX</a></strong>. Cose ormai scontate. O forse no, a giudicare da quel che ancora oggi si pubblica in rete. A ben guardare la battaglia tra Apple e Adobe, quella culminata con la]<a href="http://www.apple.com/hotnews/thoughts-on-flash/">5</a> con la quale Steve Jobs in persona spiegava i motivi della rinuncia di Apple alla tecnologia Flash, è cosa recente.</p>
<h2 id="investire-nel-futuro">Investire nel futuro</h2>
<p>Le versioni più aggiornate dei browsers moderni (Firefox, Chorme, Safari, Opera e l’ormai imminente <a href="http://windows.microsoft.com/ie9">Internet Explorer 9</a>) supportano ampiamente i nuovi standard <a href="http://it.wikipedia.org/wiki/HTML5">HTML5</a> e <a href="http://www.w3.org/TR/css3-roadmap/">CSS3</a>. C’è chi ritiene che la loro certificazione sia <a href="http://ishtml5readyyet.com/">troppo lontana</a> e chi al contrario li ha <a href="http://radar.oreilly.com/2009/05/google-bets-big-on-html-5.html">adottati con entusiasmo</a>. Una cosa è certa:  <strong>questi sono gli standard del futuro</strong>. La rete si sta preparando da tempo ed è ricca di risorse e demo interessanti:</p>
<ul>
<li><a href="http://www.thewildernessdowntown.com/">The Wilderness Downtown</a>, splendida demo delle capacità di HTML5</li>
<li><a href="http://hi-pk.com/2010/12/10-cool-and-useful-html-5-tutorials/">10 Cool and Useful HTML 5 Tutorials</a></li>
<li><a href="http://thinkvitamin.com/code/23-essential-html-5-resources/">23 Essential HTML 5 Resources</a></li>
<li><a href="http://html5demos.com/">HTML5 Demos and Examples</a></li>
<li><a href="http://html5gallery.com/">HTML5 Gallery</a></li>
</ul>
<h2 id="span-stylefont-weight-normal-font-size-13pxda-un-punto-di-vista-professionale-vale-senz8217altro-la-pena-stronginvestire-fin-da-ora-tempo-e-risorse-nello-studio-di-html5-e-css3strong-l8217avvento-di-internet-explorer-9-aumenterà-rapidamente-il-numero-di-navigatoriem-html5-enabledem-tanto-che-l8217implementazione-di-siti-di-massa-con-queste-tecnologie-sarà-possibile-ben-prima-di-quanto-non-si-immaginispan"><!-- raw HTML omitted -->Da un punto di vista professionale vale senz’altro la pena <!-- raw HTML omitted -->investire fin da ora tempo e risorse nello studio di HTML5 e CSS3<!-- raw HTML omitted -->. L’avvento di Internet Explorer 9 aumenterà rapidamente il numero di navigatori<!-- raw HTML omitted --> HTML5-enabled<!-- raw HTML omitted -->; tanto che l’implementazione di siti di massa con queste tecnologie sarà possibile ben prima di quanto non si immagini.<!-- raw HTML omitted --></h2>]]></content:encoded>
    </item>
    <item>
      <title>E’ Python il linguaggio del 2011</title>
      <link>https://nicolaiarocci.com/python-e-il-linguaggio-del-2011/</link>
      <pubDate>Mon, 03 Jan 2011 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/python-e-il-linguaggio-del-2011/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;Qualche giorno &lt;a href=&#34;http://www.readwriteweb.com/hack/2010/12/hacker-poll-programming-languages-2011.php&#34;&gt;ReadWriteWeb&lt;/a&gt; ha chiesto ai suoi lettori quali sono i linguaggi di programmazione che pensano di studiare nel 2011. La selezione è piuttosto ampia e include buona parte i linguaggi attorno ai quali c’è fermento questi mesi (tra gli altri &lt;a href=&#34;http://clojure.org/&#34;&gt;Clojure&lt;/a&gt;, &lt;a href=&#34;http://golang.org/&#34;&gt;Go&lt;/a&gt;, &lt;a href=&#34;http://www.erlang.org/&#34;&gt;Erlang&lt;/a&gt;, &lt;a href=&#34;http://www.haskell.org/haskellwiki/Haskell&#34;&gt;Haskell&lt;/a&gt;). Ci si rivolge a programmatori esperti che hanno già maturato una certa esperienza, probabilmente per questo motivo sono esclusi alcuni grandi classici come il linguaggio C (è presente Java).&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted -->Qualche giorno <a href="http://www.readwriteweb.com/hack/2010/12/hacker-poll-programming-languages-2011.php">ReadWriteWeb</a> ha chiesto ai suoi lettori quali sono i linguaggi di programmazione che pensano di studiare nel 2011. La selezione è piuttosto ampia e include buona parte i linguaggi attorno ai quali c’è fermento questi mesi (tra gli altri <a href="http://clojure.org/">Clojure</a>, <a href="http://golang.org/">Go</a>, <a href="http://www.erlang.org/">Erlang</a>, <a href="http://www.haskell.org/haskellwiki/Haskell">Haskell</a>). Ci si rivolge a programmatori esperti che hanno già maturato una certa esperienza, probabilmente per questo motivo sono esclusi alcuni grandi classici come il linguaggio C (è presente Java).</p>
<p>Quali sono finora i linguaggi più gettonati?</p>
<ol>
<li>Python (14.5%)</li>
<li>Ruby (13.8%)</li>
<li>Node.js (9.53%)</li>
<li>ECMAScript (JavaScript, ActionScript) (8.15%)</li>
<li>Scala (8.01%)</li>
</ol>
<p><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><a href="http://python.org/">Python</a> al momento si gode il primo posto anche se <a href="http://www.ruby-lang.org/en/">Ruby</a> gli soffia sul collo e non sembra intenzionato a mollare l’osso. Al terzo posto, distanziato, l’interessantissimo progetto <a href="http://nodejs.org/">Node.js</a>. Curiosa la scelta di includerlo nella selezione dato che non è un linguaggio di programmazione in senso stretto. JavaScript si piazza appena fuori dal podio mentre al quinto posto troviamo il primo dei <em>new kids on the block,</em> <a href="http://www.scala-lang.org/">Scala</a>.</p>
<h2 id="linguaggi-script-alla-ribalta">Linguaggi script alla ribalta</h2>
<p>E’ presto per trarre conclusioni (il questionario è online da pochi giorni e il sondaggio è ancora in corso) ma balza all’occhio come nelle prime quattro posizioni ci siano linguaggi script non compilati, a conferma di quella che sembra essere la tendenza degli ultimi anni, almeno nel contesto delle startup web e dei giovani programmatori web-oriented che costituisce in buona parte il pubblico di riferimento di un sito come ReadWriteWeb.</p>
<h2 id="javascript-è-più-importante-di-quanto-si-pensi">JavaScript è più importante di quanto si pensi</h2>
<p>Uniti, Node.js e JavaScript balzano in vetta alla classifica. Il linguaggio JavaScript è sottovalutato da molti sviluppatori che si limitano a incollare brevi snippets per la manipolazione del <a href="http://en.wikipedia.org/wiki/Document_Object_Model">DOM</a> o la convalida di campi di input, ma le esigenze di interattività e reattività indurranno a spostare  l’implementazione dal server al client rendendo la conoscenza approfondita del linguaggio JavaScript sempre più determinante.</p>
<p>Presto dedicherò una serie di articoli a Python e proporrò alcuni approfondimenti su JavaScript. Rimani sintonizzato!</p>]]></content:encoded>
    </item>
    <item>
      <title>Come accorciare links e URL usando le API di Bit.ly via ASP.NET</title>
      <link>https://nicolaiarocci.com/accorciare-url-usando-bit-ly-via-asp-net/</link>
      <pubDate>Mon, 29 Nov 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/accorciare-url-usando-bit-ly-via-asp-net/</guid>
      <description>&lt;p&gt;&lt;!-- raw HTML omitted --&gt;Una delle applicazioni su cui sto lavorando in questo periodo manda decine di emails al giorno, ognuna contenente almeno un paio di links (URL). Questi link sono molto lunghi perché oltre all’indirizzo della pagina da aprire contengono una o più &lt;a href=&#34;http://en.wikipedia.org/wiki/Query_string&#34;&gt;query strings&lt;/a&gt;. In generale, per tante buone ragioni, le URL lunghe non sono mai una buona idea; ancor meno lo sono se  devono comparire in un messaggio email. Gli algoritmi di &lt;a href=&#34;http://en.wikipedia.org/wiki/Word_wrap&#34;&gt;word wrapping&lt;/a&gt; dei client di posta elettronica vanno in crisi quando sono costretti a inserire un ritorno di carrello nel bel mezzo della URL. Come biasimarli?&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p><!-- raw HTML omitted -->Una delle applicazioni su cui sto lavorando in questo periodo manda decine di emails al giorno, ognuna contenente almeno un paio di links (URL). Questi link sono molto lunghi perché oltre all’indirizzo della pagina da aprire contengono una o più <a href="http://en.wikipedia.org/wiki/Query_string">query strings</a>. In generale, per tante buone ragioni, le URL lunghe non sono mai una buona idea; ancor meno lo sono se  devono comparire in un messaggio email. Gli algoritmi di <a href="http://en.wikipedia.org/wiki/Word_wrap">word wrapping</a> dei client di posta elettronica vanno in crisi quando sono costretti a inserire un ritorno di carrello nel bel mezzo della URL. Come biasimarli?</p>
<p>Ci sono poi certi sistemi di web mail (quello di Libero, per non far nomi) che semplicemente non sono capaci di riprodurre correttamente un link o se lo fanno non attivano il link per ragioni di sicurezza, lasciando così al destinatario della mail il compito di copiare e incollare l’intera URL nel browser. Operazione non sempre banale per l’utente medio, soprattutto quando (guarda caso!) il testo da copiare e incollare è lunghissimo.</p>
<p>Si potrebbe risolvere banalmente ricorrendo agli <a href="http://www.w3schools.com/HTML/html_links.asp">anchor tag HTML</a> ma nel mio caso questa strada non è praticabile: i messaggi devono essere in puro testo. Non solo, questa soluzione non risolverebbe comunque il problema dei web mail client che non si fidano dei miei messaggi. Creare a priori URL brevi non è una opzione per ragioni di legacy (il sito non l’ho creato io!). Come fare allora?</p>
<h2 id="chiedere-aiuto-a-un-serviziourl-shortener">Chiedere aiuto a un servizio URL Shortener</h2>
<p>Gli <a href="http://it.wikipedia.org/wiki/URL_shortening">URL shortener</a> sono servizi molto usati in ambito social networking e non solo. Data una certa URL di qualunque lunghezza ne restituiscono una equivalente molto più breve. Pioniere in questo campo è stato TinyURL ma oggigiorno il servizio più diffuso e conosciuto è senz’altro <a href="http://bit.ly/">Bit.ly</a>, il quale ha l’indubbio vantaggio di offrire una <a href="http://it.wikipedia.org/wiki/Representational_State_Transfer">REST API</a> ricca, robusta e <a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation#bit.ly_API_Documentation">ben documentata</a>. Questa libreria gratuita consente ai programmatori indipendenti (noi) l’implementazione di servizi di URL shortening nelle proprie applicazioni.</p>
<p>Ecco dunque <strong>ShortenUrl</strong>, una semplice funzione ASP.NET che restituisce una URL breve a partire da una URL di qualunque lunghezza passata come parametro. Nel caso la chiamata alla API fallisca la funzione restituirà semplicemente una stringa vuota.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>La gran parte del lavoro è fatto da una sola linea di codice (ok, avrei potuto suddividerla in due o tre linee per amor di chiarezza, te lo concedo). La richiesta REST al servizio è eseguita da una istanza della classe <a href="http://msdn.microsoft.com/it-it/library/system.net.httpwebrequest(v=VS.90).aspx">HttpWebRequest</a>. Il <a href="http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/shorten">metodo Shorten</a> può restituire risultati in formato <a href="http://it.wikipedia.org/wiki/JSON">JSON</a>, <a href="http://it.wikipedia.org/wiki/XML">XML</a> o puro testo. Per semplicità ho scelto il formato testo. A seconda delle necessità potresti ricorrere al bellissimo formato JSON o al logorroico XML,  la documentazione ufficiale contiene esempi molto chiari anche per questi formati.</p>
<p>Se non disponi di un account Bit.ly dovrai <a href="http://bit.ly/a/sign_up">registrarti</a> (è gratis). Una volta creato l’account potrai recuperare facilmente la tua <a href="http://bit.ly/a/your_api_key">API Key personale</a>, indispensabile per poter effettuare chiamate ai metodi della libreria.</p>]]></content:encoded>
    </item>
    <item>
      <title>Programmazione Asincrona per C# e VB</title>
      <link>https://nicolaiarocci.com/programmazione-asincrona/</link>
      <pubDate>Fri, 29 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/programmazione-asincrona/</guid>
      <description>&lt;p&gt;Un articolo sul &lt;!-- raw HTML omitted --&gt;Somasegar’s Weblog&lt;!-- raw HTML omitted --&gt; annuncia oggi il rilascio imminente di un nuovo modello di programmazione asincrona per C# and VB:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Today, we are unveiling significant language and framework enhancements in C# and Visual Basic that enable developers to harness asynchrony, letting them retain the control flow from their synchronous code while developing responsive user interfaces and scalable web applications with greater ease.   This CTP delivers a lightweight asynchronous development experience as close to the standard synchronous paradigms as possible, while providing an easy on-ramp to the world of concurrency&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Un articolo sul <!-- raw HTML omitted -->Somasegar’s Weblog<!-- raw HTML omitted --> annuncia oggi il rilascio imminente di un nuovo modello di programmazione asincrona per C# and VB:</p>
<blockquote>
<p>Today, we are unveiling significant language and framework enhancements in C# and Visual Basic that enable developers to harness asynchrony, letting them retain the control flow from their synchronous code while developing responsive user interfaces and scalable web applications with greater ease.   This CTP delivers a lightweight asynchronous development experience as close to the standard synchronous paradigms as possible, while providing an easy on-ramp to the world of concurrency</p></blockquote>
<p>Lo stesso Somasegar riconosce che finora sviluppare applicazioni asincrone complesse con la piattaforma .NET non è stato facile. Tempo fa l’ho sperimentato in prima persona. Lavoravo su <a href="http://gestionaleamica.com/Backup/">Amica Prodigy Backup</a>, una applicazione di backup remoto.</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>Il programma invia files di grandi dimensioni al servizio di cloud storage <a href="http://aws.amazon.com/s3/">S3</a> aggiornando l’interfaccia utente con lo stato del trasferimento e consentendo nel frattempo di operare liberamente con l’interfaccia. Devo ammettere che si è trattata di una sfida molto accattivante. Lavoravo per la prima volta su sistemi cloud e c’era molto da imparare. La parte più difficile fu naturalmente la gestione dei processi asincroni sul client, che era una applicazione WinForm scritta su .NET Framework.</p>
<p>Una rapida occhiata al codice di esempio presente nell’articolo di Somasegar è meglio di mille parole. ‘The Old Way’ vs ‘The New Way’ ha un vincitore evidente, ed è la New Way. Mi piace molto il concetto della nuova keyword Await, è una soluzione così elegante! Come sempre in questi casi occorrerà scendere nei dettagli per verificare l’affidabilità di questa nuova soluzione.</p>
<p>La  CTP è già disponibile per il <!-- raw HTML omitted -->download<!-- raw HTML omitted -->, attualmente solo per le versioni inglesi di Visual Studio 2010.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Una ottima guida di riferimento per lo sviluppatore ASP.NET</title>
      <link>https://nicolaiarocci.com/guida-di-riferimento-per-asp-net/</link>
      <pubDate>Tue, 26 Oct 2010 00:00:00 +0000</pubDate>
      <guid>https://nicolaiarocci.com/guida-di-riferimento-per-asp-net/</guid>
      <description>&lt;p&gt;La  &lt;!-- raw HTML omitted --&gt;ASP.NET Developer Guidance Map&lt;!-- raw HTML omitted --&gt; è una eccellente risorsa sia per il programmatore alle prime armi che per il veterano. Fornisce una ottima selezione di  risorse web catalogate nelle seguenti categorie: Primi Passi, Architettura e Design, Codice di Esempio, Come Fare, Filmati, Addestramento.&lt;/p&gt;
&lt;p&gt;Peccato sia disponibile solo in formato PDF, qualcuno dovrebbe approntare una pagina wiki o qualcosa di simile che riproduca questi contenuti.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>La  <!-- raw HTML omitted -->ASP.NET Developer Guidance Map<!-- raw HTML omitted --> è una eccellente risorsa sia per il programmatore alle prime armi che per il veterano. Fornisce una ottima selezione di  risorse web catalogate nelle seguenti categorie: Primi Passi, Architettura e Design, Codice di Esempio, Come Fare, Filmati, Addestramento.</p>
<p>Peccato sia disponibile solo in formato PDF, qualcuno dovrebbe approntare una pagina wiki o qualcosa di simile che riproduca questi contenuti.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
