<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Sandbox on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/sandbox/</link>
    <description>Recent content in Sandbox on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Thu, 22 May 2014 06:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/sandbox/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Sandboxing in iOS: usciamo dal recinto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/</link>
      <pubDate>Thu, 22 May 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/</guid>
      <description>&lt;img src=&#34;http://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Sandpit.jpg/800px-Sandpit.jpg&#34; class=&#34;alignnone&#34; /&gt;&#xA;&lt;p&gt;Esiste una soluzione &lt;em&gt;semplice&lt;/em&gt; al &lt;a href=&#34;https://melabit.wordpress.com/2014/05/16/sandboxing-in-ios-un-recinto-troppo-stretto/&#34;&gt;problema del &lt;em&gt;sandboxing&lt;/em&gt; delle applicazioni per iOS&lt;/a&gt;, che non impatti sulla sicurezza del sistema ma che allo stesso tempo permetta a più applicazioni di aprire e modificare un dato documento, evitando inutili duplicazioni e, quel che è peggio, di dover tenere traccia delle modifiche effettuate da ciascuna applicazione?&lt;/p&gt;&#xA;&lt;p&gt;Soluzioni fattibili &amp;ndash; più o meno semplici e più o meno affidabili o sicure &amp;ndash; ce ne sono bizzeffe. Qui ne propongo una anch&amp;rsquo;io, che ha la caratteristica di sfruttare solo gli strumenti già esistenti in Unix e nei sistemi operativi derivati, fra cui anche iOS.&lt;/p&gt;&#xA;&lt;p&gt;Sia chiaro che non voglio sostituirmi agli ingegneri e ai programmatori della Apple, che conoscono molto meglio di me il sistema su cui lavorano. Quello che voglio è solo dare un contributo di principio e di dimostrarne la fattibilità pratica.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;eventuale (eventuale, non dimentichiamolo!) implementazione finale sarà di certo molto più brillante ed efficiente di questa.&lt;/p&gt;&#xA;&lt;p&gt;Per evitare ambiguità userò nel seguito un linguaggio standard, evitando le definizioni tipiche del mondo Apple: &lt;em&gt;directory&lt;/em&gt; al posto di &lt;em&gt;cartella&lt;/em&gt;, &lt;em&gt;file&lt;/em&gt; invece di &lt;em&gt;documento&lt;/em&gt;, &lt;em&gt;soft-link&lt;/em&gt; invece che &lt;em&gt;link simbolico&lt;/em&gt;, e ogni volta che mi riferirò a &lt;em&gt;Unix&lt;/em&gt; intenderò in effetti tutti sistemi operativi che derivano dalla base di Unix, come Linux, i vari BSD e ovviamente OS X e iOS.&lt;/p&gt;&#xA;&lt;h4 id=&#34;tutto-è-un-file&#34;&gt;Tutto è un file&lt;/h4&gt;&#xA;&lt;p&gt;Prima di proseguire il discorso bisogna ricordare alcuni concetti fondamentali sui file in Unix.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;http://en.wikipedia.org/wiki/Everything_is_a_file&#34;&gt;&lt;em&gt;Tutto è un file in Unix&lt;/em&gt;&lt;/a&gt;. Questo è uno dei primi mantra che si imparano quando ci si accosta a questo sistema operativo. Una directory è un file, persino la comunicazione fra i vari processi o con i dispositivi hardware avviene tramite file.&lt;/p&gt;&#xA;&lt;p&gt;Ma com&amp;rsquo;è fatto un file in Unix?&lt;/p&gt;&#xA;&lt;p&gt;Un file è composto da tre parti diverse e ben distinte fra loro: il &lt;em&gt;nome&lt;/em&gt; del file, il &lt;em&gt;contenuto&lt;/em&gt; del file e i &lt;em&gt;metadati&lt;/em&gt;, una serie di informazioni accessorie sul file che esamineremo meglio dopo.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-1.png&#34; alt=&#34;File in Unix&#34; width=&#34;496&#34; height=&#34;379&#34; class=&#34;aligncenter size-full wp-image-946&#34; /&gt;&#xA;&lt;p&gt;Il contenuto del file è salvato in uno o più settori del disco rigido, i metadati sono memorizzati negli &lt;em&gt;inode&lt;/em&gt;, delle strutture dati create al momento della formattazione del disco rigido e numerate univocamente, e infine il nome del file si trova nella directory (anch&amp;rsquo;essa un file!) che lo contiene, in una tabella che associa ad ogni nome di file della directory il numero dell&amp;rsquo;inode in cui sono salvati i metadati corrispondenti.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-2.png&#34; alt=&#34;Struttura di una directory&#34; width=&#34;588&#34; height=&#34;400&#34; class=&#34;aligncenter size-full wp-image-947&#34; /&gt;&#xA;&lt;p&gt;Ogni inode è una struttura dati (una specie di tabella un po&amp;rsquo; più complicata) contenente, fra l&amp;rsquo;altro, la dimensione del file, i permessi di accesso e di modifica, la data e l&amp;rsquo;ora in cui in cui il file è stato creato, modificato o semplicemente letto, i puntatori ai settori fisici del disco rigido in cui è salvato il contenuto vero e proprio del file ed infine, quello che ci interessa di più, un numero intero che serve a contare il numero di &lt;em&gt;copie&lt;/em&gt; (virtuali) del file stesso create tramite i cosiddetti &lt;em&gt;hard-link&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-3.png?w=605&#34; alt=&#34;Struttura di un inode&#34; width=&#34;605&#34; height=&#34;306&#34; class=&#34;aligncenter size-large wp-image-948&#34; /&gt;&#xA;&lt;p&gt;Se a questo punto non vi gira già la testa potete continuare  a leggere&amp;hellip;&lt;/p&gt;&#xA;&lt;h4 id=&#34;hard-link-e-soft-link&#34;&gt;Hard-link e soft-link&lt;/h4&gt;&#xA;&lt;p&gt;In Unix è possibile riferirsi in modo indiretto ad un file mediante due diversi tipi di file: gli &lt;em&gt;hard-link&lt;/em&gt; e i &lt;em&gt;soft-link&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Dei soft-link &lt;a href=&#34;http://melabit.wordpress.com/2014/03/21/come-mettere-un-piolo-quadrato-in-un-buco-rotondo/&#34;&gt;ho già scritto in questo blog&lt;/a&gt;. Aggiungo che il soft-link crea un riferimento al &lt;em&gt;nome del file&lt;/em&gt;, e si usa principalmente per dare un nome diverso ad un file.&lt;/p&gt;&#xA;&lt;p&gt;Un hard-link crea invece un riferimento al &lt;em&gt;numero dell&amp;rsquo;inode&lt;/em&gt; che contiene i metadati del file di partenza. Il file creato tramite un hard-link appare quindi a tutti gli effetti una copia del file originale, anche se non è esattamente così. Quando si copia un file, il nuovo file ha nome ed inode diverso ed anche il contenuto del file originale viene copiato in un&amp;rsquo;altra area del disco rigido. Creando un hard-link, il nuovo file avrà solo un nome diverso ma &lt;em&gt;continuerà a riferirsi allo stesso inode&lt;/em&gt;, e quindi allo stesso contenuto, sul disco rigido.&lt;/p&gt;&#xA;&lt;img src=&#34;http://melabit.files.wordpress.com/2014/05/sandbox_2-4.png?w=605&#34; alt=&#34;Hard-link e soft-link&#34; width=&#34;605&#34; height=&#34;368&#34; class=&#34;aligncenter size-large wp-image-949&#34; /&gt;&#xA;&lt;p&gt;Qualunque operazione effettuata sull&amp;rsquo;hard-link &amp;ndash; modifica del contenuto del file, dei permessi, dell&amp;rsquo;ora di accesso al file &amp;ndash; appare come se fosse effettuata  anche sul file originale e su tutti i suoi hard-link: un hard-link è a tutti gli effetti &lt;em&gt;lo stesso file&lt;/em&gt;, ma con un nome diverso.&lt;/p&gt;&#xA;&lt;p&gt;A differenza del soft-link, però, che perde il riferimento al file originale e non serve più a nulla se quest&amp;rsquo;ultimo viene cancellato dal disco rigido, un hard-link continua ad essere valido anche se si cancella il file a cui fa riferimento.&lt;/p&gt;&#xA;&lt;p&gt;Un hard-link ad un file viene creato con il comando,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file hfile&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove &lt;code&gt;file&lt;/code&gt; è il file originale e &lt;code&gt;hfile&lt;/code&gt; è l&amp;rsquo;hard-link (ovviamente i due file possono anche essere in directory diverse). Per creare il soft-link &lt;code&gt;sfile&lt;/code&gt; basta aggiungere l&amp;rsquo;opzione &lt;code&gt;-s&lt;/code&gt; al comando precedente.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln -s file sfile&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ogni volta che si crea un nuovo file, il contatore delle copie del file contenuto nell&amp;rsquo;inode viene settato ad 1. Aggiungendo un hard-link a quel file, il sistema operativo incrementa di 1 il contatore, cancellando l&amp;rsquo;hard-link il contatore viene decrementato di 1. In effetti, tramite il contatore, il sistema operativo può sapere quanti hard-link sono presenti sul disco rigido oltre al file originale.&lt;/p&gt;&#xA;&lt;p&gt;Arrivati a questo punto, chi vuole può saltare la sezione seguente e andare direttamente &lt;a href=&#34;https://static.233.196.69.159.clients.your-server.de/it/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/#usciamo&#34;&gt;all&amp;rsquo;ultima parte del post&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-po-di-pratica&#34;&gt;Un po&amp;rsquo; di pratica&amp;hellip;&lt;/h4&gt;&#xA;&lt;p&gt;Usiamo ora il Terminale di OS X per mettere in pratica quanto abbiamo appena visto.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;touch&lt;/code&gt; crea un nuovo file, a cui aggiungiamo una riga di testo qualunque con &lt;code&gt;echo&lt;/code&gt; (un metodo quasi da hacker, si potrebbe benissimo farlo con un editor di testo).&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ touch file.txt&#xA;$ echo &amp;quot;Ho appena creato un file di testo.&amp;quot; &amp;gt;&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Tramite &lt;code&gt;ls -l&lt;/code&gt; mostriamo il file appena creato e una parte dei metadati associati.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;-rw-r--r--  1 maggi  staff  35 May 19T22:53:00 file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ci interessano qui due numeri in particolare. Quello contenuto nella seconda colonna è il contatore delle copie del file e vale &lt;code&gt;1&lt;/code&gt; poiché il file è stato appena creato. Il numero nella quinta colonna, &lt;code&gt;35&lt;/code&gt;, è invece la dimensione in byte del file, uguale al numero di lettere che compongono il testo aggiunto con &lt;code&gt;echo&lt;/code&gt; più il carattere (invisibile) di a capo.&lt;/p&gt;&#xA;&lt;p&gt;Creiamo ora un hard-link e un soft-link che puntano entrambi al file di testo &lt;code&gt;file.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file.txt hfile.txt&#xA;$ ln -s file.txt sfile.doc&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Eseguendo di nuovo &lt;code&gt;ls -l&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;-rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;-rw-r--r--  2 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;si notano alcune cose fondamentali: (1) l&amp;rsquo;hard-link appare come un file del tutto identico al file originale, dimensioni, permessi, data di creazione (o di accesso), (2) il soft-link ha invece date, dimensioni e permessi differenti, (3) ed è anche mostrato in modo diverso nel Terminale, con una freccia che punta la file originale e con una &lt;code&gt;l&lt;/code&gt; al posto del &lt;code&gt;-&lt;/code&gt; nel primo carattere della riga, (4) avendo creato un hard-link il contatore delle copie del file contenuto nell&amp;rsquo;inode viene incrementato di 1 e, poiché i due file si riferiscono allo stesso inode (e quindi allo stesso contatore), il valore del contatore è uguale per &lt;code&gt;file.txt&lt;/code&gt; e &lt;code&gt;hfile.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;opzione &lt;code&gt;-i&lt;/code&gt; del comando &lt;code&gt;ls&lt;/code&gt; permette di stampare il numero dell&amp;rsquo;inode associato ad ogni file. Nel nostro esempio, si vede chiaramente che l&amp;rsquo;inode del file originale e quello dell&amp;rsquo;hard-link associato sono uguali.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -li&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Creando un hard-link si incrementa il contatore del numero di file contenuto nell&amp;rsquo;inode,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ln file.txt h2file.dat&#xA;$&#xA;$ ls -li&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 h2file.dat&#xA;219115720 -rw-r--r--  3 maggi  staff  35 May 19T22:53:00 hfile.txt&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre se si cancella un hard-link il contatore viene decrementato di 1.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm hfile.txt&#xA;$&#xA;$ ls -li&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 file.txt&#xA;219115720 -rw-r--r--  2 maggi  staff  35 May 19T22:53:00 h2file.dat&#xA;219115795 lrwxr-xr-x  1 maggi  staff   8 May 19T22:54:00 sfile.doc -&amp;gt; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;h4 id=&#34;usciamo&#34;&gt;Usciamo dal recinto&lt;/h4&gt;&#xA;&lt;p&gt;Per permettere a più applicazioni iOS di accedere alla stesso file, evitando allo stesso tempo la moltiplicazione dei file in diverso stato di &amp;ldquo;lavorazione&amp;rdquo;, serve un meccanismo che permetta di inserire tutti i documenti in un&amp;rsquo;area comune, riuscendo però a fare in modo che ciascuna applicazione continui ad accedere solo ai documenti che è autorizzata a gestire, cioè quelli contenuti nel suo &lt;em&gt;sandbox&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ricordo che il &lt;em&gt;sandbox&lt;/em&gt; è un meccanismo che limita l&amp;rsquo;accesso di una applicazione ai file, alle preferenze, alle risorse di rete, all&amp;rsquo;hardware e così via, incapsulando ciascuna applicazione con i suoi documenti in una directory protetta.&lt;/p&gt;&#xA;&lt;p&gt;Proprio gli hard-link possono essere sfruttati per implementare questo meccanismo.&lt;/p&gt;&#xA;&lt;p&gt;In iOS (ma anche in OS X) le applicazioni ci appaiono come delle semplici icone. In realtà ogni applicazione è costituita da una directory che contiene al suo interno &lt;em&gt;tutto&lt;/em&gt; quello che le serve per funzionare: l&amp;rsquo;eseguibile, le librerie, i file di supporto e di configurazione, le immagini e le icone e i documenti creati con l’applicazione stessa.&lt;/p&gt;&#xA;&lt;p&gt;Immaginiamo ora di avere due applicazioni installate nel nostro dispositivo iOS. Se &lt;em&gt;guardiamo&lt;/em&gt; al loro interno, osserveremo una struttura delle directory simile a questa.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── appB&#xA;&#x9;├── appB.app&#xA;&#x9;├── documents&#xA;&#x9;├── library&#xA;&#x9;└── tmp&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;La directory con estensione &lt;code&gt;.app&lt;/code&gt; contiene il file eseguibile dell&amp;rsquo;applicazione, le altre non necessitano di spiegazioni.&#xA;Si noti che il comando &lt;code&gt;tree&lt;/code&gt; usato per mostrare la struttura delle directory delle due applicazioni non esiste di default in OS X, ma può essere &lt;a href=&#34;http://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;installato sul Mac tramite Homebrew&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Aggiungiamo qualche file in ciascuna delle due applicazioni.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   │   ├── file-AB.txt&#xA;│   │   └── file_A1.pdf&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── appB&#xA;&#x9;├── appB.app&#xA;&#x9;├── documents&#xA;&#x9;│   ├── file-AB.txt&#xA;&#x9;│   ├── file_B1.pdf&#xA;&#x9;│   └── file_B2.txt&#xA;&#x9;├── library&#xA;&#x9;└── tmp&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Come abbiamo già visto, ognuna delle due applicazioni può gestire solo i documenti contenuti al suo interno. Le due applicazioni possono al massimo scambiarsi i file contenuti nella directory &lt;code&gt;documents&lt;/code&gt; di ciascuna, copiandoli integralmente da una applicazione all&amp;rsquo;altra. Nell&amp;rsquo;esempio precedente il file comune è &lt;code&gt;file-AB.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Una volta completata la copia, le modifiche effettuata da &lt;code&gt;appA&lt;/code&gt; su &lt;code&gt;file-AB.txt&lt;/code&gt; sono del tutto indipendenti da quelle effettuate da &lt;code&gt;appB&lt;/code&gt; sul file omonimo contenuto nel suo sandbox. L&amp;rsquo;unico modo per mantenere il file sincronizzato fra le due applicazioni è quello di copiarlo dopo ogni modifica dal sandbox di una applicazione a quello dell&amp;rsquo;altra. Una cosa poco pratica e facilmente soggetta ad errori.&lt;/p&gt;&#xA;&lt;p&gt;Immaginiamo invece di creare una directory &lt;code&gt;pool&lt;/code&gt;, esterna alle due applicazioni, che agisca come spazio comune per tutti i documenti.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;├── appB&#xA;│   ├── appB.app&#xA;│   ├── documents&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── pool&#xA;&#x9;├── file-AB.txt&#xA;&#x9;├── file_A1.pdf&#xA;&#x9;├── file_B1.pdf&#xA;&#x9;└── file_B2.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Ma le applicazioni presuppongono che i documenti siano all&amp;rsquo;interno del loro sandbox. È possibile fare in modo che le applicazioni riescano comunque ad accedere ai file in &lt;code&gt;pool&lt;/code&gt;?&lt;/p&gt;&#xA;&lt;p&gt;Facile: basta creare degli hard-link che dalla directory &lt;code&gt;documents&lt;/code&gt; di ogni applicazione puntino ai file contenuti in &lt;code&gt;pool&lt;/code&gt;. Ricreando tramite hard-link il contenuto originale delle directory &lt;code&gt;documents&lt;/code&gt; delle due applicazioni si ottiene,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ tree&#xA;.&#xA;├── appA&#xA;│   ├── appA.app&#xA;│   ├── documents&#xA;│   │   ├── hfile-AB.txt&#xA;│   │   └── hfile_A1.pdf&#xA;│   ├── library&#xA;│   └── tmp&#xA;├── appB&#xA;│   ├── appB.app&#xA;│   ├── documents&#xA;│   │   ├── hfile-AB.txt&#xA;│   │   ├── hfile_B1.pdf&#xA;│   │   └── hfile_B2.txt&#xA;│   ├── library&#xA;│   └── tmp&#xA;└── pool&#xA;&#x9;├── file-AB.txt&#xA;&#x9;├── file_A1.pdf&#xA;&#x9;├── file_B1.pdf&#xA;&#x9;└── file_B2.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove, per chiarezza, gli hard-link sono indicati dal prefisso &lt;code&gt;h&lt;/code&gt; aggiunto al nome del file.&lt;/p&gt;&#xA;&lt;p&gt;Il vantaggio principale di questo meccanismo è che se una delle due applicazioni modifica il file &lt;code&gt;hfile-AB.txt&lt;/code&gt; contenuto nel suo sandbox (quindi all&amp;rsquo;interno della &lt;em&gt;sua&lt;/em&gt; directory &lt;code&gt;documents&lt;/code&gt;), tutte le modifiche fatte dall&amp;rsquo;applicazione valgono anche per il file originale e per l&amp;rsquo;hard-link corrispondente contenuto nel sandbox dell&amp;rsquo;altra applicazione.&lt;/p&gt;&#xA;&lt;p&gt;Ovviamente quanto detto finora è facilmente generalizzabile a un numero qualunque di applicazioni e di file.&lt;/p&gt;&#xA;&lt;p&gt;Un altro vantaggio, che dovrebbe essere evidente da quanto detto in questo lunghissimo articolo, è che un hard-link &lt;em&gt;non occupa altro spazio&lt;/em&gt; sul disco rispetto a quello occupato dal file originale. Si evita quindi di sprecare inutilmente spazio sul disco dell&amp;rsquo;iPhone e dell&amp;rsquo;iPad a causa della duplicazione dei file trasferiti da una applicazione all&amp;rsquo;altra. E si sa bene che lo spazio su &lt;em&gt;qualunque&lt;/em&gt; computer non basta &lt;em&gt;mai&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ma come fa l&amp;rsquo;applicazione a inserire un nuovo documento in &lt;code&gt;pool&lt;/code&gt; e a creare l&amp;rsquo;hard-link corrispondente nella sua directory &lt;code&gt;documents&lt;/code&gt;? La risposta è semplice: non serve che lo faccia l&amp;rsquo;applicazione, il meccanismo immaginato qui può essere gestito dal solo sistema operativo. In altre parole, il meccanismo può essere implementato a livello del sistema operativo in modo del tutto trasparente alle applicazioni, che quindi non hanno bisogno essere modificate per funzionare correttamente.&lt;/p&gt;&#xA;&lt;p&gt;Quando l&amp;rsquo;applicazione &lt;code&gt;appA&lt;/code&gt; apre per la prima volta &lt;code&gt;file-AB.txt&lt;/code&gt;, è il sistema operativo che si occupa di inserire il file in &lt;code&gt;pool&lt;/code&gt; e di creare l&amp;rsquo;hard-link nel sandbox di &lt;code&gt;appA&lt;/code&gt;. Il tutto è assolutamente trasparente ad &lt;code&gt;appA&lt;/code&gt;, che non si accorge nemmeno di quello che è successo dietro le quinte. Se poi a un certo punto ho bisogno di inviare &lt;code&gt;file-AB.txt&lt;/code&gt; da &lt;code&gt;appA&lt;/code&gt; ad &lt;code&gt;appB&lt;/code&gt;, posso limitarmi a cliccare come succede già oggi sull&amp;rsquo;icona apposita in &lt;code&gt;appA&lt;/code&gt;, e sarà poi il sistema operativo ad intercettare la richiesta di copia del file, creando in realtà un nuovo hard-link in &lt;code&gt;appB&lt;/code&gt; che punta anch&amp;rsquo;esso a &lt;code&gt;file-AB.txt&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Infine, se si disinstalla una applicazione, supponiamo &lt;code&gt;appB&lt;/code&gt;, anche i suoi documenti vengono cancellati dal disco, compreso &lt;code&gt;hfile-AB.txt&lt;/code&gt; condiviso con &lt;code&gt;appA&lt;/code&gt;. Ma il documento originale e l&amp;rsquo;hard-link in &lt;code&gt;appA&lt;/code&gt; rimangono sul disco e non vengono persi inavvertitamente. Solo se si cancella anche &lt;code&gt;appA&lt;/code&gt;, il sistema operativo attraverso il contatore nell&amp;rsquo;inode, si accorge che non ci sono più hard-link a &lt;code&gt;file-AB.txt&lt;/code&gt; contenuto in &lt;code&gt;pool&lt;/code&gt; e può decidere di cancellare anche il file originale, magari chiedendo conferma esplicita al proprietario o dopo aver effettuato un backup di sicurezza sul Mac.&lt;/p&gt;&#xA;&lt;p&gt;E anche la cancellazione dei file può essere affidata senza problemi al sistema operativo e non deve essere gestita dalla singola applicazione.&lt;/p&gt;&#xA;&lt;p&gt;Detto questo, aspettiamo pazientemente la WWDC 2014 per sapere che diavolerie inventerà &lt;em&gt;veramente&lt;/em&gt; la Apple, in questo settore. Ammesso, naturalmente, che ne inventi qualcuna.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Sandboxing in iOS: un recinto troppo stretto</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2014/05/16/sandboxing-in-ios-un-recinto-troppo-stretto/</link>
      <pubDate>Fri, 16 May 2014 06:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2014/05/16/sandboxing-in-ios-un-recinto-troppo-stretto/</guid>
      <description>&lt;p&gt;Si avvicina il &lt;a href=&#34;https://developer.apple.com/wwdc/&#34;&gt;WWDC&lt;/a&gt; e come al solito fioriscono le anticipazioni sulle novità che verranno presentate dalla Apple. Non sono particolarmente appassionato di queste pseudo-notizie, spesso completamente prive di fondamento, ma ogni tanto mi diverto a leggerle in giro per la rete.&lt;/p&gt;&#xA;&lt;p&gt;Nel mare di cose inutili si trovano ogni tanto articoli intelligenti e ben fatti, in particolare quelli che invece che cercare di prevedere con una improbabile sfera di cristallo le mosse della Apple, provano ad elencare quello che sarebbe utile &lt;em&gt;migliorare&lt;/em&gt;, in particolare nella struttura di base e nelle funzioni di OS X e iOS.&lt;/p&gt;&#xA;&lt;p&gt;Fra gli articoli più interessanti che ho letto negli ultimi giorni, spiccano &lt;a href=&#34;http://www.macstories.net/stories/ios-8-wishes/&#34;&gt;iOS 8 Wishes &lt;/a&gt; di Federico Viticci su &lt;a href=&#34;http://www.macstories.net&#34;&gt;MacStories&lt;/a&gt; &amp;ndash; uno dei migliori blog in assoluto sul mondo Apple &amp;ndash; e &lt;a href=&#34;http://www.macworld.com/article/2148362/how-inter-app-communication-on-ios-could-benefit-users.html&#34;&gt;Why Apple should open up the iOS sandbox&lt;/a&gt; di Marco Tabini su &lt;a href=&#34;http://www.macworld.com&#34;&gt;MacWorld&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Entrambi gli articoli affrontano un tema che mi interessa moltissimo e che è di sicuro un grosso punto di forza di iOS, e contemporaneamente anche una grossa debolezza:  il &lt;em&gt;sandboxing&lt;/em&gt; delle applicazioni.&lt;/p&gt;&#xA;&lt;p&gt;Il termine &lt;em&gt;sandbox&lt;/em&gt; significa letteralmente &lt;em&gt;recinto dei giochi&lt;/em&gt; e, in un contesto informatico, si può tradurre più o meno come &lt;em&gt;ambiente protetto&lt;/em&gt;. Per semplicità da ora in poi userò quasi sempre il termine originale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-sandbox-delle-applicazioni-in-ios&#34;&gt;Il Sandbox delle applicazioni in iOS&lt;/h4&gt;&#xA;&lt;p&gt;Dalla &lt;a href=&#34;https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/TheiOSEnvironment/TheiOSEnvironment.html&#34;&gt;iOS App Programming Guide&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;For security reasons, iOS places each app (including its preferences and data) in a sandbox at install time. A sandbox is a set of fine-grained controls that limit the app’s access to files, preferences, network resources, hardware, and so on. As part of the sandboxing process, the system installs each app in its own sandbox directory, which acts as the home for the app and its data.&#xA;To help apps organize their data, each sandbox directory contains several well-known subdirectories for placing files. Figure A-1 shows the basic layout of a sandbox directory.&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Per motivi di sicurezza, nel corso dell&amp;rsquo;installazione iOS inserisce ciascuna app (incluse le preferenze ed i dati) in un ambiente protetto (&lt;em&gt;sandbox&lt;/em&gt;). Un sandbox è un insieme di controlli specifici che limitano l&amp;rsquo;accesso dell&amp;rsquo;app ai file, alle preferenze, alle risorse di rete, all&amp;rsquo;hardware e così via. All&amp;rsquo;interno di questo processo di sandboxing, il sistema installa ciascuna app in una cartella protetta che racchiude sia l&amp;rsquo;app che i suoi dati.&lt;/em&gt;&#xA;&lt;em&gt;Per semplificare l&amp;rsquo;organizzazione dei dati di ciascuna app, ciascuna cartella protetta contiene una serie di cartelle ben definite in cui inserire i file. La Figura A-1 mostra l&amp;rsquo;organizzazione tipica di una cartella protetta.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;[caption width=&amp;ldquo;975&amp;rdquo; align=&amp;ldquo;aligncenter&amp;rdquo;]&amp;lt;img src=&amp;ldquo;&lt;a href=&#34;https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/Art/ios_app_layout_2x.png%22&#34;&gt;https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/Art/ios_app_layout_2x.png&#34;&lt;/a&gt; width=&amp;ldquo;975&amp;rdquo; height=&amp;ldquo;1044&amp;rdquo; alt=&amp;ldquo;Figura A-1. Cartelle protette in iOS. La Figura è tratta da &amp;ldquo;iOS App Programming Guide&amp;rdquo;.&amp;rdquo; class /&amp;gt; Figura A-1. Cartelle protette in iOS. La Figura è tratta da &lt;a href=&#34;https://developer.apple.com/library/ios/documentation/iphone/conceptual/iphoneosprogrammingguide/TheiOSEnvironment/TheiOSEnvironment.html&#34;&gt;iOS App Programming Guide.&lt;/a&gt;[/caption]&lt;/p&gt;&#xA;&lt;p&gt;In pratica, quindi, ogni applicazione di iOS contiene al suo interno tutto quello che le serve per funzionare: l&amp;rsquo;eseguibile vero e proprio, i file di libreria, file vari di supporto e configurazione, i file delle immagini, le icone, i file temporanei ma anche i &lt;em&gt;documenti prodotti usando l&amp;rsquo;applicazione stessa&lt;/em&gt;. Ci sono delle eccezioni, relative ad esempio alle foto, ma il concetto generale è questo.&lt;/p&gt;&#xA;&lt;h4 id=&#34;vantaggi&#34;&gt;Vantaggi&lt;/h4&gt;&#xA;&lt;p&gt;Quali sono i vantaggi di questo approccio?&lt;/p&gt;&#xA;&lt;p&gt;Un primo vantaggio ovvio da quanto appena visto è che, essendo ogni applicazione completamente isolata dalle altre e dal sistema operativo, eventuali falle di sicurezza di una applicazione non compromettono le altre o il sistema operativo stesso.&lt;/p&gt;&#xA;&lt;p&gt;Inoltre, il &lt;em&gt;sandboxing&lt;/em&gt; evita all&amp;rsquo;utente di doversi preoccupare di &lt;em&gt;gestire&lt;/em&gt; i file su iOS. Niente file o cartelle da creare, cancellare, rinominare, niente file da cercare chissà dove sul disco. Tutto è gestito dal sistema. Tutti i file sono visibili nell&amp;rsquo;applicazione usata, senza complicazioni inutili.&lt;/p&gt;&#xA;&lt;p&gt;Un ulteriore vantaggio è che installare le applicazioni in iOS è facilissimo: basta copiare la cartella contenente tutto quello che serve all&amp;rsquo;applicazione per funzionare sull&amp;rsquo;iPhone o sull&amp;rsquo;iPad e via. Non servono &lt;em&gt;installer&lt;/em&gt; che distribuiscano i file dell&amp;rsquo;applicazione qui e là sul disco. Una cosa pulita. Non ce ne accorgiamo solo perché il tutto è gestito da iTunes o direttamente dal dispositivo iOS.&lt;/p&gt;&#xA;&lt;p&gt;Altrettanto facile è la disinstallazione delle applicazioni: basta tenere il dito sull&amp;rsquo;applicazione prescelta, aspettere che le icone inizino a tremolare e premere sulla piccola &lt;code&gt;X&lt;/code&gt; in alto a destra per disinstallarla, sicuri che non ne rimarrà traccia sul dispositivo.&lt;/p&gt;&#xA;&lt;p&gt;Molto più semplice che sul concorrente Android, in cui &lt;em&gt;in teoria&lt;/em&gt; le applicazioni possono essere disinstallate più o meno allo stesso modo, ma accettando di lasciare tracce più o meno pesanti della loro presenza. Anche la disinstallazione tramite la voce apposita delle &lt;code&gt;Impostazioni di Sistema&lt;/code&gt; lascia comunque rimasugli che possono solo essere  rimossi manualmente o tramite tool appositi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;svantaggi&#34;&gt;Svantaggi&lt;/h4&gt;&#xA;&lt;p&gt;Però l&amp;rsquo;approccio della Apple ha anche degli svantaggi.&lt;/p&gt;&#xA;&lt;p&gt;Proprio perché la disinstallazione delle applicazioni rimuove &lt;em&gt;tutto&lt;/em&gt;, si rischia di perdere insieme all&amp;rsquo;applicazione anche i documenti prodotti con essa. La cosa peggiore è che in caso di errore l&amp;rsquo;applicazione è facilmente reinstallabile ma i documenti sono comunque perduti per sempre.&lt;/p&gt;&#xA;&lt;p&gt;Un altro svantaggio è che se si lavora su uno stesso file tramite più applicazioni, questo viene ogni volta copiato da una applicazione all&amp;rsquo;altra, per poter risiedere nella cartella protetta di ciascuna. Il problema non è tanto (o solo) lo spreco di spazio sul disco causato dalla duplicazione dei file, quanto il fatto che dopo un po&amp;rsquo; si perde traccia delle modifiche effettuate sulle varie versioni dei file presenti nelle diverse applicazioni.&lt;/p&gt;&#xA;&lt;p&gt;Prendiamo come esempio un file pdf. Il file inizialmente è sul Mac e viene sincronizzato con l&amp;rsquo;iPad tramite Dropbox per iOS. Da qui lo invio ad Adobe Reader per leggerlo. A un certo punto voglio aggiungere delle note o delle evidenziazioni al file, ma Adobe Reader non è adeguato e quindi lo trasferisco a GoodReader. Finito il lavoro, lo invio via email al Mac&amp;hellip; Mi fermo qui ma è chiaro che dopo un po&amp;rsquo; di passaggio (e dopo un po&amp;rsquo; di tempo) ricordare la storia delle modifiche effettuate è praticamente impossibile.&lt;/p&gt;&#xA;&lt;p&gt;Ancora peggio se si lavora su un progetto costituito da diversi file: documenti di testo, documentazione in pdf, presentazioni, immagini, filmati. Non c&amp;rsquo;è alcuna possibilità di accedere facilmente ai vari file del progetto e tutto è disperso fra le varie applicazioni, senza nessuno strumento che tenga insieme in qualche modo file di tipo diverso.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-filesystem-per-ios&#34;&gt;Un filesystem per iOS?&lt;/h4&gt;&#xA;&lt;p&gt;Insomma, con lo sviluppo dei dispositivi iOS, e soprattutto dell&amp;rsquo;iPad che ha ormai tutte le potenzialità per diventare un vero sostituto di un computer Desktop per la maggior parte degli utenti, si sente il bisogno di rendere più semplice ed efficiente la comunicazione fra le varie applicazioni.&lt;/p&gt;&#xA;&lt;p&gt;Gli utenti avanzati, i &lt;em&gt;power user&lt;/em&gt;, sarebbero favorevoli a che anche su iOS venga reso accessibile il &lt;em&gt;filesystem&lt;/em&gt; (che esiste, ovviamente, ma è nascosto all&amp;rsquo;utente) o almeno una parte di esso (come su Android), vorrebbero avere a disposizione una specie di Finder per iOS che gli dia la possibilità di copiare o muovere i file ovunque o quasi all&amp;rsquo;interno del filesystem.&lt;/p&gt;&#xA;&lt;p&gt;Mi metto anch&amp;rsquo;io fra questi. Per me l&amp;rsquo;uso del filesystem, la gestione di file e cartelle più o meno annidate, la scelta di volta in volta del programma da utilizzare per manipolare un determinato file, sono tutte cose ormai del tutto spontanee.&lt;/p&gt;&#xA;&lt;p&gt;Ma so anche bene che per l&amp;rsquo;utente &lt;em&gt;medio&lt;/em&gt; non valgono le stesse considerazioni.&lt;/p&gt;&#xA;&lt;p&gt;I dispositivi iOS hanno successo non solo perché sono gestibili in modo più &lt;em&gt;immediato&lt;/em&gt; con le dita, ma anche perché rendono &lt;em&gt;naturale&lt;/em&gt; l&amp;rsquo;uso del computer e delle applicazioni, nascondendo all&amp;rsquo;utente tanti dettagli più o meno inutili. Si pensi ad esempio al non doversi preoccupare di salvare i file su cui si sta lavorando, ci pensa il sistema a farlo automaticamente. Per questi utenti un filesystem sarebbe una complicazione inutile. A quel punto i benefici di usare un iPad o un Phone verrebbero quasi a mancare del tutto.&lt;/p&gt;&#xA;&lt;p&gt;Ma c&amp;rsquo;è una soluzione? Certamente e di certo più di una. Anche &lt;a href=&#34;http://melabit.wordpress.com/2014/05/22/sandboxing-in-ios-usciamo-dal-recinto/&#34;&gt;sfruttando le fondamenta stesse di Unix da cui deriva lo stesso iOS&lt;/a&gt;.&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
