tag:blogger.com,1999:blog-38282952024-03-14T07:15:52.029+01:00Runtime horrorPersonal blog of <a href="http://loris.tissino.it">Loris Tissino</a> - Blog personale di <a href="http://loris.tissino.it">Loris Tissino</a>Unknownnoreply@blogger.comBlogger62125tag:blogger.com,1999:blog-3828295.post-76820825368108237532021-02-05T18:51:00.002+01:002021-02-05T18:52:35.223+01:00Aggiornare un sito web remoto in PHP con GIT, senza FTP e senza SSH<p>Può capitare di dover gestire un server remoto con del codice PHP, ma di non avere a disposizione un accesso SSH.</p><p>Se il codice PHP è gestito con un sistema di controllo di versione come <b>git</b>, avere il modo di aggiornare i file sul server dopo ogni <i>commit/push</i> può rivelarsi comodo. In genere si accede al server remoto via SSH e da lì si dà un comando per fare un git pull e recuperare gli aggiornamenti.</p><p>Ma se non si ha a disposizione un accesso SSH? Visto che abbiamo la possibilità di usare PHP sul server, perché non usare degli script per gestire gli aggiornamenti?</p><p>Per alcuni usi personali, ho predisposto due script che fanno quanto (a me) serve:</p><p></p><ul style="text-align: left;"><li>uno script lato client, che lancio dopo ogni <i>commit/push</i>,</li><ul><li>esegue il comando<br /><span style="font-family: courier;">git diff-tree --name-only --no-commit-id -r ababab</span><br />dove <span style="font-family: courier;">ababab</span> è l'identificativo dell'ultimo commit, per ottenere l'elenco dei file oggetto di cambiamento nell'ultimo <i>commitM</i></li><li>produce un file <a href="https://it.wikipedia.org/wiki/JavaScript_Object_Notation" target="_blank">JSON</a> con le informazioni su questi file (percorso del file e suo contenuto, codificato in <a href="https://it.wikipedia.org/wiki/Base64" target="_blank">Base 64</a> per essere <i>binary-safe</i>);</li><li>fa un POST allo script lato server;</li></ul><li>uno script lato server, che</li><ul><li>riceve il file JSON e lo decodifica;</li><li>salva i file aggiunti / modificati, oppure elimina quelli per cui riceve un contenuto vuoto;</li><li>informa sull'esito dell'operazione.</li></ul></ul><div>Ho messo il codice a disposizione su <a href="https://github.com/loristissino/loristissino-examples/tree/master/php/websiteupdater" target="_blank">GitHub</a>, nel caso servisse a qualcuno.</div><p></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-15963305871613671752021-01-25T09:09:00.004+01:002021-01-25T09:10:43.157+01:00Tutti in coda!<p>La parola "coda" dell'italiano è traducibile in modi molto diversi, a seconda del contesto e del significato specifico, in inglese. Spesso c'è un po' di confusione, per cui è meglio chiarire con qualche esempio (considerato anche il fatto che la coda è una struttura di dati astratta molto importante in informatica).</p><p>Innanzitutto, la coda degli animali in inglese è <i>tail</i>. In informatica, con tail si intende la parte finale di qualcosa. Ad esempio, nei sistemi POSIX, <span style="font-family: courier;"><b>tail</b></span> è un comando che estrae le ultime righe di un file di testo o del suo standard input.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-JB-xJs0yhkA/YA50ocLaIdI/AAAAAAAAV2A/Suc5lBoWQxgDGKOJJSuytq-lu1c6CluyACLcBGAsYHQ/s800/tail_posix.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Esempio di esecuzione del comando tail" border="0" data-original-height="131" data-original-width="800" height="65" src="https://1.bp.blogspot.com/-JB-xJs0yhkA/YA50ocLaIdI/AAAAAAAAV2A/Suc5lBoWQxgDGKOJJSuytq-lu1c6CluyACLcBGAsYHQ/w400-h65/tail_posix.png" title="Esecuzione del comando tail per mostrare le ultime cinque righe del file /etc/services" width="400" /></a></div><br /><p>La coda che si fa alla cassa del supermercato è una <i>queue</i> in inglese britannico ed è invece una <i>line</i> nell'inglese degli Stati Uniti.</p><p>Per la struttura dati che rappresenta una sequenza di oggetti in cui il primo ad essere estratto è il primo ad essere stato inserito (FIFO: first in, first out), si usa il termine inglese, <i>queue</i>. Accodare un elemento è <i>to enqueue</i>, prelevare il primo elemento è <i>to dequeue</i>. Attenzione che invece <i>deque</i> (pronunciato <i>deck</i>), senza <i>ue</i> alla fine, è un'abbreviazione di <i>double-ended queue</i>, una struttura dati diversa. la <a href="https://it.wikipedia.org/wiki/Deque" target="_blank">doppia coda</a>.</p><p>Il primo elemento inserito (e quindi eventualmente da prelevare) di una <i>queue</i> si chiama <i>front</i>, mentre l'ultimo si chiama <i>back</i>. Il chiedere qual è il primo elemento senza effettivamente prelevarlo, è <i>to peek</i>.</p><p>La coda di stampa, ossia l'insieme dei file memorizzati dal sistema operativo su disco in attesa della disponibilità fisica della stampante, si chiama <i>print buffer</i>. Spesso si usa anche il termine <i>spool</i>, che è un acronimo per <i>Simultaneous peripheral operations on-line</i> (o forse è un backronym, visto che il termine potrebbe essere derivato dalla parola generica <i>spool</i>, bobina).</p><p>Spostandoci nel settore degli audiovisivi, i titoli di coda di un film sono <i>closing credits</i> oppure <i>end credits</i>.</p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-89644404334167890572021-01-22T19:03:00.001+01:002021-01-22T19:03:34.478+01:00CRUD, HTTP, SQL<p>Ho preparato per la mia classe quinta un breve riepilogo delle cose fondamentali da sapere per progettare un'interfaccia REST ai dati presenti in un database.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://github.com/loristissino/loristissino-examples/blob/master/general/CRUD_HTTP_SQL.pdf" imageanchor="1" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img border="0" data-original-height="2048" data-original-width="2048" height="320" src="https://1.bp.blogspot.com/-h1kOL0Duv4I/YAsS_HJeqGI/AAAAAAAAV0k/e6jZEuQPAIUE9QE9bYE6XBcVpU505MatgCLcBGAsYHQ/s320/CRUD_HTTP_SQL.png" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p><br /></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-44552111349872043182019-11-27T09:42:00.000+01:002019-11-27T09:44:53.969+01:00AntilaicitàGià è difficile definire il termine "religione", che comprende vari tipi di credenze e culti organizzati, spesso molto differenti tra loro.<br />
Ancora più difficile è definire il termine "laicità", che, al di là del concetto di separazione tra Stato e Chiesa, si porta dietro significati multipli, dall'assenza di simboli religiosi nei locali pubblici alla promozione di una cultura scientifica e di uno spirito critico, dalla non discriminazione alla tutela dei diritti umani (compresi quelli di professare la religione desiderata, di cambiare religione, di non professarne alcuna).<br />
Raffaele Carcano, per il suo ultimo libro, utilizza poi il termine «antilaicità», non ancora presente nei dizionari ma già attestato, per parlare di tutte le azioni che hanno avuto e hanno il fine di negare la laicità. Ce ne sono state parecchie, nel corso della storia umana, e non mancano certo ai giorni nostri.<br />
Il libro in questione è <i><a href="https://www.nessundogma.it/libro/storia-dell-antilaicita/" target="_blank">Storia dell'antilaicità. Cinque millenni di rapporti tra stati e religioni</a></i> (edizioni Nessun Dogma, 2019).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ToeNrJMHTXA/Xd42IpaC_rI/AAAAAAAAQlY/333Z56s1LR0FQ5JTHOIkpnG8WbGo07-ewCLcBGAsYHQ/s1600/antilaicita-cover.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="634" data-original-width="400" height="320" src="https://1.bp.blogspot.com/-ToeNrJMHTXA/Xd42IpaC_rI/AAAAAAAAQlY/333Z56s1LR0FQ5JTHOIkpnG8WbGo07-ewCLcBGAsYHQ/s320/antilaicita-cover.jpg" width="201" /></a></div>
<br />
Vi si parla di come le religioni, in tutto il mondo, abbiano tentato e tentino di imporre le proprie visioni agli stati, di come gli stati abbiano tentato di sfruttare le religioni a proprio vantaggio e di come la laicità, nelle sue diverse accezioni, sia sempre stata messa in difficoltà sia dagli stati sia dalle religioni, nonostante le sue virtù e i suoi principi di carattere universale.<br />
E — secondo me questa è la parte più interessante — vi si delineano i diversi concetti che dovrebbero stare alla base della definizione di laicità e che dovrebbero ispirare le attività di chi la laicità ha a cuore.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-40605066759973335492019-11-24T21:17:00.001+01:002019-11-24T21:48:41.526+01:00Un titolo fuorviante per un bel libroHo appena finito di leggere l'ultimo libro di Richard Dawkins, famoso biologo evoluzionista e divulgatore scientifico che aveva già scritto il brillante "L'illusione di Dio" nel 2006.<br />
Quest'ultimo lavoro è rivolto principalmente agli adolescenti, ma è un'interessante lettura per tutti. Affronta diversi argomenti a sostegno della tesi che gli dei non esistono, i testi sacri non sono fonte di ispirazione etica, credere delle divinità non serve a essere migliori e nemmeno a spiegare la complessità della vita. Tutte cose argomentate in maniera semplice ed efficace.<br />
La critica principale non riguarda tanto i contenuti del libro quanto il pessimo titolo che è stato scelto dall'editore (Mondadori) per la pubblicazione in Italia.<br />
Il libro in questione, in originale, si intitola <i>Outgrowing God. A Beginner’s Guide</i>: è rivolto ai giovani e sottintende che crescendo ci si possa convincere dell'inutilità e dell'irrazionalità delle credenze religiose e delle religioni.<br />
Il verbo inglese <i>to outgrow</i> ha <a href="https://www.wordreference.com/definition/outgrow" target="_blank">diversi significati legati alla crescita</a>: tra questi, diventare troppo grandi per qualcosa (<i>to outgrow one's clothes</i>, crescere tanto da non poter indossare più i vestiti di prima), rendersi conto, crescendo, dell'infondatezza di alcune credenze (<i>she outgrew her fear of the dark</i>, ha superato la sua paura del buio), superare qualcuno nella crescita (<i>watching one child outgrow another</i>, vedere un bambino superare, ad esempio in altezza, un altro).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-OReILPFpucM/XdrkNHdlZkI/AAAAAAAAQhs/l3nUrgqDXmkb8v-kkcP4qN-JQUNVf0q9wCEwYBhgL/s1600/outgrowing_god.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="218" data-original-width="135" src="https://1.bp.blogspot.com/-OReILPFpucM/XdrkNHdlZkI/AAAAAAAAQhs/l3nUrgqDXmkb8v-kkcP4qN-JQUNVf0q9wCEwYBhgL/s1600/outgrowing_god.jpg" /></a></div>
<br />
Dalla lettura del libro risulta evidente che il significato inteso dall'autore è il secondo: dopo aver convinto il (giovane) lettore della molto probabile (quasi certa, in effetti) inesistenza di Dio, della non necessità di una sua esistenza né a formare una morale né a spiegare la complessità del mondo, Dawkins lo accompagna in un percorso di crescita che gli permetterà di abbandonarlo completamente, di superarlo come si supera una malattia o una superstizione.<br />
Si sarebbe potuto intitolare il libro "Superare Dio", "Crescere e rendersi conto che Dio non esiste", "Abbandonare Dio crescendo", "Troppo grande per credere ancora in Dio", "Crescere e abbandonare Dio", "Crescere e staccarsi da Dio / dall'idea di un Dio" o in mille altri modi.<br />
<br />
Che titolo ha, invece, l'edizione italiana?<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-RHqY9ipszcc/XdrkUT5WAUI/AAAAAAAAQho/_iO6CSMmQ7Aydp1z8EvANPu5dIaYiNoZwCLcBGAsYHQ/s1600/diventare_piu_grandi_di_dio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="218" data-original-width="142" src="https://1.bp.blogspot.com/-RHqY9ipszcc/XdrkUT5WAUI/AAAAAAAAQho/_iO6CSMmQ7Aydp1z8EvANPu5dIaYiNoZwCLcBGAsYHQ/s1600/diventare_piu_grandi_di_dio.jpg" /></a> </div>
<br />
"Diventare più grande di Dio. Una guida all'ateismo per principianti". Come se l'obiettivo fosse di convincere un ragazzo non solo che qualche Dio esiste, ma anche di poter diventare più grande dello stesso. Questa scelta mi risulta francamente incomprensibile.<br />
<br />
Se ne avete l'occasione, comunque, acquistatelo / leggetelo. Ne vale la pena: non lasciatevi fuorviare dal titolo (e dalla grafica della copertina, criticabile anch'essa).<br />
<br />
(Se volete sapere di più sul libro provate anche a vedere / ascoltare l'<a href="https://www.youtube.com/watch?v=tsLEf1Uwb5o" target="_blank">ottima intervista</a> che Alex J. O'Connor ha fatto a Dawkins sui temi trattati nel libro.)
<br />
<hr />
<div lang="en">
<i>The Italian title chosen for the latest book written by Richard Dawkins is "Diventare più grandi di Dio", which literally means something like "Becoming greater than God". The book is good, but the Italian title is misleading.
</i></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-70568639164323675842019-10-21T08:35:00.001+02:002019-10-21T08:35:11.630+02:00Presentazioni mortali<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="margin-left: 1em; margin-right: 1em;">
</div>
<br />
<br />
Di molte presentazioni si può dire che "fanno morire dalla noia", ma ce ne è stata una che ha, quasi letteralmente, ucciso sette persone. Stiamo parlando della missione NASA STS-107 del gennaio 2003. Al decollo, un pezzo del materiale di isolamento dello Space Shuttle Columbia si staccò e, a una velocità di quasi 29mila km/h, urtò contro l'ala sinistra, proprio nella parte che doveva servire a proteggere il veicolo spaziale dalle alte temperature dovute all'attrito con l'atmosfera nella fase di rientro.<br />
<br />
Era difficile stimare il danno provocato dall'urto, ma in una riunione tra ufficiali della NASA e tecnici della Boeing venne mostrata, in una presentazione, una diapositiva che illustrava i potenziali rischi.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-erPoOLwUEDM/Xa1QcqpJ2MI/AAAAAAAAQCs/ZGOb5-L1jX4zTZ03Q_0n2ISv5WHgtqY_ACEwYBhgL/s1600/slide_shuttle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="840" data-original-width="1500" height="223" src="https://1.bp.blogspot.com/-erPoOLwUEDM/Xa1QcqpJ2MI/AAAAAAAAQCs/ZGOb5-L1jX4zTZ03Q_0n2ISv5WHgtqY_ACEwYBhgL/s400/slide_shuttle.png" width="400" /></a></div>
<br />
<br />
La diapositiva aveva però alcuni gravi problemi di impostazione:<br />
<ul>
<li>titolo grande e fuorviante</li>
<li>elenco puntato con diversi livelli, da cui si poteva dedurre scarsa importanza delle informazioni di livello più basso</li>
<li>grande quantità di testo</li>
<li>termini diversi per indicare la stessa cosa</li>
<li>termini vaghi e soggetti a interpretazione personale</li>
<li>l'informazione più rilevante (le condizioni di volo dello Shuttle erano ben diverse da quelle provate in laboratorio) era messa in coda a tutte le altre</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
La conseguenza fu tragica: i rischi furono sottovalutati e non fu organizzata nessuna attività che avrebbe potuto evitare il <a href="https://it.wikipedia.org/wiki/Disastro_dello_Space_Shuttle_Columbia" target="_blank">disastro del rientro</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div>
La vicenda è <a href="https://mcdreeamiemusings.com/blog/2019/4/13/gsux1h6bnt8lqjd7w2t2mtvfg81uhx" target="_blank">ben raccontata</a> da Jamie Thomas nel suo blog, che a sua volta rimanda all'<a href="https://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001yB" target="_blank">analisi completa</a> svolta da Edward Tufte.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-84722297131317255642019-07-14T10:05:00.001+02:002019-07-14T10:05:36.620+02:00Epoch e il primo passo dell'uomo sulla luna<i>Epoch</i> è il nome convenzionalmente attribuito all'istante da cui molti sistemi informatici (in pratica, tutti quelli basati o ispirati a UNIX) iniziano a conteggiare il passare del tempo. La data scelta è il primo gennaio 1970 e ad essere conteggiati sono i secondi.<br />
<br />
Quando interrogate il sistema per sapere quando è stato modificato un file l'ultima volta, ad esempio con<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$ stat -c '%x' testfile </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">2019-07-14 09:33:04.977645058 +0200</span><br />
<br />
quello che ottenete in realtà è solo la rappresentazione in formato "umano" del numero memorizzato internamente nel filesystem.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$ stat -c '%X' testfile </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">1563089584</span><br />
<br />
Un tempo per la memorizzazione di questo valore si utilizzava una variabile a 32 bit senza segno. Per questo motivo, ancora oggi, la pagina <i>man</i> di <i>stat</i> non indica come ottenere una precisione maggiore. Adesso i bit a disposizione sono molti di più, e consentono la memorizzazione fino al livello dei nanosecondi:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">$ stat -c '%.X' testfile </span><br />
<span style="font-family: "courier new" , "courier" , monospace;">1563089584,977645058</span><br />
<div>
<br /></div>
<div>
È interessante notare che nelle primissime versioni di Unix era stato scelto di utilizzare i numeri interi non per contare i secondi, ma i sessantesimi di secondo (questo perché ci si basava su oscilloscopi a 60 Hz). Si era nel 1971, e con 32 bit si potevano in questo modo rappresentare solo 828 giorni e mezzo circa, per cui <a href="https://stackoverflow.com/questions/1090869/why-is-1-1-1970-the-epoch-time" target="_blank">fu deciso</a> all'epoca (scusate il bisticcio di parole) di impostare <i>epoch</i> al 1 gennaio 1971. Solo successivamente fu cambiata l'impostazione e si passò alla memorizzazione dei secondi utilizzando il 1 gennaio 1970 come riferimento di base.</div>
<div>
<br /></div>
<div>
Capisco i motivi pratici della scelta, ma pensate a quanto sarebbe bello, ancora oggi, se fosse stato scelto come riferimento il <a href="https://it.wikipedia.org/wiki/Apollo_11#Operazioni_sulla_superficie_lunare" target="_blank">primo passo dell'uomo sulla Luna</a>, avvenuto pochi mesi (14.159.025 secondi, per la precisione) prima, alle 2:56:15 UTC del 21 luglio 1969.</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">$ date -d '@-14159025'</span></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">lun 21 lug 1969, 04.56.15, CEST</span></div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span></div>
<span style="font-family: "courier new" , "courier" , monospace;">
<div>
$ date -u -d '@-14159025'</div>
<div>
lun 21 lug 1969, 02.56.15, UTC</div>
<div>
<br /></div>
</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="409" data-original-width="538" height="243" src="https://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-66025865077109864662018-11-05T19:21:00.001+01:002018-11-06T09:21:11.795+01:00SlugTra le tante parole dell'informatica che sono difficili da tradurre in italiano e — da quello che vedo — anche in altre lingue, c'è «slug».<br />
<br />
Lo <em>slug</em> è la parte di URL che identifica univocamente un post di un blog o, in generale, un articolo o una pagina web.<br />
<br />
Ad esempio, un articolo intitolato "Darwin e l'evoluzione" potrebbe avere come <i>slug</i> <code>darwin-e-l-evoluzione</code>, parte di un URL come<br />
<code><br /></code>
<code>https://www.example.com/articoli/darwin-e-l-evoluzione</code><br />
<br />
Tipicamente, lo <em>slug</em> contiene solo caratteri minuscoli dell'alfabeto inglese, e i vari segni di punteggiatura, compresi gli spazi, sono trasformati in trattini semplici. Eventuali caratteri con segni diacritici potrebbero essere trasformati nel carattere semplice più simile: ad esempio, "Perché lo studio di Darwin è importante" potrebbe avere come <i>slug</i> <code>perche-lo-studio-di-darwin-e-importante</code>.<br />
<br />
Spesso ad occuparsi della generazione dello <i>slug</i> per un articolo è il <em>Content Management System</em> in uso, che al momento della pubblicazione di un articolo propone un determinato valore, poi modificabile dall'autore dell'articolo o dal webmaster.<br />
<br />
Per molti linguaggi di programmazione esistono infatti delle funzioni che producono lo <em>slug</em> a partire da una stringa di testo. Al momento in cui scrivo, una ricerca su GitHub mostra <a href="https://github.com/search?q=slugify&type=Repositories">286 risultati per <em>slugify</em></a> e <a href="https://github.com/search?q=sluggable&type=Repositories">1247 per <em>sluggable</em></a>.<br />
<br />
A volte, le funzioni che si occupano di proporre uno <i>slug</i> tengono anche in considerazione l'esigenza di evitare duplicati, aggiungendo un suffisso numerico appropriato, come in un ipotetico <code>darwin-e-l-evoluzione-2</code> per un secondo articolo intitolato "Darwin e l'evoluzione".<br />
<br />
Ma che cosa significa la parola inglese "slug"? Una <a href="http://www.wordreference.com/enit/slug">ricerca su WordReference porta a risultati</a> che nulla sembra abbiano a che fare con il nostro argomento: lumacone, proiettile, pallottola, sorsata, sorso. C'è però un riferimento a una "slug area", termine usato in editoria come "part of a page reserved for printed information".<br />
<br />
Su Wikipedia si parla di <em>slug</em> nella <a href="https://en.wikipedia.org/wiki/Clean_URL#Slug" target="_blank">pagina inglese dedicata agli URL "puliti"</a>, dove si trova un'informazione interessante: a quanto pare, il nome è basato sull'uso che la parola "slug" ha nel mondo editoriale, nel quale indica un nome breve assegnato per uso interno ad un articolo.<br />
<br />
Nella pagina di Wikipedia relativa al concetto di <a href="https://en.wikipedia.org/wiki/Slug_(publishing)">slug nell'editoria</a> si ottiene qualche informazione in più: una storia verrebbe etichettata con uno <em>slug</em> durante il processo editoriale che la porta dalla scrittura da parte del reporter alla pubblicazione. Lo <em>slug</em>, secondo quanto previsto dallla guida di stile dell'Associated Press, dovrebbe indicare con una o più parole chiave i contenuti della storia raccontata (a volte con l'aggiunta di codici specifici, come "AM" per indicare che essa va pubblicata nell'edizione del mattino o "CX" per dire che serve a rettificare una storia pubblicata precedentemente).<br />
<br />
L'etimologia della parola <em>slug</em> in questo contesto deriva dall'uso della parola slug che era utilizzata per esprimere, nel campo della tipografia con caratteri di piombo, una <a href="https://typography.guru/term/slug-linotype-r179/">riga di caratteri</a>.<br />
<br />
Interessante il fatto che dal sostantivo <em>slug</em> si sia prodotto il verbo <em>to slugify</em> ma l'aggettivo <em>sluggable</em> e non <i>*slugifiable</i>.<br />
<br />
Resta il problema di come eventualmente tradurre il termine in italiano. Da quello che si vede in giro, come spesso accade, la scelta migliore sembrerebbe di utilizzare la parola inglese.twhttp://www.blogger.com/profile/08558427199604737148noreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-1951051187851881942018-07-03T15:42:00.002+02:002018-07-03T15:42:39.995+02:00"Prossima apertura" secondo Google TranslateSono molto frequenti i cartelli in cui si informa la potenziale clientela che si sta preparando un nuovo locale, un nuovo negozio, ecc.<br />
<br />
Un tempo cartelli di questo genere recavano la scritta "prossima apertura", ma visto che dirlo in italiano pare evidentemente brutto, recentemente ci si è buttati sull'inglese o, meglio, sull'<a href="http://blog.terminologiaetc.it/?s=inglese+farlocco" target="_blank">inglese farlocco</a>. Si veda questo cartello apparso recentemente nella mia città, in cui compare la scritta "<i>next opening</i>" al posto del corretto "<i>opening soon</i>":<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-hJAGIoPKxg0/Wzt7O-m2UoI/AAAAAAAAKpo/6NZ8teD38xseD761nLuOgJpQjQ9D1hVQQCLcBGAs/s1600/tatto_next_opening.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="600" data-original-width="800" height="300" src="https://4.bp.blogspot.com/-hJAGIoPKxg0/Wzt7O-m2UoI/AAAAAAAAKpo/6NZ8teD38xseD761nLuOgJpQjQ9D1hVQQCLcBGAs/s400/tatto_next_opening.png" width="400" /></a></div>
<br />
Mi chiedo se l'autore si sia ispirato ad <a href="http://blog.terminologiaetc.it/2018/01/19/prossima-apertura-traduzione-inglese/" target="_blank">esempi sbagliati di altri, anche illustri</a>, oppure si sia fidato di quanto ottenuto dando in pasto l'espressione a <a href="https://translate.google.com/#it/en/prossima%20apertura" target="_blank">Google Translate</a>, che incoraggia a fidarsi di quanto proposto con un contrassegno di qualità accompagnato dalla scritta "<i>Questa traduzione è stata controllata dalla Community di Google Traduttore</i>"...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-hOxBVudbp5A/Wzt8VmDaVoI/AAAAAAAAKp0/Z-u44ZD97yQeWnVQFPqn8ArRyEEc49ibQCLcBGAs/s1600/google_translate_next_opening.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="400" data-original-width="800" height="200" src="https://1.bp.blogspot.com/-hOxBVudbp5A/Wzt8VmDaVoI/AAAAAAAAKp0/Z-u44ZD97yQeWnVQFPqn8ArRyEEc49ibQCLcBGAs/s400/google_translate_next_opening.png" width="400" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-37229190074314878162016-02-03T10:23:00.003+01:002016-02-03T10:31:26.863+01:00L'importanza dei titoliIl Sole 24 Ore ha pubblicato recentemente un <a href="http://www.ilsole24ore.com/art/tecnologie/2016-02-02/bitcoin-non-e-sicuro-170847.shtml?uuid=ACi1ZDMC" target="_blank">articolo</a> di Massimo Chiaratti intitolato «I (falsi) miti più comuni di bitcoin e della valute virtuali».<br />
<br />
Il primo mito sfatato è che "Bitcoin non è sicuro". Si tratta di un mito, appunto. Come giustamente spiega Chiaratti, infatti, «con la sufficiente attenzione è possibile proteggere i propri bitcoin in maniera anche più efficace di quanto non sia possibile con gli strumenti di pagamento a cui siamo abituati.»<br />
<br />
Il problema è che il titolo della pagina web, che compare bene in evidenza nella barra principale del browser, e che assume particolare importanza quando i documenti vengono indicizzati e presentati dai motori di ricerca, sembra affermare esattamente il contrario, visto che è esattamente «Bitcoin non è sicuro»:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-SG_P0fL4zoE/VrHGnbisasI/AAAAAAAABvI/uMg2ofn6_QE/s1600/bitcoin_24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="366" src="http://1.bp.blogspot.com/-SG_P0fL4zoE/VrHGnbisasI/AAAAAAAABvI/uMg2ofn6_QE/s400/bitcoin_24.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Con buona probabilità, il titolo della pagina è stato generato automaticamente in base alle prime parole dell'articolo, e non è stato controllato accuratamente. Può succedere, ma è una cosa a cui è necessario prestare attenzione per evitare effetti indesiderati.</div>
<div class="separator" style="clear: both; text-align: left;">
L'errore è presente in tutte le pagine successive: Bitcoin è anonimo, Bitcoin non è una moneta, ecc.</div>
<div class="separator" style="clear: both; text-align: left;">
Sarebbe sufficiente aggiungere (almeno nel titolo della pagina, visto che se uno legge l'articolo risulta chiaro) che si tratta di un mito sfatato: «Mito sfatato: Bitcoin non è sicuro», ad esempio, sarebbe senz'altro più corretto.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-44958624868214265212016-01-07T22:41:00.001+01:002016-01-08T07:01:42.432+01:00Google e le ricerche di documenti in formato OpenDocument<br />
<a href="http://www.corrierecomunicazioni.it/tlc/38826_le-conseguenze-del-cloud-office-e-sempre-piu-open.htm" target="_blank">LibreOffice cresce</a>, e i documenti presenti "nella nuvola" sono sempre più svincolati dal monopolio di Microsoft. Bisognerebbe farlo sapere a Google, che nella propria <a href="https://www.google.it/advanced_search?hl=it" target="_blank">pagina per la ricerca avanzata</a> non propone i formati <a href="https://it.wikipedia.org/wiki/OpenDocument" target="_blank">OpenDocument</a> tra quelli presenti nella lista del tipo di file:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Fl4TutZifJE/Vo7Y0t5wwDI/AAAAAAAABt8/ur3gvsS2CSg/s1600/Google_advanced_search.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="http://2.bp.blogspot.com/-Fl4TutZifJE/Vo7Y0t5wwDI/AAAAAAAABt8/ur3gvsS2CSg/s400/Google_advanced_search.png" width="400" /></a></div>
<br />
Strano, a dire il vero, anche perché la ricerca dei documenti <i>LibreOffice</i> e <i>OpenOffice</i> in realtà è supportata. È sufficiente aggiungere nella query di ricerca il parametro <b>filetype:odt</b> (oppure <b>ods</b>, <b>odp</b>, ecc.):<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-Nm4dARhfOC8/Vo7a8WHs3EI/AAAAAAAABuI/10kBM02Zxew/s1600/ricerca_google_odt.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="260" src="http://1.bp.blogspot.com/-Nm4dARhfOC8/Vo7a8WHs3EI/AAAAAAAABuI/10kBM02Zxew/s400/ricerca_google_odt.png" width="400" /></a></div>
<br />
Basterebbe poco per cambiare l'interfaccia utente...<br />
<br />
<br />
<br />
<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"><img alt="Licenza Creative Commons" src="https://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width: 0;" /></a><br />
<span href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type" xmlns:dct="http://purl.org/dc/terms/">Google e le ricerche di documenti in formato OpenDocument</span> di <a href="http://blog.loris.tissino.it/2016/01/google-e-formato-opendocument.html" property="cc:attributionName" rel="cc:attributionURL" xmlns:cc="http://creativecommons.org/ns#">Loris Tissino</a> è distribuito con Licenza <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">Creative Commons Attribuzione 4.0 Internazionale</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-17537380237392342642015-11-09T22:59:00.001+01:002015-11-10T18:15:50.404+01:00Creative Commons, e se l'autore cambia idea?Per chi se la fosse persa e fosse a digiuno di informazioni in merito alle licenze Creative Commons, segnalo l'interessante <a href="http://aliprandi.blogspot.it/2015/11/creative-commons-introduzione-andrialearning.html" target="_blank">videolezione di Simone Aliprandi</a> nell'ambito del progetto AndriaLearning curato da Francesco Leonetti.<br />
<br />
Credo che alla trattazione manchi un punto fondamentale, quello delle variazioni dei dati nel corso della storia. Mi spiego con un esempio.<br />
<br />
Immaginiamo che Tizio pubblichi nel 2015 un'opera nel suo sito web, attribuendo una licenza CC Share-Alike. Caio utilizza quest'opera, ne crea una derivata dopo aver consultato la licenza che lo autorizza, e la pubblica nel proprio sito web nel 2016. Fin qui, tutto bene.<br />
<br />
Ma che cosa succede se Tizio, nel 2017, toglie dal proprio sito il riferimento alla licenza CC precedentemente applicata? Naturalmente, il comportamento sarebbe riprovevole ma non illecito (la licenza su un'opera <a href="http://aliprandi.blogspot.it/2014/01/licenze-cc-irrevocabili.html" target="_blank">può essere revocata</a>, ma le opere già in circolazione rimangono con la licenza originaria); e comunque è tecnicamente fattibile. Se si tratta di un'opera che ha avuto una certa diffusione e che molti possono testimoniare di aver visto come rilasciata con licenza CC Share-Alike, nessun problema. Però immaginiamoci il caso in cui Tizio sia un autore poco noto, e che solo Caio abbia scaricato e utilizzato la sua opera. Come può fare Caio, nel 2018, a dimostrare che Tizio nel 2015 aveva pubblicato l'opera con una determinata licenza?<br />
<br />
Il punto è che il web è stato pensato per essere costantemente aggiornato e modificabile e ciò comporta <a href="http://www.newyorker.com/magazine/2015/01/26/cobweb" target="_blank">problemi non irrilevanti</a>. Come fare, in generale, a provare che un certo contenuto, in un dato momento, era quello indicato? Una soluzione potrebbe essere quella di utilizzare servizi come <a href="http://archive.org/">archive.org</a> o <a href="http://perma.cc/">perma.cc</a>, ma anche questi lasciano un po' a desiderare. Per dirne una, rimane il problema che ad uno stesso indirizzo di risorsa su web potrebbero corrispondere contenuti diversi a seconda di provenienza geografica della richiesta, lingua preferita nel browser, dimensioni e risoluzione dello schermo, ecc. Potrebbe ben succedere che il link ad una licenza (così come qualsiasi altro contenuto) compaia o scompaia anche a seconda del dispositivo usato per la lettura. Quindi Caio potrebbe vedere con lo smartphone che il contenuto di Tizio è rilasciato con licenza CC, mentre un'altra persona (o un servizio di archiviazione digitale automatico), anche nello stesso istante, potrebbe avere un'informazione diversa.<br />
<br />
Insomma, possono insorgere problemi dovuti alla natura tecnica del web e al fatto che ciò che vediamo è cambiato, e non tutti i siti hanno, come Wikipedia, <a href="https://it.wikipedia.org/w/index.php?title=Aiuto:Cronologia&oldid=70286738" target="_blank">traccia di tutte le modifiche apportate ai contenuti</a>. Anzi, quasi sempre queste informazioni non esistono. E l'onere della prova rimane comunque in capo a chi riutilizza l'opera.<br />
<br />
Per completezza, riporto quanto Simone Aliprandi ha scritto nel suo libro <a href="http://www.aliprandi.org/manuale-cc" target="_blank">Creative Commons: manuale operativo</a>:<br />
<blockquote class="tr_bq">
<i>... l'utente che trova un'opera con il richiamo
ad una licenza, la può riutilizzare facendo affidamento sul fatto
che tale richiamo sia stato effettivamente apposto dal titolare dei
diritti. Purtroppo, la comunicazione Internet non permette di
tenere traccia di ogni passaggio e dunque può verificarsi la
malaugurata ipotesi che il titolare dei diritti non voglia affatto
rilasciare la sua opera con Creative Commons e che quindi
la licenza sia stata aggiunta (in buona fede o in mala fede) da
un altro soggetto non titolato a farlo.<br />Si tratta in verità di un caso abbastanza limite; e la dottrina
giuridica comunque risolve i dilemma applicando la
teoria dell'affidamento. Secondo questa teoria, un negozio
giuridico è valido se vi è contrasto tra volontà e dichiarazione
ma colui che riceve la dichiarazione non era in grado di accorgersi
del contrasto usando l'ordinaria diligenza. </i></blockquote>
<hr />
<i>Post modificato dopo la pubblicazione originale.</i><br />
<br />
<a href="http://creativecommons.org/licenses/by/4.0/" rel="license"><img alt="Licenza Creative Commons" src="https://i.creativecommons.org/l/by/4.0/88x31.png" style="border-width: 0;" /></a><br />
<span href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type" xmlns:dct="http://purl.org/dc/terms/">Creative Commons, e se l'autore cambia idea?</span> di <a href="http://blog.loris.tissino.it/2015/11/cc-autore-cambia-idea.html" property="cc:attributionName" rel="cc:attributionURL" xmlns:cc="http://creativecommons.org/ns#">Loris Tissino</a> è distribuito con Licenza <a href="http://creativecommons.org/licenses/by/4.0/" rel="license">Creative Commons Attribuzione 4.0 Internazionale</a>.
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3828295.post-39981700213664564332015-02-18T17:06:00.000+01:002015-11-09T22:32:24.593+01:00Copia di cortesia, conforme o no?Il recente post di Simone Aliprandi sul tema della richiesta, in alcuni tribunali, di una <a href="http://aliprandi.blogspot.it/2015/02/disciplina-obbligatorie-copie-cortesia.html" target="_blank">copia di cortesia, cartacea, di documenti consegnati on-line</a> mi ha fatto tornare in mente una problematica che ho affrontato anni fa in tutt'altro ambito.<br />
<br />
Il problema, ora come allora, deriva dal fatto che qualcuno (un privato, una controparte commerciale, un ente pubblico, un'istituzione: non fa differenza) chiede un documento in forma digitale, ma poi lo richiede, per propria semplicità di fruizione e di gestione, anche in forma stampata.<br />
<br />
Immaginate un insegnante che chiede ai propri allievi di inviare il testo del compito sia via email sia consegnandone una versione cartacea; oppure l'ufficio tecnico di un comune che chiede una copia del progetto in forma di file vettoriale e una in versione stampata; oppure, come nel caso segnalato, un magistrato che, dovendo adeguarsi al nuovo processo telematico che impone la gestione degli atti tramite, appunto, l'invio telematico degli stessi, pensa bene di chiedere agli avvocati di depositare anche una copia di cortesia.<br />
<br />
In tutti questi casi, si pone il problema del se e del come controllare la conformità dei due documenti che uno poi si trova in mano.<br />
<br />
Che cosa succede, infatti, se un giudice decide in una causa alla luce di quanto trova stampato in un documento, e la copia cartacea dello stesso è diversa da quella depositata digitalmente? se il progetto per un nuovo edificio viene approvato in base a quanto l'impiegato vede nella versione cartacea dello stesso, con informazioni diverse rispetto a quelle presenti nel file inviato digitalmente? se l'insegnante mette un voto in base a quanto trova scritto nel documento inviato via email (giusto per fare l'esempio opposto) ma poi archivia quello ottenuto in versione cartacea?<br />
<br />
Voglio trascurare qui il caso di chi - intenzionalmente e fraudolentemente - consegna due documenti diversi in una forma e nell'altra. La domanda piuttosto è: <b>potrebbe succedere che</b>, per mero errore materiale, <b>le due copie non coincidano</b>, oppure <b>non appaiano allo stesso modo?</b> La mia risposta è: certo. Alcuni casi plausibili, tutti con alla base comportamenti in piena buona fede, potrebbero essere i seguenti:<br />
<br />
<ul>
<li>Tizio ha nel disco del computer due documenti, diciamo <i>DocumentoA_versione1.pdf</i> e <i>DocumentoA_versione2.pdf</i>. Invia telematicamente il primo e stampa, alcuni minuti dopo, il secondo.</li>
<li>Tizio sta lavorando su <i>DocumentoA_versione_finale.odt</i>. Il documento è ancora aperto e con alcune piccole modifiche non ancora salvate. Tizio non se ne accorge, effettua l'invio telematico, poi salva il documento con le modifiche e lo stampa.</li>
<li>Tizio sta lavorando su <i>DocumentoA_versione_finale.odt</i>. Stampa il documento, si accorge di qualche piccolo errore di battitura (un accento sbagliato, una virgola mancante), corregge il documento e invia telematicamente la versione corretta.</li>
<li>Il documento che Tizio sta guardando con il proprio calcolatore è una pagina web. La stampa. Poi salva la pagina web su disco, senza sapere che nelle pagine web è possibile (molto spesso accade) fare in modo che alcune parti vengano visualizzate o meno <a href="http://www.w3.org/TR/CSS21/media.html" target="_blank">a seconda che lo strumento di fruizione sia una stampante o uno schermo</a>. </li>
<li>Il documento che Tizio ha sotto gli occhi è un file PDF, in cui tutto il testo è selezionabile / visibile / copiabile / elaborabile, anche quello con una pecetta nera che copre alcune scritte. Stampandolo, quelle scritte rimangono nere, perse per sempre. (Forse qualcuno si ricorda del caso del <a href="http://news.bbc.co.uk/2/hi/europe/4506517.stm" target="_blank">documento CIA declassificato dai lettori</a>?)</li>
<li>Il documento PDF che Tizio ha sotto gli occhi contiene un'immagine posta sul bordo del foglio, con un particolare molto importante proprio vicino all'estremità della pagina. Nella versione stampata, consegnata a Caio, quel dettaglio manca, perché la stampante ha un margine di uno o due centimetri in cui non riesce a stampare. Caio vedrà il dettaglio o no? (I file PDF possono presentare <a href="http://blog.magcloud.com/2011/06/28/pdf-101-ten-common-pdf-problems/" target="_blank">molti altri problemi</a>, ad esempio in caso di risoluzione non adeguata alla stampa, colori non adatti, font non incorporati, ecc.)</li>
<li>Il documento di Tizio ha qualche forma di intelligenza che lo rende diverso ogni volta che viene aperto. Non ci vuole granché: basta una formula di un foglio elettronico che si basi sul valore di ADESSO() o un piè di pagina di un documento che riporta la data corrente. Chi aprirà il documento si troverà qualcosa di diverso rispetto alla versione stampata.</li>
<li>Tizio invia un documento in forma telematica a Caio, e poi gli consegna anche una versione cartacea. Caio non considera la copia cartacea e legge il documento inviatogli digitalmente, dove però, in forma di revisione non cancellata, compare del testo non presente nel documento stampato. Tizio si lamenta quando scopre che Caio ha letto delle informazioni che nella versione cartacea non c'erano.</li>
</ul>
<br />
Tutti questi sono casi perfettamente plausibili di mancanza di conformità tra il documento in formato digitale e quello stampato. Quale dei due dovrebbe avere valore probatorio / legale?<br />
<br />
<a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Licenza Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br /><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">Copia di cortesia, conforme o no?</span> di <a xmlns:cc="http://creativecommons.org/ns#" href="http://blog.loris.tissino.it/2015/02/copia-di-cortesia-conforme-o-no.html" property="cc:attributionName" rel="cc:attributionURL">Loris Tissino</a> è distribuito con Licenza <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribuzione 4.0 Internazionale</a>.
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-1072748620957731792014-10-05T11:00:00.002+02:002014-10-05T13:23:10.507+02:00Programmazione in basic con LibreOfficeSe si vogliono fare degli esercizi di programmazione con strumenti multipiattaforma e senza avere la necessità di un ambiente di sviluppo troppo complesso, tra le alternative a disposizione c'è la suite LibreOffice / OpenOffice, che mette a disposizione un editor di macro e uno strumento di progettazione di finestre di dialogo che possono fare al caso nostro per piccoli esperimenti.<br />
<br />
Quanto segue è stato testato su LibreOffice 4.2.6.3, ma dovrebbe funzionare senza problemi anche con altre versioni di LibreOffice / OpenOffice.<br />
<br />
<h3>
Creiamo un documento contenitore</h3>
Possiamo salvare il codice della nostra miniapplicazione sia nell'ambito del nostro spazio di lavoro personale sia in specifici documenti. Se vogliamo poter utilizzare ovunque il nostro codice, dovremo scegliere la seconda opzione.<br />
<br />
Quindi, partiamo con il salvare un documento Calc (un foglio elettronico) con un nome, come ad esempio <i>ProgrammareLOconVB.ods</i>. Questo documento conterrà i nostri dati ma anche il codice che scriveremo e le finestre di dialogo che prepareremo.<br />
<br />
<h3>
Creare una finestra di dialogo</h3>
Per creare una finestra di dialogo, fare clic su <i>Strumenti</i> / <i>Macro</i> / <i>Organizza finestre di dialogo...</i>.<br />
<br />
Ci appare una finestra in cui possiamo lavorare con le nostre finestre di dialogo. Visto che ancora non ne abbiamo una, dobbiamo:<br />
<br />
1. selezionare il contenitore <i>Standard</i> del documento su cui stiamo lavorando;<br />
2. fare clic su <i>Nuovo...</i>;<br />
3. assegnare un nome alla finestra di dialogo (ad esempio, <i>ShoppingListManager</i>);<br />
4. fare clic su <i>Modifica</i>.<br />
<br />
Si dovrebbe aprire l'editor delle finestre di dialogo, come nella seguente immagine:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-FVfAloUtt9c/VDEEMSt-6VI/AAAAAAAABng/-RFxusjCwgQ/s1600/editor_fdd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-FVfAloUtt9c/VDEEMSt-6VI/AAAAAAAABng/-RFxusjCwgQ/s1600/editor_fdd.png" height="347" width="400" /></a></div>
<br />
<br />
Abbiamo a disposizione un insieme di controlli che potremo disporre nella finestra:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Y8c3fSM0KA8/VDEETp1iVsI/AAAAAAAABno/4stmM6E52DQ/s1600/casellastrumenti.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Y8c3fSM0KA8/VDEETp1iVsI/AAAAAAAABno/4stmM6E52DQ/s1600/casellastrumenti.png" /></a></div>
<br />
<br />
Se per caso non dovesse comparire, fare clic su <i>Visualizza</i> / <i>Barre degli strumenti</i> / <i>Casella degli strumenti</i>.<br />
<br />
<h3>
Aggiungere qualche controllo</h3>
Nella finestra di dialogo, aggiungiamo tre controlli, per preparare un esempio semplice: vogliamo una casella di testo in cui l'utente possa preparare una lista della spesa, scrivendo degli elementi in una casella di testo che verranno via via aggiunti alla lista (alla pressione di un pulsante).<br />
<br />
Quando si seleziona un controllo, nella parte sinistra della finestra compare una scheda dove si possono definire le diverse proprietà. Attribuiamo un nome ai nostri tre controlli e impostiamo altre proprietà che desideriamo. Per selezionare la finestra di dialogo e cambiarne le proprietà, bisogna fare clic sul suo margine esterno.<br />
<br />
Il risultato finale potrebbe essere simile al seguente:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-mCovieyTBhI/VDEEl3rmu6I/AAAAAAAABnw/fbbdgj8L6B4/s1600/finestrapronta.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-mCovieyTBhI/VDEEl3rmu6I/AAAAAAAABnw/fbbdgj8L6B4/s1600/finestrapronta.png" height="239" width="320" /></a></div>
<br />
<br />
Sono stati attribuiti i seguenti nomi ai controlli:<br />
<br />
<ul>
<li><span style="font-family: inherit;"><i>txtItem</i></span></li>
<li><i>cmdAddToItem</i></li>
<li><i>lstShoppingList</i></li>
</ul>
<br />
<h3>
Far apparire la finestra</h3>
Il codice per far apparire la finestra, come riportato nel <a href="https://wiki.openoffice.org/wiki/Documentation/DevGuide/Basic/Showing_a_Dialog" target="_blank">wiki di OpenOffice</a>, è il seguente:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Dim oDialog AS Object</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Sub StartShoppingListManagerDialog</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Dim oLibContainer As Object, oLib As Object</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Dim oInputStreamProvider As Object</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Const sLibName = "Standard"</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Const sDialogName = "ShoppingListManager"</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' library container</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oLibContainer = DialogLibraries</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' load the library</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oLibContainer.loadLibrary( sLibName )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' get library</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oLib = oLibContainer.getByName( sLibName )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' get input stream provider</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oInputStreamProvider = oLib.getByName( sDialogName )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' create dialog control</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oDialog = CreateUnoDialog( oInputStreamProvider )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> ' show the dialog</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> oDialog.execute()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">End Sub</span><br />
<br />
Dove dobbiamo inserirlo? In un modulo, naturalmente. Nel documento Calc, fare clic su <i>Strumenti</i> / <i>Macro</i> / <i>Organizza macro</i> / <i>LibreOffice Basic...</i>.<br />
Selezionare il documento Calc, e fare clic su <i>Nuovo</i>. Viene chiesto un nome per il modulo. Possiamo confermare il nome <i>Modulo1</i>.<br />
Sostituire il codice presente con quello riportato qui sopra. Si dovrebbe ottenere qualcosa di simile a questo:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-pcS01tCVtJE/VDEFWazXMpI/AAAAAAAABn8/gLkGbzNNKsI/s1600/primoesempiocodicevb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-pcS01tCVtJE/VDEFWazXMpI/AAAAAAAABn8/gLkGbzNNKsI/s1600/primoesempiocodicevb.png" height="333" width="400" /></a></div>
<br />
<br />
Siamo pronti per far apparire la finestra di dialogo. È sufficiente, nel foglio di lavoro, fare clic su <i>Strumenti</i> / <i>Macro</i> / <i>Esegui macro...</i>, selezionare la macro <i>StartShoppingListManagerDialog</i> e fare clic su <i>Esegui</i>.<br />
<br />
Se vogliamo, possiamo aggiungere un pulsante e un gestore di eventi al foglio elettronico Calc, in modo da velocizzare l'operazione. In Calc, far visualizzare i controlli per formulario (<i>Visualizza</i> / <i>Barre degli strumenti</i> / <i>Controlli per il formulario</i>), selezionare tra essi il pulsante e posizionarlo nel foglio di lavoro. Facendoci clic con il pulsante destro del mouse, si attiva la scheda per la definizione delle proprietà e degli eventi. Impostare un nome e un testo da far comparire; poi, nella scheda eventi, associare all'evento "Eseguire l'azione" la procedura di avvio della finestra di dialogo.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hPUJbl0HHlw/VDEF5JdGNeI/AAAAAAAABoE/ax43CRmHO00/s1600/associazioneevento.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-hPUJbl0HHlw/VDEF5JdGNeI/AAAAAAAABoE/ax43CRmHO00/s1600/associazioneevento.png" height="192" width="400" /></a></div>
<br />
<br />
Attenzione: per poter provare il funzionamento del pulsante che abbiamo definito, bisogna fare clic su <i>Modo bozza (sì/no)</i> della barra degli strumenti <i>Controlli del formulario</i>.<br />
<br />
<h3>
Gestire gli eventi della finestra</h3>
Nella finestra di dialogo, possiamo associare al pulsante una macro per gestire l'evento "Eseguire l'azione". Visto che desideriamo che il valore presente nel campo di testo venga aggiunto alla lista, il codice sarà simile al seguente:<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">Sub cmdAddToList_click</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> Dim txtItem as Object, lstShoppingList as Object</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> txtItem = oDialog.getControl("txtItem")</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> lstShoppingList = oDialog.getControl("lstShoppingList")</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> lstShoppingList.addItem(txtItem.Text, lstShoppingList.getItemCount())</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> txtItem.setText("")</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> txtItem.setFocus()</span><br />
<span class="Apple-tab-span" style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">End Sub</span><br />
<br />
Dovremo poi associare la macro all'evento "Eseguire l'azione" del pulsante, come visto precedentemente.<br />
<br />
<h3>
Ulteriori informazioni</h3>
Una descrizione degli eventi gestibili per i vari controlli è disponibile nel <a href="https://help.libreoffice.org/Common/Events_2/it" target="_blank">wiki di LibreOffice</a>.<br />
<br />
Informazioni sulle proprietà e i metodi di <a href="https://wiki.openoffice.org/wiki/Documentation/DevGuide/Basic/List_Box" target="_blank">caselle di riepilogo</a> e <a href="https://wiki.openoffice.org/wiki/Documentation/DevGuide/Basic/Text_Field" target="_blank">caselle di testo</a> sono nel wiki di OpenOffice.<br />
<br />
Quando un oggetto viene istanziato, è possibile verificarne a tempo di esecuzione quali sono le sue proprietà, i suoi metodi e le sue interfacce.<br />
<br />
Ad esempio, avendo a disposizione il nostro oggetto txtItem, potremo aggiungere al nostro codice<br />
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> MsgBox txtItem.dbg_methods</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> MsgBox txtItem.dbg_supportedInterfaces</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> MsgBox txtItem.dbg_properties</span><br />
<br />
e far comparire i messaggi informativi che ci servono.<br />
<br />
<h3>
Note sulla sicurezza</h3>
L'esecuzione di una macro di cui non si conosce la provenienza è potenzialmente pericolosa. Per questo motivo, in LibreOffice / OpenOffice è disattivata.<br />
Facendo clic su <i>Strumenti</i> / <i>Opzioni</i> / <i>LibreOffice</i> / <i>Sicurezza</i> e poi sul pulsante <i>Sicurezza delle macro...</i> viene offerta la possibilità di configurare il livello appropriato. Se si ricevono documenti con delle macro, ricordarsi di controllarne sempre il contenuto prima di eseguirle (impostando il livello di sicurezza su "Medio", all'apertura del documento viene chiesto se si vogliono eseguire, e potremo rispondere di no per dare un'occhiata al codice).<br />
<br />
<h3>
Esportazione del codice sorgente</h3>
Se si desidera esportare il codice sorgente di un'applicazione, ad esempio per utilizzare un sistema di controllo di versione, è possibile sfruttare il fatto che i file ods sono semplici file zip con all'interno dei documenti XML. In particolare, troveremo all'interno del file ods un file XML per ogni modulo visual basic e per ogni finestra di dialogo impostata.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-u4WPEfzDJuw/VDEHL3y0weI/AAAAAAAABoQ/Qji6qGYsJek/s1600/filezip.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-u4WPEfzDJuw/VDEHL3y0weI/AAAAAAAABoQ/Qji6qGYsJek/s1600/filezip.png" height="320" width="221" /></a></div>
<br />
<br />
<h3>
File di esempio</h3>
<div>
Il file completo, <i>ProgrammareLOconVB.ods</i>, è disponibile nella <a href="http://loris.tissino.it/didattica/foglio-elettronico" target="_blank">sezione didattica / foglio elettronico del mio sito</a>.</div>
twhttp://www.blogger.com/profile/08558427199604737148noreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-20931903885818915702014-08-03T12:16:00.000+02:002014-08-03T12:26:02.842+02:00Le Frecce senz'apostrofo e senza trattiniAvete mai provato ad acquistare un biglietto ferroviario online, nel sito delle <a href="https://www.lefrecce.it/" target="_blank">Frecce</a>? La cosa è abbastanza semplice se, come capita a me, nome e cognome non comprendono caratteri particolari, dove per "particolare" intendo qualsiasi cosa non appartenga all'alfabeto latino/inglese A-Z. Quindi, ad esempio, niente lettere accentate e niente apostrofi.<br />
<br />
Al momento della compilazione del campo del cognome, infatti, viene richiamato un piccolo codice Javascript che elimina i caratteri non validi. Immaginate di avere un cognome contenente un apostrofo e un trattino. L'apostrofo non riuscite a digitarlo, mentre il trattino è consentito.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-Ob-Fwmn6ifE/U94KerNxQRI/AAAAAAAABM4/xe2b7T_Z8-I/s1600/autenticazione_frecce.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-Ob-Fwmn6ifE/U94KerNxQRI/AAAAAAAABM4/xe2b7T_Z8-I/s1600/autenticazione_frecce.png" height="87" width="400" /></a></div>
<br />
<br />
Tutto bene? No, perché al momento del passaggio alla fase di pagamento non si riesce a procedere, ed un messaggio avverte che "Credentiale non e valido" (sic).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-nfC2ZEqpDo8/U94K8xNhhtI/AAAAAAAABNA/2_f_V7g3gRk/s1600/errore_frecce.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-nfC2ZEqpDo8/U94K8xNhhtI/AAAAAAAABNA/2_f_V7g3gRk/s1600/errore_frecce.png" height="102" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Che cosa si debba intendere per "credenziale", perché non sia valida, o come risolvere il problema non è dato sapere. Fra l'altro, dopo dieci minuti la sessione scade, e bisogna ricominciare tutto da capo, a partire dalla selezione delle stazioni di partenza e di arrivo.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Alla fine, l'acquisto è andato a buon fine, ma solo perché sono stati eliminati i trattini.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-63739930192943933422014-06-28T11:39:00.003+02:002014-06-28T11:39:53.648+02:00Visualizzazione di algoritmiBellissimo il post <a href="http://bost.ocks.org/mike/algorithms/" target="_blank">Visualizing Algorithms</a> di Mike Bostock, che introduce con degli ottimi esempi l'importanza della visualizzazione dei risultati di un algoritmo, del grado di correttezza dello stesso o, semplicemente, dei passi che sono stati necessari per ottenere un determinato risultato.<br />
<br />
Nella prima parte, dedicata alle tecniche di campionamento, Mike illustra tre diversi algoritmi per la generazione casuale di punti all'interno di un rettangolo, che si desiderano distribuiti in maniera da evitare pattern riconoscibili. Oltre a visualizzare il risultato, si può visualizzare a colpo d'occhio la bontà del risultato raggiunto. Si confrontino ad esempio queste due immagini<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-lFqVJIy7i94/U66IXZWfCsI/AAAAAAAABko/-T8R_WfksbM/s1600/uniform-random-voronoi.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-lFqVJIy7i94/U66IXZWfCsI/AAAAAAAABko/-T8R_WfksbM/s1600/uniform-random-voronoi.jpg" height="200" width="200" /></a> <a href="http://3.bp.blogspot.com/-uCGj0aSVdXE/U66IZGWPaQI/AAAAAAAABkw/p_sZlJKaDQc/s1600/poisson-disc-voronoi.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-uCGj0aSVdXE/U66IZGWPaQI/AAAAAAAABkw/p_sZlJKaDQc/s1600/poisson-disc-voronoi.jpg" height="200" width="200" /></a></div>
<br />
nelle quali le macchie più scure rappresentano le aree sottocampionate, e quelle più chiare le aree sovracampionate. Ci si rende conto facilmente che l'algoritmo alla base della seconda immagine è migliore.<br />
<br />
Nella seconda parte, un'immagine mostra meglio di mille parole quale problema può nascere dall'utilizzo di un algoritmo usato per un mescolamento casuale di un mazzo di carte (o di qualsiasi altra cosa):<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-R_Z0A93iJQ8/U66KE6sahZI/AAAAAAAABk8/klH_YbeyhFo/s1600/pseudorandom_shuffle.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-R_Z0A93iJQ8/U66KE6sahZI/AAAAAAAABk8/klH_YbeyhFo/s1600/pseudorandom_shuffle.png" height="126" width="400" /></a></div>
<br />
Se l'obiettivo è di avere una distribuzione equiprobabile delle carte, ci possiamo rendere conto, semplicemente visualizzando con diversi colori la distanza dall'obiettivo, quanto siamo lontani da un'implementazione corretta.<br />
<br />
Nella terza parte Mark mostra come si possa visualizzare l'esecuzione "passo passo" di un algoritmo, tracciando un grafico che rappresenta la serie di scambi di un quick sort.<br />
<br />
Nella quarta parte, forse la più divertente da vedere, sono poi presentati diversi algoritmi per la generazione di labirinti, con una rappresentazione di alberi e della lunghezza dei singoli percorsi basata su una scala di colori.<br />
<br />
Come dice Mark, la visualizzazione degli algoritmi può essere un valido ausilio per l'intrattenimento (è divertente vedere gli algoritmi all'opera), per l'insegnamento, per il debugging e per la costruzione di un'interfaccia utente per l'input di dati che sono collegati reciprocamente tra di loro, come nel caso della <a href="http://www.nytimes.com/interactive/2014/upshot/buy-rent-calculator.html?_r=0" target="_blank">scelta tra acquisto di una casa o affitto</a> della stessa. Come dargli torto?<br />
<br />
<br />twhttp://www.blogger.com/profile/08558427199604737148noreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-46301963879301074052014-06-05T15:24:00.001+02:002014-06-05T15:24:58.972+02:00Fatture in formato XMLDa domani chiunque emetterà fatture verso gli organi centrali della pubblica amministrazione in Italia, dovrà obbligatoriamente predisporre la fattura in formato XML.<br />
<br />
Il Governo ha anche preparato un sito internet, <a href="http://www.fatturapa.gov.it/export/fatturazione/it/index.htm">www.fatturapa.gov.it</a>, che offre la necessaria documentazione. E fin qui tutto bene.<br />
<br />
Ma se si vanno a leggere le specifiche, si può vedere che tutti gli elementi previsti dal DTD sono in italiano, o in alcuni casi in un innaturale mix italiano-inglese. L'<a href="http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.0/IT01234567890_11111.xml" target="_blank">esempio di una fattura singola con una sola linea di fattura</a> prevede elementi di questo tipo:<br />
<br />
<br />
<div class="line" style="font-family: monospace; font-size: 13px;">
<span class="webkit-html-tag"><CedentePrestatore></span></div>
<div class="collapsible-content" style="font-family: monospace; font-size: 13px; margin-left: 1em;">
<span class="text"></span><div class="collapsible" id="collapsible6">
<div class="expanded">
<div class="line">
<span class="button collapse-button" style="-webkit-user-select: none; background-image: -webkit-canvas(arrowDown); background-position: 0% 0%; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; height: 10px; margin-left: -10px; vertical-align: bottom; width: 10px;"></span><span class="webkit-html-tag"><DatiAnagrafici></span></div>
<div class="collapsible-content" style="margin-left: 1em;">
<span class="text"></span><div class="collapsible" id="collapsible7">
<div class="expanded">
<div class="line">
<span class="button collapse-button" style="-webkit-user-select: none; background-image: -webkit-canvas(arrowDown); background-position: 0% 0%; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; height: 10px; margin-left: -10px; vertical-align: bottom; width: 10px;"></span><span class="webkit-html-tag"><IdFiscaleIVA></span></div>
<div class="collapsible-content" style="margin-left: 1em;">
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><IdPaese></span><span class="text">IT</span><span class="webkit-html-tag"></IdPaese></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><IdCodice></span><span class="text">01234567890</span><span class="webkit-html-tag"></IdCodice></span></div>
<span class="text"></span></div>
<div class="line">
<span class="webkit-html-tag"></IdFiscaleIVA></span></div>
</div>
</div>
<span class="text"></span><div class="collapsible" id="collapsible8">
<div class="expanded">
<div class="line">
<span class="button collapse-button" style="-webkit-user-select: none; background-image: -webkit-canvas(arrowDown); background-position: 0% 0%; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; height: 10px; margin-left: -10px; vertical-align: bottom; width: 10px;"></span><span class="webkit-html-tag"><Anagrafica></span></div>
<div class="collapsible-content" style="margin-left: 1em;">
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Denominazione></span><span class="text">Societa' alpha S.r.l.</span><span class="webkit-html-tag"></Denominazione></span></div>
<span class="text"></span></div>
<div class="line">
<span class="webkit-html-tag"></Anagrafica></span></div>
</div>
</div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><RegimeFiscale></span><span class="text">RF01</span><span class="webkit-html-tag"></RegimeFiscale></span></div>
<span class="text"></span></div>
<div class="line">
<span class="webkit-html-tag"></DatiAnagrafici></span></div>
</div>
</div>
<span class="text"></span><div class="collapsible" id="collapsible9">
<div class="expanded">
<div class="line">
<span class="button collapse-button" style="-webkit-user-select: none; background-image: -webkit-canvas(arrowDown); background-position: 0% 0%; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; height: 10px; margin-left: -10px; vertical-align: bottom; width: 10px;"></span><span class="webkit-html-tag"><Sede></span></div>
<div class="collapsible-content" style="margin-left: 1em;">
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Indirizzo></span><span class="text">Via Roma</span><span class="webkit-html-tag"></Indirizzo></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><CAP></span><span class="text">00166</span><span class="webkit-html-tag"></CAP></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Comune></span><span class="text">Roma</span><span class="webkit-html-tag"></Comune></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Provincia></span><span class="text">RM</span><span class="webkit-html-tag"></Provincia></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Nazione></span><span class="text">IT</span><span class="webkit-html-tag"></Nazione></span></div>
<span class="text"></span></div>
<div class="line">
<span class="webkit-html-tag"></Sede></span></div>
</div>
</div>
<span class="text"></span><div class="collapsible" id="collapsible10">
<div class="expanded">
<div class="line">
<span class="button collapse-button" style="-webkit-user-select: none; background-image: -webkit-canvas(arrowDown); background-position: 0% 0%; background-repeat: no-repeat no-repeat; cursor: pointer; display: inline-block; height: 10px; margin-left: -10px; vertical-align: bottom; width: 10px;"></span><span class="webkit-html-tag"><StabileOrganizzazione></span></div>
<div class="collapsible-content" style="margin-left: 1em;">
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Indirizzo></span><span class="text">Piazza Garibaldi</span><span class="webkit-html-tag"></Indirizzo></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><CAP></span><span class="text">00100</span><span class="webkit-html-tag"></CAP></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Comune></span><span class="text">Roma</span><span class="webkit-html-tag"></Comune></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Provincia></span><span class="text">RM</span><span class="webkit-html-tag"></Provincia></span></div>
<span class="text"></span><div class="line">
<span class="webkit-html-tag"><Nazione></span><span class="text">IT</span><span class="webkit-html-tag"></Nazione></span></div>
<span class="text"></span></div>
<div class="line">
<span class="webkit-html-tag"></StabileOrganizzazione></span></div>
</div>
</div>
<span class="text"></span></div>
<div class="line" style="font-family: monospace; font-size: 13px;">
<span class="webkit-html-tag"></CedentePrestatore></span></div>
<div class="line" style="font-family: monospace; font-size: 13px;">
<span class="webkit-html-tag"><br /></span></div>
racchiusi in improbabili elementi quali<br />
<br />
<span style="color: #881280; font-family: monospace; font-size: 13px;">FatturaElettronicaHeader</span> e <span style="color: #881280; font-family: monospace; font-size: 13px;">FatturaElettronicaBody</span>.<br />
<br /><div>
Non sarebbe stato molto meglio avere uno standard informatico in inglese, magari condiviso a livello europeo / internazionale, in modo da agevolare la predisposizione di strumenti software comuni? Va bene la salvaguardia della lingua nazionale, ma questa dovrebbe riguardare l'interfaccia delle applicazioni, non la definizione degli standard con cui sono rappresentati i dati. Provate a pensarci: se un programmatore italiano volesse sviluppare un'applicazione per la generazione di fatture in formato XML per i vari paesi dell'Unione Europea, dovrebbe preoccuparsi di imparare il maltese, il finlandese, l'estone, il lituano, il greco, ecc.?</div>
<div>
<br /></div>
<div>
E poi, magari qualche standard per la definizione in formato XML delle fatture esiste. Per citarne uno, quello preparato dal <a href="https://www.oasis-open.org/org" target="_blank">Consorzio non-profit OASIS</a>, disponibile all'indirizzo <a href="http://docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.html#T-INVOICE">docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.html#T-INVOICE</a>. Per quale motivo non si è seguito quello standard? Mi riprometto di indagare, ma per adesso noto che tra le FAQ non ci sono notizie in merito. (Se avete informazioni, segnalatemele e aggiornerò volentieri questo post.)</div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-10883280994571567292013-12-27T22:27:00.000+01:002013-12-27T22:27:25.622+01:00XML, JSON, ecc.Pubblico questo post per presentare qualche semplice esempio di informazioni inviate da un server web ad un client in diversi formati.<br />
<br />
L'esperienza comune degli utenti è l'interazione con un server web mediata da un browser. Il browser agisce come client, chiedendo una risorsa, il server gliela manda. La risorsa, tipicamente, consiste in un documento ipertestuale (una pagina web), oppure un file binario (un'immagine, un file PDF, ecc.).<br />
<br />
Se si tratta di un file binario, esso viene presentato all'utente mediante qualche programma di visualizzazione (spesso integrato nel browser come plugin, o direttamente in esso incorporato). Le pagine HTML vengono semplicemente "rese".<br />
<br />
Sempre più spesso, però, capita che le informazioni inviate dal server debbano essere elaborate da un'applicazione sul lato client, per i fini più diversi. Non solo rese, ma elaborate: questo significa che il modo in cui le informazioni arrivano sia studiato in modo che i dati siano facilmente elaborabili.<br />
<br />
Immaginiamo che un server debba inviare l'elenco dei libri disponibili per il prestito, il cui autore è Manzoni.<br />
<br />
Potrebbe inviare un testo semplice, con i titoli uno sotto l'altro:<br />
<br />
<span style="color: blue; font-family: Courier New, Courier, monospace;">Content-type: text/plain</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;">Il Conte di Carmagnola</span><br />
<span style="font-family: Courier New, Courier, monospace;">Adelchi</span><br />
<span style="font-family: Courier New, Courier, monospace;">I promessi sposi</span><br />
<br />
Oppure potrebbe inviare un file codificato in XML:<br />
<br />
<span style="color: blue; font-family: Courier New, Courier, monospace;">Content-type: text/xml</span><br />
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<span style="font-family: Courier New, Courier, monospace;"><?xml version="1.0" encoding="UTF-8"?><br /><books><br /> <book id="123"><title>Il Conte di Carmagnola</book><br /> <book id="456"><title>Adelchi</book><br /> <book id="789"><title>I promessi sposi</book><br /></books></span><div>
<br /></div>
<div>
Oppure ancora, inviare gli stessi dati in formato JSON:</div>
<div>
<br /></div>
<div>
<span style="color: blue; font-family: Courier New, Courier, monospace;">Content-type: application/json</span></div>
<div>
<span style="color: blue; font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">[{"id":123,"title":"Il Conte di Carmagnola"},{"id":456,"title":"Adelchi"},{"id":789,"title":"I promessi sposi"}]</span></div>
<div>
<br /></div>
<div>
Ci sono vantaggi e svantaggi nella scelta di una di queste soluzioni. Negli ultimi anni sta prendendo sempre più piede il formato JSON, anche in virtù del fatto che sia la codifica sia la decodifica di strutture dati da / verso questo formato è agevole in tutti i linguaggi di programmazione moderni, sia perché spesso ad elaborare i dati lato client sono applicazioni JavaScript, che trovano i dati disponibili in formato nativo.</div>
<div>
<br /></div>
<div>
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-63934015202366953382013-10-28T18:54:00.002+01:002015-02-02T14:38:29.864+01:00Web application deployment with git-ftp<span style="font-size: x-small;"><i>This post has been updated after its initial publication.</i></span><br />
<br />
In web application development, it happens sometimes that you are stuck with an only way to upload files on your webserver: FTP. If you are used to push changes to a git server like and then pull the changes on your webserver through a SSH connection, there are chances you just can't do that.<br />
<br />
I had this problem recently, but I luckily found a very nice shell, <a href="https://github.com/git-ftp/git-ftp" target="_blank">git-ftp</a>, that allows me to push changes to the webserver via FTP, recognizing all the files that I updated (or added, or deleted) on my local git repository.<br />
<br />
My development / deployment cycle goes now simply like this:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">$ # the ordinary "git" stuff...:</span><br />
<span style="font-family: Courier New, Courier, monospace;">$ git add <i>files_to_add</i></span><br />
<br />
<span style="font-family: Courier New, Courier, monospace;">$ git rm <i>files_to_remove</i></span><br />
<span style="font-family: Courier New, Courier, monospace;">$ git commit -a -m 'description of the changes'</span><br />
<span style="font-family: Courier New, Courier, monospace;">$ git push</span><br />
<div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ # now push the changes on the deployment server:</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git-ftp push</span></div>
<div>
<br /></div>
<div>
The credentials that have to be used to access the deployment server are stored with the ordinary <span style="font-family: Courier New, Courier, monospace;">git config</span> command. From the man page of git-ftp:</div>
<div>
<br /></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.user john</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.url ftp.example.com</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.password secr3t</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.syncroot path/dir</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.cacert caCertStore</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.deployedsha1file mySHA1File</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">$ git config git-ftp.insecure 1</span></div>
</div>
<div>
<br /></div>
<div>
You can also use <i>git-ftp</i> in dry-mode, to just see what would happen, and in verbose mode, if you are curious about what actually happens.</div>
<br />
<b>Update</b>: for a different project, I needed to use <i>sftp</i>, which is not supported by <i>libcurl</i> with a default Ubuntu installation. Anyway, I followed the instructions found on <a href="http://zeroset.mnim.org/2013/03/14/sftp-support-for-curl-in-ubuntu-12-10-quantal-quetzal-and-later/" target="_blank">zeroset</a> and I managed to have it working with no problems.Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-3828295.post-48277468273900133582013-09-29T17:50:00.003+02:002013-09-29T17:50:58.041+02:00Treno + bici, assurdità tutte italianeViaggiare in treno con la bicicletta al seguito può essere un'esperienza molto piacevole, visto che si possono esplorare luoghi relativamente lontani sfruttando due tra i mezzi di trasporto più ecologici.<br />
<br />
Purtroppo, per motivi che solo in Italia credo possano esistere, l'esperienza viene resa inutilmente difficoltosa.<br />
<br />
1. Al momento della pianificazione del viaggio, bisogna naturalmente scegliere i treni giusti, ossia quelli che consentono il trasporto della bicicletta. Il sito di <a href="http://www.trenitalia.com/" target="_blank">Trenitalia</a> non consente, nemmeno accedendo alle opzioni avanzate, di effettuare una ricerca dei treni adibiti al trasporto biciclette:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-SP80e7YXyLU/UkhDt5qHFVI/AAAAAAAABCQ/yQUvngX3DIw/s1600/trenitalia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="130" src="http://4.bp.blogspot.com/-SP80e7YXyLU/UkhDt5qHFVI/AAAAAAAABCQ/yQUvngX3DIw/s400/trenitalia.png" width="400" /></a></div>
<br />
I ciclisti italiani sanno, grazie ad un salutare passaparola, che per ottenere l'informazione desiderata si può però consultare il sito delle <a href="http://www.bahn.de/" target="_blank">ferrovie tedesche</a>, anche in italiano, il quale mostra gli orari di tutta Europa, con l'agognata casellina su cui mettere il desiderato segno di spunta:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ixe1CK4rhe0/UkhGMEN1snI/AAAAAAAABCc/dJnsAECibpE/s1600/bahnde.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="311" src="http://4.bp.blogspot.com/-ixe1CK4rhe0/UkhGMEN1snI/AAAAAAAABCc/dJnsAECibpE/s400/bahnde.png" width="400" /></a></div>
<br />
2. Al momento di fare il biglietto, bisogna considerare che, per motivi misteriosi che qualcuno dovrebbe spiegare, le emettitrici automatiche presenti in tutte le stazioni non consentono l'acquisto del supplemento bici. Quindi, armatevi di pazienza e mettetevi in fila allo sportello (se è aperto dovete farlo, visto che la regola di acquistare il biglietto in treno senza sovrapprezzo vale solo quando in stazione lo sportello non c'è oppure è chiuso).<br />
<br />
3. L'accessibilità delle stazioni ferroviare italiane (e dei treni stessi, a dire il vero) è quella che è, lo sappiamo. Dappertutto troviamo i cartelli "Vietato attraversare i binari. Servirsi del sottopassaggio". Basta aver fatto un viaggio piccolo piccolo al di là delle Alpi per capire che i sottopassaggi a cui si può accedere solo scendendo e salendo dei gradini non sono il massimo che la vita può offrire (soprattutto se la bicicletta è carica con qualche bagaglio sulle borse). Tra l'altro, l'accessibilità riguarda anche persone che devono usare una sedia a rotelle, genitori con un passeggino, ecc. Ma in Italia, naturalmente, le priorità sono altre.<br />
<br />
4. Una volta arrivati al binario, rimane un ultimo problema da affrontare. Dove sarà la carrozza adibita al trasporto delle biciclette? In testa o in coda al treno? Non c'è modo di saperlo, perché evidentemente sarebbe troppo difficile comunicare questa informazione negli annunci audio, o nei display dove sono elencati i treni in arrivo/partenza. Quindi, non rimane che tirare una monetina e sperare di azzeccarci. Se non avete fortuna, e vi siete messi in coda quando invece la carrozza portabici è in testa, dovrete correre velocemente sul binario per arrivare a caricare il vostro mezzo in tempo. Però attenzione: non potete pedalare sul marciapiede.<br />
<br />
Insomma: meno male che «Trenitalia da sempre si impegna per favorire chi sceglie di sostenere l’ambiente per viaggiare, forte della convinzione che treno+bici sia la soluzione di viaggio più eco-friendly, oltre che sempre più trendy», come <a href="http://www.trenitalia.com/cms/v/index.jsp?vgnextoid=185e3dc3df75f310VgnVCM1000008916f90aRCRD" target="_blank">afferma il sito web</a> dell'azienda. Figuratevi altrimenti.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-iwpmFwiLARI/UkhLOoKrZOI/AAAAAAAABCs/H8xIEWIvLVc/s1600/sforzo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="249" src="http://2.bp.blogspot.com/-iwpmFwiLARI/UkhLOoKrZOI/AAAAAAAABCs/H8xIEWIvLVc/s320/sforzo.png" width="320" /></a></div>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-28011621554428514242013-08-30T12:19:00.001+02:002013-08-30T12:26:14.458+02:00PHP - Introduzione alle lezioni<h2>
<div style="font-weight: normal; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-family: Times New Roman;"><span style="font-size: small;"><i>Questo
post fa parte di una serie preparata qualche anno fa per
delle <a href="http://www.tissino.it/docs/php/">lezioni su PHP</a>.</i></span></span></span></div>
</h2>
<h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Introduzione</span></h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Le lezioni di questo corso sono strutturate con una serie di esempi e di esercizi per tuffarsi nel modo dello sviluppo di applicazioni web con PHP.</span><br />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">L'idea è di non presentare sistematicamente tutto ciò che serve: c'è molta altra documentazione al riguardo, a partire da </span><a href="http://www.php.net/manual" style="font-family: 'Gentium Book Basic', Georgia, serif;">www.php.net/manual</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> e uno dei principi di base è quello di "non reinventare la ruota". Piuttosto, preferisco procedere per raffinamenti successivi, con refactoring costante delle cose prodotte.</span><br />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Tenderei anche ad iniziare (quasi) fin da subito un'impostazione basata sull'approccio </span><a href="http://it.wikipedia.org/wiki/Model-View-Controller" style="font-family: 'Gentium Book Basic', Georgia, serif;">MVC</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> (model/view/controller) e sul </span><a href="http://en.wikipedia.org/wiki/Test-driven_development" style="font-family: 'Gentium Book Basic', Georgia, serif;">test-driven development</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;">, in modo da facilitare il passaggio allo sviluppo basato sull'uso di framework (personalmente, uso e raccomando </span><a href="http://www.symfony-project.org/" style="font-family: 'Gentium Book Basic', Georgia, serif;">symfony</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;">, ma molti concetti sono applicabili comunque).</span><br />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">La raccolta di esempi e di esercizi presentata qui viene normalmente integrata con spiegazioni in aula, quindi può essere che non tutto sia sempre chiaro se ci si basa solo su quanto letto qui. Se servono integrazioni, o se trovate errori, segnalatemelo.</span><br />
<br />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Alcune buone pratiche</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Riporto qui alcune buone pratiche per lo sviluppo di applicazioni web che mi vengono in mente basandomi sulla mia esperienza personale e su qualche buona lettura. Non c'è un ordine di priorità particolare, e probabilmente alcune cose dovranno essere aggiunte. Tra l'altro, ammetto di non riuscire a seguirle tutte neppure io. Ad ogni modo, sono i miei due centesimi...</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<ol style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li>usare il design pattern MVC (<i>model-view-controller</i>)</li>
<li>sviluppare codice sorgente in inglese: è meglio <i>setSurname()</i> di <i>setCognome()</i>, soprattutto se poi si chiede aiuto in un qualche tipo di forum internazionale<i><br /></i></li>
<li>usare strumenti che consentono l'internazionalizzazione (<i>i18n</i>) e la localizzazione (<i>l10n</i>) del codice</li>
<li>essere ben disposti verso il refactoring</li>
<li>usare un sistema di controllo versione (SVN, GIT...)</li>
<li>scrivere il codice seguendo degli standard precisi (vedere, ad esempio, <a href="http://trac.symfony-project.org/wiki/HowToContributeToSymfony#CodingStandards">quelli di symfony</a>, oppure quelle del progetto o del team in cui si è coinvolti)</li>
<li>scrivere codice commentato</li>
<li>scrivere codice autoesplicativo (pensare ai nomi delle funzioni e dei parametri)</li>
<li>produrre documentazione con phpDoc o sistemi equivalenti</li>
<li>lavorare con dati di esempio da ricaricare per ogni test (<i>fixtures</i>)</li>
<li>predisporre test unitari</li>
<li>predisporre test funzionali</li>
<li>usare librerie di astrazione dal database</li>
<li>usare librerie ORM (object-relational-mapping)</li>
<li>usare framework di sviluppo per non reinventare la ruota</li>
<li>usare un'<a href="http://en.wikipedia.org/wiki/Fluent_interface">interfaccia fluente</a> per gran parte delle funzioni di una classe (tutti i <i>setters</i>, come minimo)</li>
<li>non usare il metodo GET per cambiare lo stato delle informazioni sul server (niente link "normali" per cancellare un articolo, ad esempio)</li>
<li>gestire le eccezioni con blocchi <i>try... catch</i> per tutte le operazioni che potenzialmente possono non andare a buon fine</li>
<li>impostare l'<i>error_reporting</i> a E_ALL, e inizializzare tutte le variabili esplicitamente</li>
<li>seguire le pratiche dell'usabilità, dell'accessibilità e dell'ottimizzazione per i motori di ricerca</li>
</ol>
<div style="font-family: 'Gentium Book Basic', Georgia, serif;">
Nell'ambito dell'uso di symfony, inoltre, vale sicuramente la pena di dare un'occhiata alle <a href="http://www.slideshare.net/nperriault/30-symfony-best-practices">trenta buone pratiche</a> raccomandate da Nicolas Perriault.</div>
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Nota per i puristi</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">In molti casi gli esempi iniziano con un codice come il seguente:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;"><pre></span><br />
<span style="font-family: 'courier new', monospace;"><?php</span><br />
<span style="font-family: 'courier new', monospace;"> // istruzioni...</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Ovviamente, il codice generato non è HTML valido, poiché mancano molti elementi obbligatori e il marcatore di chiusura </span><span style="font-family: 'courier new', monospace;"></pre></span><span style="font-family: 'Gentium Book Basic', Georgia, serif;">.</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Visto che l'obiettivo è di visualizzare semplice testo, però, questa è una soluzione accettabile.</span><br />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">La soluzione teoricamente corretta sarebbe di scrivere, invece:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;"><?php</span><span style="font-family: 'courier new', monospace;"><br /> header('Content-Type: text/plain');<br /> // istruzioni...</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Il problema di questa soluzione è che i browser dovrebbero rappresentare il contenuto come testo semplice, ma ce n'è uno, fornito di default con un noto sistema operativo, che non si comporta così, e tenta di rappresentare il testo in altro modo, oppure di aprire il contenuto con altri programmi...</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-58717592890159976492013-08-30T11:52:00.000+02:002013-08-30T11:52:23.124+02:00Php - Alcune cose sulle variabili<i>Questo post fa parte di una serie preparata qualche anno fa per delle <a href="http://www.tissino.it/docs/php/">lezioni su PHP</a>.</i><br />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Ambito di validità delle variabili</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Esistono diversi ambiti di validità (</span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">scope</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">) di una variabile:</span><br />
<ul style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li>locale (la variabile è visibile solo nella funzione in cui è definita)</li>
<li>globale (la variabile è definita fuori dalla funzione, ma è specificatamente richiamata)</li>
<li>superglobale (la variabile è accessibile ovunque senza bisogno di specificazioni</li>
</ul>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">A differenza di altri linguaggi:</span><br />
<ol style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li>le variabili globali non sono visibili, in assenza di specificazione, all'interno di una funzione (come invece succede, ad esempio, in Pascal);</li>
<li>non esiste uno <i>scope</i> per un blocco (come invece succede, ad esempio, in C).</li>
</ol>
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Si consideri il seguente frammento di codice:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">ini_set('error_reporting', E_ALL);</span><br />
<span style="font-family: 'courier new', monospace;">function foo()</span><br />
<span style="font-family: 'courier new', monospace;">{</span><br />
<span style="font-family: 'courier new', monospace;"> echo $k;</span><br />
<span style="font-family: 'courier new', monospace;">}</span><br />
<span style="font-family: 'courier new', monospace;">$k=1;</span><br />
<span style="font-family: 'courier new', monospace;">foo();</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Quello che si ottiene è:</span><br />
<pre style="font-family: 'courier new', monospace;"><b>Notice</b>: Undefined variable: k in <b>...</b> on line ...</pre>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Se si deve usare la variabile globale all'interno della funzione (anche se non è una buona pratica), ci sono due possibilità.</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">La prima è di dichiararla esplicitamente come globale:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">function foo()</span><br />
<span style="font-family: 'courier new', monospace;">{</span><br />
<span style="font-family: 'courier new', monospace;"> global $k;</span><br />
<span style="font-family: 'courier new', monospace;"> echo $k;</span><br />
<span style="font-family: 'courier new', monospace;">}</span><br />
<span style="font-family: 'courier new', monospace;">$k=1;</span><br />
<span style="font-family: 'courier new', monospace;">foo();</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">La seconda è di usare l'array globale $GLOBALS:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">function foo()</span><br />
<span style="font-family: 'courier new', monospace;">{</span><br />
<span style="font-family: 'courier new', monospace;"> echo $GLOBALS['k'];</span><br />
<span style="font-family: 'courier new', monospace;">}</span><br />
<span style="font-family: 'courier new', monospace;">$k=1;</span><br />
<span style="font-family: 'courier new', monospace;">foo();</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Le variabili superglobali</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Alcuni array speciali mettono a disposizione di tutte le funzioni valori specifici collegati all'ambiente di esecuzione ($_ENV), ai valori inviati dal browser ($_GET, $_POST, ecc.). In linea di massima, è bene evitare di accedere direttamente a queste variabili e utilizzare invece delle classi che si occupano di fornire i dati in forma "controllata".</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Ad esempio, si consideri di usare un codice simile a questo:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">class WebRequest</span><br />
<span style="font-family: 'courier new', monospace;">{</span><br />
<span style="font-family: 'courier new', monospace;"> public function getParameter($name, $default=null)</span><br />
<span style="font-family: 'courier new', monospace;"> {</span><br />
<span style="font-family: 'courier new', monospace;"> if (array_key_exists($name, $_GET))</span><br />
<span style="font-family: 'courier new', monospace;"> {</span><br />
<span style="font-family: 'courier new', monospace;"> return htmlentities($_GET[$name]);</span><br />
<span style="font-family: 'courier new', monospace;"> // eventualmente qui si possono aggiungere altre sostituzioni...</span><br />
<span style="font-family: 'courier new', monospace;"> }</span><br />
<span style="font-family: 'courier new', monospace;"> else</span><br />
<span style="font-family: 'courier new', monospace;"> {</span><br />
<span style="font-family: 'courier new', monospace;"> return $default;</span><br />
<span style="font-family: 'courier new', monospace;"> }</span><br />
<span style="font-family: 'courier new', monospace;"> }</span><br />
<span style="font-family: 'courier new', monospace;">}</span><br />
<br style="font-family: 'courier new', monospace;" />
<span style="font-family: 'courier new', monospace;">$request = new WebRequest();</span><br />
<span style="font-family: 'courier new', monospace;">echo 'con pulizia: ' . $request->getParameter('bar') . "\n";</span><br />
<span style="font-family: 'courier new', monospace;">echo 'senza pulizia: ' . $_GET['bar'] . "\n";</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Richiamando il codice con una query string di questo tipo:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">?bar=5>3</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">si otterrà:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">con pulizia: 5&</span><span style="font-family: 'courier new', monospace;">gt;</span><span style="font-family: 'courier new', monospace;">3</span><br />
<span style="font-family: 'courier new', monospace;">senza pulizia: 5>3</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">con evidenti vantaggi in termini di sicurezza (e con il bonus di poter specificare dei valori di default).</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Nota storica: in vecchie versioni di PHP (precedenti alla versione 4.2.0), l'impostazione predefinita (</span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">register_globals=on</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">) faceva sì che venissero automaticamente create delle variabili con il nome del parametro (</span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">$bar</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> nell'esempio). Questa impostazione è deprecata per motivi di sicurezza, ma è bene conoscerla per il caso in cui ci si debba cimentare nella manutenzione/sostituzione di vecchio software.</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Variabili statiche</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Una funzione può contenere variabili statiche:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">function baz()</span><br />
<span style="font-family: 'courier new', monospace;">{</span><br />
<span style="font-family: 'courier new', monospace;"> static $number;</span><br />
<span style="font-family: 'courier new', monospace;"> $number++;</span><br />
<span style="font-family: 'courier new', monospace;"> return 'foo ' . $number . "\n";</span><br />
<span style="font-family: 'courier new', monospace;">}</span><br />
<span style="font-family: 'courier new', monospace;">echo baz();</span><br />
<span style="font-family: 'courier new', monospace;">echo baz();</span><br />
<span style="font-family: 'courier new', monospace;">echo baz();</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">produce</span><br />
<pre><span style="font-family: 'courier new', monospace;">foo 1</span>
<span style="font-family: 'courier new', monospace;">foo 2</span>
<span style="font-family: 'courier new', monospace;">foo 3</span>
</pre>
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Variabili di variabili</h2>
<pre>Una variabile può contenere il nome di un'altra variabile:
<span style="font-family: 'courier new', monospace;">$name="Mario";</span>
<span style="font-family: 'courier new', monospace;">$var='name';</span>
<span style="font-family: 'courier new', monospace;">echo $$var . "\n"; </span></pre>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">produce</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">Mario</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Nota: il meccanismo funziona anche con diversi livelli di indirezione.</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
La funzione eval()</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Con la funzione </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">eval()</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> si possono eseguire istruzioni costruite al volo:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;">$expression='$a=5+3;';</span><br />
<span style="font-family: 'courier new', monospace;">eval($expression);</span><br />
<span style="font-family: 'courier new', monospace;">echo $a . "\n";</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Attenzione: è bene non abusare di queste cose, che minano la sicurezza del codice e ne mettono a rischio la portabilità. «Se </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">eval</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">() è la risposta, vuol dire che quasi certamente hai posto la domanda sbagliata.» (attribuita a Rasmus Lerdorf)</span>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-33491227454331139272013-08-30T11:29:00.003+02:002013-08-30T11:29:46.691+02:00PHP - Appunti sulla progettazione<br />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
<div style="font-weight: normal; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-family: Times New Roman;"><span style="font-size: small;"><i>Questo
post fa parte di una serie preparata qualche anno fa per
delle <a href="http://www.tissino.it/docs/php/">lezioni su PHP</a>.</i></span></span></span></div>
</h2>
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Fasi di progettazione</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Le fasi di progettazione di una base di dati e di una o più applicazioni utente che su di essa si basano dovrebbero essere le seguenti:</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><ul style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li>progettazione logica, che porta ad un diagramma entità/relazioni</li>
<li>progettazione delle tabelle, che porta allo schema relazionale</li>
<li>implementazione concreta, che porta alle istruzioni DDL (o equivalenti) per la progettazione delle tabelle con i relativi campi</li>
</ul>
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Consigli per la progettazione delle tabelle</h2>
<h3 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: large;">
Mantenere la coerenza nei nomi</h3>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Bisognerà adottare uno schema per i nomi delle tabelle e dei nomi dei campi ed applicarlo in maniera coerente. Ad esempio, non sembrano coerenti questi nomi di tabelle:</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><ul style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li><b><i>Clienti</i></b>, <b><i>fornitori</i></b> (o scegliamo <i><b>Clienti</b></i> e <b><i>Fornitori</i></b>, oppure <b><i>clienti</i></b> e <b><i>fornitori</i></b>)</li>
<li><b><i>Clienti</i></b>, <b><i>Fornitori</i></b>, <b><i>Fattura</i></b> (per i nomi delle tabelle usiamo sempre il plurale o sempre il singolare)</li>
<li><b><i>Customers</i></b>, <b><i>Fornitori</i></b>, <b><i>Invoices</i></b> (usiamo nomi in italiano o in inglese, non mescolati)</li>
<li><b><i>customer_type</i></b>, <b><i>subjectType</i></b>, <b><i>BookType</i></b> (underscore, camelCase o tutte le iniziali in maiuscolo)</li>
</ul>
<h3 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: large;">
Non andare in cerca di guai</h3>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">In generale, è opportuno limitarsi a nomi di tabelle e nomi di campi:</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><ul style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li>senza spazi</li>
<li>senza caratteri fuori dall'insieme [A-Za-z0-9], più eventualmente il simbolo di sottolineatura</li>
</ul>
<h3 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: large;">
Usare dati di prova</h3>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Per verificare di aver progettato correttamente le tabelle, è opportuno inserire dei dati di prova:</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><ul style="font-family: 'Gentium Book Basic', Georgia, serif;">
<li><b>significativi</b> (ad esempio, tenendo in considerazione ipotetici casi limite, o valori fuori dal comune)</li>
<li><b>in numero adeguato</b> (se voglio verificare come si presenta l'interfaccia utente quando ci sono tanti clienti, è bene che nei dati di prova ci siano tanti clienti; viene naturale pensare anche ad una generazione automatica, con numeri progressivi )</li>
<li><b>facili da importare</b> (per poter ripristinare una situazione iniziale, nel caso in cui si commettano degli errori).</li>
</ul>
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-42457899174223474142013-08-30T11:28:00.003+02:002013-08-30T11:28:57.573+02:00PHP - PUT e DELETE tramite Javascript
<br />
<div style="margin-bottom: 0cm;">
<span style="color: black;"><span style="font-family: Times New Roman;"><span style="font-size: small;"><i>Questo
post fa parte di una serie preparata qualche anno fa per
delle <a href="http://www.tissino.it/docs/php/">lezioni su PHP</a>.</i></span></span></span></div>
<br />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Limiti dei browser</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Normalmente i browser implementano solo i metodi GET e POST. Se si prepara un form con l'attributo method che non vale "GET" o "POST" il browser fa una richiesta tramite GET.</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Utilizzare Javascript per PUT e DELETE</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Se si vuole fare un PUT o un DELETE si può però chiedere al browser di utilizzare Javascript. Questo codice, con un po' di adattamenti, è preso da "</span><a href="http://www.wynia.org/wordpress/2007/03/not-just-get-and-post-http-put-and-delete-with-javascript/" style="font-family: 'Gentium Book Basic', Georgia, serif;">Not just Post and Get</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;">".</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;"><html></span><br />
<span style="font-family: 'courier new', monospace;"><title>HTTP Methods example</title></span><br />
<span style="font-family: 'courier new', monospace;"><head></span><br />
<span style="font-family: 'courier new', monospace;"><script language="Javascript"></span><br />
<span style="font-family: 'courier new', monospace;"><!--</span><br />
<span style="color: red; font-family: 'courier new', monospace;">var xmlhttp;</span><br />
<span style="color: red; font-family: 'courier new', monospace;">function execute($method,$url)</span><br />
<span style="color: red; font-family: 'courier new', monospace;">{</span><br />
<span style="color: red; font-family: 'courier new', monospace;"> xmlhttp=new XMLHttpRequest();</span><br />
<span style="color: red; font-family: 'courier new', monospace;"> xmlhttp.open($method,$url,true)</span><br />
<span style="color: red; font-family: 'courier new', monospace;"> xmlhttp.send(null);</span><br />
<span style="color: red; font-family: 'courier new', monospace;">}</span><br />
<br style="color: red; font-family: 'courier new', monospace;" />
<span style="color: red; font-family: 'courier new', monospace;">function testmethod($method)</span><br />
<span style="color: red; font-family: 'courier new', monospace;">{</span><br />
<span style="color: red; font-family: 'courier new', monospace;"> alert('Executing ' + $method + '...');</span><br />
<span style="color: red; font-family: 'courier new', monospace;"> execute($method, 'info.php');</span><br />
<span style="color: red; font-family: 'courier new', monospace;">}</span><br />
<span style="font-family: 'courier new', monospace;">--></span><br />
<span style="font-family: 'courier new', monospace;"></script></span><br />
<span style="font-family: 'courier new', monospace;"></head></span><br />
<span style="font-family: 'courier new', monospace;"><body></span><br />
<span style="font-family: 'courier new', monospace;"><?php foreach(array('get', 'post', 'put', 'delete') as $method): ?></span><br />
<span style="font-family: 'courier new', monospace;"> <input </span><br />
<span style="font-family: 'courier new', monospace;"> type="button" </span><br />
<span style="font-family: 'courier new', monospace;"> value="<?php echo $method ?>" </span><br />
<span style="font-family: 'courier new', monospace;"> onclick="testmethod('<?php echo $method ?>');" </span><br />
<span style="font-family: 'courier new', monospace;"> /></span><br />
<span style="font-family: 'courier new', monospace;"><?php endforeach ?></span><br />
<span style="font-family: 'courier new', monospace;"></body></span><br />
<span style="font-family: 'courier new', monospace;"></html></span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Il codice HTML che si ottiene per il body è il seguente:</span><br />
<pre style="color: blue; font-family: 'trebuchet ms', sans-serif;"><body>
<input
type="button"
value="get"
onclick="testmethod('get');"
/>
<input
type="button"
value="post"
onclick="testmethod('post');"
/>
<input
type="button"
value="put"
onclick="testmethod('put');"
/>
<input
type="button"
value="delete"
onclick="testmethod('delete');"
/>
</body></pre>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Lo script PHP che riceve i dati può limitarsi, giusto per darci la conferma che i metodi PUT o DELETE sono stati ricevuti, a scrivere una specie di file di log:</span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />
<span style="font-family: 'courier new', monospace;"><?php</span><br />
<span style="font-family: 'courier new', monospace;">// file info.php</span><br />
<span style="font-family: 'courier new', monospace;">$fp= fopen('log.txt', 'a');</span><br />
<span style="font-family: 'courier new', monospace;">fwrite($fp, $_SERVER['REQUEST_METHOD']. "\n");</span><br />
<span style="font-family: 'courier new', monospace;">fclose($fp);</span><br />
<span style="font-family: 'courier new', monospace;">?></span><br />
<br style="font-family: 'Gentium Book Basic', Georgia, serif;" />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3828295.post-46720625779724944622013-08-30T11:28:00.000+02:002013-08-30T11:28:00.998+02:00PHP - XAMPP<br />
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
<div style="font-weight: normal; margin-bottom: 0cm;">
<span style="color: black;"><span style="font-family: Times New Roman;"><span style="font-size: small;"><i>Questo
post fa parte di una serie preparata qualche anno fa per
delle <a href="http://www.tissino.it/docs/php/">lezioni su PHP</a>.</i></span></span></span></div>
</h2>
<h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
XAMPP</h2>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Per esercitazioni sullo sviluppo web in ambiente Microsoft Windows può essere utile usare </span><a href="http://www.apachefriends.org/it/xampp.html" style="font-family: 'Gentium Book Basic', Georgia, serif;">XAMPP</a><span style="font-family: 'Gentium Book Basic', Georgia, serif;">. Consiglio di scaricare e usare la versione indicata come </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">"Metodo B: 'Installazione' senza l'installer"</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">. </span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Dopo aver scompattato il file (ad esempio, in C:\), eseguire lo script </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">setup_xampp.bat</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> per effettuare i cambiamenti necessari a seconda del percorso specificato. Al termine, eseguire </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">xampp_control.exe</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> e tentare di avviare il server Apache.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><h2 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: x-large;">
Problemi e soluzioni</h2>
<h3 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: large;">
Porta 80 occupata</h3>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">Ce ne possiamo rendere conto eseguendo </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">xampp-portcheck.exe</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Se è in esecuzione </span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">Ms Internet Information Server</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;">, che occupa la porta 80, non è possibile avviare normalmente Apache.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Soluzione 1: chiudere IIS, con il comando</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'courier new', monospace;">net stop IISADMIN /y</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Soluzione 2: impostare Apache perché ascolti su una porta diversa (ad esempio la porta 8080), modificando il file</span><i style="font-family: 'Gentium Book Basic', Georgia, serif;">apache/conf/httpd.conf</i><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> (bisogna trovare la riga con scritto </span><span style="font-family: 'courier new', monospace;">Listen 80</span><span style="font-family: 'Gentium Book Basic', Georgia, serif;"> e sostituirla con </span><span style="font-family: 'courier new', monospace;">Listen 8080</span><span style="font-family: 'Gentium Book Basic', Georgia, serif;">).</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><h3 style="font-family: 'Gentium Book Basic', Georgia, serif; font-size: large;">
Firewall in azione</h3>
<span style="font-family: 'Gentium Book Basic', Georgia, serif;">All'avvio di Apache potrebbe comparire un messaggio che dice che il Firewall di Windows blocca il servizio.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Soluzione 1: disattivare il firewall, oppure consentire un'eccezione.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><span style="font-family: 'Gentium Book Basic', Georgia, serif;">Soluzione 2: lavorare solo da localhost, che dovrebbe comunque rimanere possibile.</span><br style="font-family: 'Gentium Book Basic', Georgia, serif;" /><br style="font-family: 'Gentium Book Basic', Georgia, serif;" />Unknownnoreply@blogger.com0