<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2461040131188227561</id><updated>2011-11-27T15:33:34.049-08:00</updated><category term='apache'/><category term='C#'/><category term='VB6'/><category term='VB.NET'/><category term='smtp'/><category term='testing'/><category term='java'/><category term='php'/><category term='open-source'/><category term='C'/><category term='ASP.NET'/><category term='intro'/><title type='text'>Programming with Attitude</title><subtitle type='html'>Un blog molto programmativo, si tratta un po' di tutto da PHP e MySQL a Java e Visual Basic.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-4107569918485077679</id><published>2008-11-26T07:03:00.001-08:00</published><updated>2008-11-26T07:12:52.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='open-source'/><category scheme='http://www.blogger.com/atom/ns#' term='smtp'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Micro SMTP Server - un piccolo server per testare SMTP in Java</title><content type='html'>A quanti di voi capita di dover scrivere applicazioni web e si trovano nell'impossibilità di testare la bontà dell'invio di e-mail in modo automatico? Quanti di voi per effettuare questi test devono far inviare realmente email di test dal sistema che stanno implementando, perdendo tempo aspettando che la mail arrivi e controllandola e cancellandola?&lt;br /&gt;Penso parecchi...Ma ho una soluzione che potrebbe facilitare la vita a tutti noi sviluppatori. Sto scrivendo un piccolo server che si limita ad ascoltare un socket sulla porta 25 ed agisce come server di posta SMTP e scrive sulla standard output tutto ciò che gli viene inviato e tutto ciò che invia. Sarà terminato a breve, non appena ho il tempo terminarne lo sviluppo (la versione corrente 0.1 supporta solo 1 singolo invio di e-mail dopodiché termina selvaggiamente). Non so se sarà open-source (molto probabile, ma devo scegliere la licenza giusta), sicuramente sarà freeware.&lt;br /&gt;Micro SMTP Server (è così che ho battezzato il mio serverino SMTP) è sviluppo usando il linguaggio Java, in modo da essere Cross-platform compatibile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-4107569918485077679?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/4107569918485077679/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=4107569918485077679' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4107569918485077679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4107569918485077679'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/11/micro-smtp-server-un-piccolo-server-per.html' title='Micro SMTP Server - un piccolo server per testare SMTP in Java'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-5607557152089504861</id><published>2008-11-25T07:06:00.000-08:00</published><updated>2008-11-25T07:11:30.486-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intro'/><title type='text'>Silenzio...</title><content type='html'>Scusate se non sto effettuando post in questo periodo, ma sono un po' preso sia dal lavoro che dall'università. Spero che i miei lettori abbiano pazienza... Una comunicazione per tutti: vorrei che lasciaste qualche commento sui miei post, se li avete trovati utili o meno, quali argomenti vorreste che vengano trattati.&lt;br /&gt;&lt;br /&gt;Vi auguro una Buona giornata.&lt;br /&gt;&lt;br /&gt;Daniele&lt;br /&gt;&lt;br /&gt;PS:&lt;br /&gt;presto realizzerò la versione inglese di questo blog all'indirizzo &lt;a href="http://www.danieleveratti.com/"&gt;http://www.danieleveratti.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will post contents of this blog on &lt;a href="http://www.danieleveratti.com/"&gt;http://www.danieleveratti.com/&lt;/a&gt; very soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-5607557152089504861?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/5607557152089504861/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=5607557152089504861' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/5607557152089504861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/5607557152089504861'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/11/silenzio.html' title='Silenzio...'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-2529161573431275558</id><published>2008-08-31T10:43:00.000-07:00</published><updated>2008-11-27T10:36:20.259-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>IE 6: header Content-disposition ignorati (ignored) !!FIXED!!</title><content type='html'>Tra tutti i browser del mondo, quello che mi da più rotture è Internet Explorer. Ho smesso anche di usarlo, ma non per sentimenti di ribellione incondizionata e pinguinosa nei confronti di Microsoft, ma perché credo che Firefox sia meglio, soprattutto se di lavoro si fa lo sviluppatore web. Nonostante tutto però gli utenti usano IE, e parecchi ancora usano IE 6.&lt;br /&gt;&lt;br /&gt;In particolare Internet Explorer 6 mi ha dato una bella gatta da pelare con i file da scaricare.&lt;br /&gt;In un'applicazione web che ho scritto è possibile scaricare alcuni file, solo da parte di utenti registrati. Quindi i file stanno fuori dalla visibilità del browser e vengono serviti da un file (download.php, nel mio caso) che, dopo aver fatto i relativi controlli a login e permessi vari, cambia gli header in modo da far scaricare il file scelto. Semplificando molto è una cosa simile:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;session_start();&lt;br /&gt;$db = new db();&lt;br /&gt;checkPermission($_GET['id'],$_SESSION['userid']) || die();&lt;br /&gt;$file = $db-&amp;gt;query("SELECT * FROM attachments WHERE id = ".$db-&gt;quote($_GET['id']);&lt;br /&gt;header ("Content-type: ".$file['mime']);&lt;br /&gt;header ("Content-disposition: attachment; filename=".$file['name']);&lt;br /&gt;header ("Content-Transfer-Enconding: binary");&lt;br /&gt;@readfile($file['full_path']);&lt;br /&gt;exit();&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Risultato? Con Firefox nessun problema, con IE 7 nessun problema (eh meno male!!) ma con IE6... disastro!! I file venivano scaricato, ma IE6 ignorava bellamente l'header content-type e l'header content-disposition, nominando il file "download.php".&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Le ho provate davvero tutte per ovviare a questo problema, cambiare header rigurdanti la cache,ecc. ecc., ma l'unico effetto che sono riuscito ad ottenere è stato che il file non si chiamava più download.php, ma download.pdf piuttosto che download.zip...ma io voglio il nome corretto!!!&lt;br /&gt;&lt;br /&gt;Google alla mano, ho fatto mille ricerche che non hanno portato a nulla finchè non sono arrivato a questa pagina: &lt;a href="http://www.sitefoundry.com/broken_msie.html"&gt;http://www.sitefoundry.com/broken_msie.html&lt;br /&gt;&lt;/a&gt; e qui ho appreso che per un baco, IE6 in questi casi tenta sempre due richieste andando in errore e che a differenza di Firefox utilizza il protocollo HTTP 1.1 anziché 1.0. Allora mi sono detto: "non è che è tutto un problema di protocollo?!?".&lt;br /&gt;Prima di &lt;pre&gt;header ("Content-type ...");&lt;/pre&gt; ho inserito la seguente riga:&lt;br /&gt;&lt;pre&gt;header ("HTTP/1.0 200 OK");&lt;/pre&gt;&lt;br /&gt;forzando così che la mia risposta sia in HTTP/1.0...e ha funzionato!!!&lt;br /&gt;La mia spiegazione è questa: IE cerca (per motivi di sicurezza, dicono) di indentificare autonomamente il tipo di file, ignorando i Content-type e content-disposition vari che si mettono. Forzando il protocollo HTTP a 1.0 probabilmente IE si va a trovare in una modalità compatibile col vecchio protocollo, disabilitando le feature che normalmente utilizza col protocollo HTTP/1.1.&lt;br /&gt;&lt;br /&gt;Bisogna stare attenti però all'output compression: il vostro server (Apache) potrebbe avere attivo mod_gzip, il che porterebbe a "g-zippare" tutto il suo output per risparmiare banda di rete. Purtroppo il "caro vecchio" IE6 ha un po' di problemi a trattare gli header con output gzipped.&lt;br /&gt;La soluzione è in questo caso aggiungere una riga&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;apache_setenv("no-gzip","1");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;al vostro script, prima di mandare in output il file da servire. Eventualmente verificate anche che sia disattivata la compressione gzip da PHP.&lt;br /&gt;Per disattivarla occorre aggiungere&lt;br /&gt;&lt;pre&gt;ini_set("zlib.output_compression","Off");&lt;/pre&gt;&lt;br /&gt;Io ci sono impazzito 2 giorni su sta cosa...spero che possa essere d'aiuto a molti!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-2529161573431275558?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/2529161573431275558/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=2529161573431275558' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/2529161573431275558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/2529161573431275558'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/08/ie-6-header-content-disposition.html' title='IE 6: header Content-disposition ignorati (ignored) !!FIXED!!'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-2773303637102322613</id><published>2008-08-02T07:11:00.000-07:00</published><updated>2008-08-02T07:17:12.332-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Risultato del sondaggio....</title><content type='html'>Mmm...il sondaggio sul linguaggio di programmazione preferito non ha avuto il risultato che speravo... se votava più gente era meglio...&lt;br /&gt;&lt;br /&gt;Comunque, per quanto in pochi abbiano votato, il linguaggio inventato da Dennis Ritchie (Brian Kernighan ha solo aiutato Ritchie a scrivere il manuale, ma il linguaggio è tutto sudore di Ritchie!) esce vincitore, anzi stra-vincitore, con il 71% dei vostri voti...a breve quindi un post riguardante il linguaggio C!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-2773303637102322613?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/2773303637102322613/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=2773303637102322613' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/2773303637102322613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/2773303637102322613'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/08/risultato-del-sondaggio.html' title='Risultato del sondaggio....'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-4019120363180661042</id><published>2008-06-29T03:17:00.000-07:00</published><updated>2008-06-29T04:02:02.653-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Non pensavo eppure... ASP.NET</title><content type='html'>Stamattina ho voluto dare un'occhiata al framework ASP.NET&lt;br /&gt;Sempre forte del fatto che il quadrinomio LAMP fosse imbattibile (o almeno è uno dei migliori in circolazione), ho voluto provare a vedere perché molti sviluppano siti web con i linguaggi e i framework forniti da mamma Microsoft, dovendo pagare fior di quattrini per le licenze.&lt;br /&gt;&lt;br /&gt;Strano ma vero, Microsoft fornisce una versione gratuita di VisualStudio. Visual Studio Express 2008, nello specifico, è la più recente.  Richiede solo una registrazione, obbligatoria per usare il prodotto dopo 30 giorni dall'installazione. La suite intera è una ISO di circa 2 GB e mezzo ma è possibile scaricare solo parti di Visual Studio, come Visual C# 2008 Express, Visual Basic 2008 Express, SQL Server 2008 Express e via dicendo. C'é un' applicazione denominata Visual Web Developer 2008 Express, che è specifica per lo sviluppo di applicazioni web, come dice il nome, giusto? Con questa è possibile sviluppare sia in VB che in C#, appena avviate l'applicazione viene creato il server web di test e avviato il browser. Comodo!&lt;br /&gt;&lt;br /&gt;Quindi ho creato un piccola pagina web con un form dove inserire dei dati  che venivano scritti in una tabella di un database access. E fin qui tutto normale, un po' di sbattimento per capire quale oggetto utilizzare per la connessione al db (ma è normale, è stata la prima che volta che sviluppavo in ASP.NET).&lt;br /&gt;&lt;br /&gt;La cosa che mi ha stupito è il fatto che una volta creato un oggetto AccessDataSource, e aggiunto un oggetto GridView associato all'oggetto AccessDataSource, l'oggetto GridView permette&lt;span style="font-weight: bold;"&gt; &lt;span style="font-style: italic;"&gt;senza scrivere una sola riga di codice&lt;/span&gt;&lt;/span&gt; di avere già paginati,intabellati, formattati e con le colonne ordinabili, i risultati di una query SQL.&lt;br /&gt;&lt;br /&gt;Credo che per la maggior parte degli sviluppatori ASP.NET questa sia una ovvietà, ma per me, che non ho mai sviluppato con .NET, questa cosa mi ha davvero stupito in bene. Fare la stessa cosa in PHP puro avrebbe richiesto sicuramente più tempo che trascinare due oggettini sulla pagina web in produzione.&lt;br /&gt;&lt;br /&gt;Ovviamente c'é il rovescio della medaglia: bello, facile, intuitivo e veloce, ma sei uno sviluppatore ASP.NET dovvesse fare la stessa cosa senza avere a disposizione il framework .NET ci riuscirebbe lo stesso?&lt;br /&gt;&lt;br /&gt;In conclusione: .NET è molto intuitivo e veloce, ma credo che bisogni incominciare ad usarlo nella "maturità". Ovvero: prima si impara a programmare su linguaggi dove "ci si fa le ossa" e poi, quando si è "stanchi" di programmare si passa .NET. Per quel poco che ho visto credo ne valga la pena di pagare la licenza di Windows Server.&lt;br /&gt;&lt;br /&gt;Un mio amico (Sergio De Chiara di &lt;a href="http://www.windowserver.it/"&gt;windowserver.it&lt;/a&gt;) inorridirà (probabilmente no,ma essendo un dipendente Microsoft... ;-)) davanti alle mie parole di oggi, ma tanto tempo fa (era forse appena uscito VB 5 per intenderci) mi disse: "I linguaggi di programmazione visuali sono belli, facili e veloci. Ma se ti dovessero chiedere di scriverne uno come fai?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-4019120363180661042?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/4019120363180661042/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=4019120363180661042' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4019120363180661042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4019120363180661042'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/06/non-pensavo-eppure-aspnet.html' title='Non pensavo eppure... ASP.NET'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-4072525217617876647</id><published>2008-06-16T09:50:00.000-07:00</published><updated>2008-06-16T10:50:39.906-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB6'/><title type='text'>Stampare in Landscape con  Visual Basic 6 su Microsoft Office Document Image Writer</title><content type='html'>Oggi mi sono scontrato con questo problema. Se come stampante, per effettuare i vostri test senza consumare un mucchio di carta, utilizzate Microsoft Office Document Image Writer potreste avere qualche problema con l'orientamento della pagina.&lt;br /&gt;Infatti con tale "stampante" l'oggetto Printer di Visual Basic restituisce un &lt;span style="font-weight: bold;"&gt;run-time error 380&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(valore di proprietà non valido)&lt;/span&gt; nel caso vogliate stampare in Orizzontale (Landscape).&lt;br /&gt;L'unico orientamento possibile accettato da MODI Writer è infatti vbPRORPortrait (= 1).&lt;br /&gt;Ho effettuato una ricerca con Google, ma su molti blog e/o forum non si diceva altro che &lt;span style="font-style: italic;"&gt;"Mostra la finestra di dialogo della stampante e fai cambiare all'utente l'impostazione di orientamento"&lt;/span&gt; o cose del genere.&lt;br /&gt;Per ovviare a questo problema ho aggiunto una routine di gestione dell'errore che anziché cambiare l'orientamento della pagina, cambia le dimensioni del foglio:&lt;br /&gt;&lt;pre&gt;Private Sub setOrientation(Optional myOrientation As Integer = vbPRORPortrait)&lt;br /&gt; On error goto or_error&lt;br /&gt; Const usrPRDWA4 = 11907&lt;br /&gt; Const usrPRDHA4 = 16839.9&lt;br /&gt; Printer.Orientation = myOrientation&lt;br /&gt; Exit Sub&lt;br /&gt;or_error:&lt;br /&gt; Printer.PaperSize = vbPRPSUser&lt;br /&gt; If myOrientation = vbPRORLandscape Then&lt;br /&gt;     Printer.Height = usrPRDWA4&lt;br /&gt;     Printer.Width = usrPRDHA4&lt;br /&gt; Else&lt;br /&gt;     Printer.Height = usrPRDHA4&lt;br /&gt;     Printer.Width = usrPRDWA4&lt;br /&gt; End If&lt;br /&gt; Resume Next&lt;br /&gt;End Sub&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ovviamente il cambio di dimensioni del foglio avviene solo se va in errore l'assegnamento dell'attributo Orientation dell'oggetto Printer. Quindi su una stampante "normale" non dovrebbe mai accadere.&lt;br /&gt;&lt;br /&gt;Le dimensioni che vengono impostate sono le dimensioni di un foglio A4 convertite in Twips. Infatti &lt;span style="font-weight: bold;"&gt;1 cm = 567 Twips&lt;/span&gt;, quindi i 21 cm di larghezza del foglio A4 diventano 11907 Twips.&lt;br /&gt;&lt;br /&gt;A seconda delle vostre esigenze impostate anche dimensioni differenti, ma credo che anche voi come me abbiate in casa solo fogli A4. Se avete qualche idea migliore scrivetemi o lasciatemi un commento a questo post!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-4072525217617876647?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/4072525217617876647/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=4072525217617876647' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4072525217617876647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/4072525217617876647'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/06/stampare-in-landscape-con-visual-basic.html' title='Stampare in Landscape con  Visual Basic 6 su Microsoft Office Document Image Writer'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-5239103635555330061</id><published>2008-06-12T03:06:00.000-07:00</published><updated>2008-09-03T02:37:07.618-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP - come faccio a far scaricare un file fuori dalla document root del server?</title><content type='html'>Gli utenti di un sito possono, di norma, scaricare e accedere a tutto quanto sia nella document root del web server. Per proteggere i file da uno scaricamento indiscriminato potremmo utilizzare diversi metodi, per esempio utilizzare l'autenticazione HTTP fornita dal server web (.htaccess vi dice niente?).&lt;br /&gt;Oppure tenere i file scaricabili fuori dalla document root. Ma così non potrebbero essere letti direttamente dal web server.&lt;br /&gt;PHP però è in grado di leggere tutto il filesystem del server (ovviamente dove l'utente del server web ne ha i permessi), quindi per proteggere un file dallo scaricamento selvaggio si può leggere il file da scaricare con il comando &lt;a href="http://it.php.net/manual/it/function.readfile.php"&gt;readfile()&lt;/a&gt; e aggiungendo qualche header.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;downloadfile.php&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   ob_start();&lt;br /&gt;// Eseguo dei check per vedere se l'utente può scaricare il file...&lt;br /&gt; ...&lt;br /&gt; ...&lt;br /&gt;if (!$user_can_download){&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;    ob_end_flush();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-family:courier new;"&gt;   &lt;br /&gt;    die("Non hai il privilegio di scaricare questo file");&lt;br /&gt;}&lt;br /&gt;// Imposto nome e path del file&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;$pathname = "/home/web/files/";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   $filename = "pippo.pdf";&lt;br /&gt;  $mime = "application/x-pdf";&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;   ob_end_clean(); // Eventuali errori che php può dare&lt;br /&gt;                // in output vengono eliminati&lt;br /&gt;// Iniziano gli header&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;   header('Cache-Control: public, must-revalidate');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   header('Pragma: hack');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   header('Content-type: '.$mime);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   header('Content-Length: ' .filesize($pathname.$filename));&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   header('Content-Disposition: attachment; filename="'.$filename.'"');&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   header('Content-Transfer-Encoding: binary\n');&lt;br /&gt;// Leggo il file e lo mando in output&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;   readfile($pathname.$filename);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;?&amp;gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: lucida grande;"&gt;&lt;span style="font-family: georgia;"&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Il precedente script legge il file e lo manda in output, forzando oltretutto il download del file (non lo fa aprire in una scheda/finestra del browser!)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span style="font-family: georgia;"&gt;.&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Bisogna però prestare attenzione che lo script php non contenga spazi o altri caratteri dopo la chiusura del tag php (?&amp;gt;) altrimenti il file risulterebbe corrotto.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-5239103635555330061?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/5239103635555330061/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=5239103635555330061' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/5239103635555330061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/5239103635555330061'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/06/php-come-faccio-far-scaricare-un-file.html' title='PHP - come faccio a far scaricare un file fuori dalla document root del server?'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-1260246132990622338</id><published>2008-06-11T11:11:00.000-07:00</published><updated>2008-06-12T04:34:15.579-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>PHP - "require" e "include"... questi "conosciuti"</title><content type='html'>&lt;span style="font-size:onload;"&gt;&lt;span style="font-family:georgia;"&gt;Le istruzioni "require" e "include" (insieme alla varianti "require_once" e "include_once") sono utilizzatissime in PHP.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Appunto per questo talvolta non si presta attenzione alla pagina del manuale.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Esse inserisco uno script nello script corrente. Ma attenzione ai path name!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Se il file da includere è nella stessa directory di dove si trova lo script che include, oppure il file da includere è nel "include_path" del php.ini, basta scrivere il nome del file da includere.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Ma se si trova in un'altra directory e volete usare un path name relativo, dovete sempre tener ben presente che la directory corrente (.) è la directory di dove si trova il file servito dal server web.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E fin qui niente di strano! Qualche problema se non si sta attenti potrebbe verificarsi quando si includono a cascata più file (magari contenenti delle classi).&lt;br /&gt;Faccio un esempio abbastanza banale.&lt;br /&gt;&lt;br /&gt;avendo una struttura di directory con i seguenti file (pattern MVC):&lt;br /&gt;- app/classes/user.class.php, una classe che gestisce lettura/scrittura sul db dei dati di un utente&lt;br /&gt;- app/controllers/user_controller.class.php, classe che gestisce la visualizzazione&lt;br /&gt;- app/templates/user.edit.php, template per la modifica di un utente&lt;br /&gt;- app/templates/user.view.php, template per la visualizzazione di un utente&lt;br /&gt;- public_htm/index.php, pagina servita dal server web (istanzia il controller)&lt;br /&gt;&lt;br /&gt;In una configurazione simile a questa potremmo pensare che le righe iniziali dei file siano le seguenti:&lt;br /&gt;&lt;b&gt;user.class.php&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?php&lt;br /&gt;class user {&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;user_controller.class.php&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php  require_once ("../app/classes/user.class.php");&lt;br /&gt;class user_controller {&lt;br /&gt;...&lt;br /&gt;function edit(){&lt;br /&gt; ... // Do some work&lt;br /&gt; include_once ("../app/view/user.edit.php");&lt;br /&gt;}&lt;br /&gt;function view(){&lt;br /&gt; ... // Do some work&lt;br /&gt; include_once ("../app/templates/user.view.php&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;index.php&lt;/b&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;require_once ("../app/controllers/user_controller.class.php");&lt;br /&gt;$controller = new user_controller();&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Ovviamente tralasciando i file della directory app/templates/ perchè conterranno principalmente codice&lt;br /&gt;HTML.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Il problema si porrebbe a questo punto se si vuole aggiungere una directory "public_html/admin/"&lt;br /&gt;dove porre un'area riservata per un amministratore del nostro sito web.&lt;br /&gt;Nel nostro ipotetico file "public_html/admin/edit_user.php", se vogliamo utilizzare sempre le stesse classi&lt;br /&gt;per gestire la scrittura e la lettura da db (il che non sarebbe male, in quanto avremmo scritto del codice&lt;br /&gt;una sola volta!) tutti i path name inseriti fino adesso...vanno a farsi benedire.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;La soluzione è dietro l'angolo: basterebbe inserire path name assoluti e non relativi.&lt;br /&gt;Ovviamente cambiando server (banalmente passando da sviluppo a produzione) dovremmo cambiare&lt;br /&gt;tutti i path name. E qui però ci vengono in aiuto le define.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;Creiamoci una directory config/ (allo stesso livello di app/ e public_html/).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;All'interno, un file path.php che contiene una o più define, per esempio:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;define ('APP_BASE_DIR',"/home/www/app/");&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e sostituiamo tutti i path negli include e i require con qualcosa tipo:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;require_once (APP_BASE_DIR."classes/user.class.php");&lt;/pre&gt;&lt;br /&gt;Nei file "index.php" e "edit_user.php", utilizzeremo il path relativo per includere il file "config/paths.php" (nel primo anteponendo "../" e nel secondo "../../),mentre per tutti gli altri file l'inclusione verrà effettuata senza problemi utilizzando il path name assoluto.&lt;br /&gt;&lt;br /&gt;Se non sapete quale sia il path name assoluto del vostro server ricordatevi del comando "&lt;a href="http://it.php.net/manual/it/function.getcwd.php"&gt;getCwd()&lt;/a&gt;".&lt;br /&gt;Piazzandoci un bel "echo" davanti in uno script, verrete a conoscenza del path name assoluto utilizzato sul vostro server.&lt;br /&gt;Ovviamente ricordatevi di eliminare al più presto tale script, prima che possa essere fonte di vulnerabilità.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-1260246132990622338?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/1260246132990622338/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=1260246132990622338' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/1260246132990622338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/1260246132990622338'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/06/php-require-e-include-questi-conosciuti.html' title='PHP - &quot;require&quot; e &quot;include&quot;... questi &quot;conosciuti&quot;'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2461040131188227561.post-9178613753463944149</id><published>2008-06-11T08:27:00.000-07:00</published><updated>2008-06-11T08:43:08.540-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intro'/><title type='text'>Benvenuti!</title><content type='html'>Ciao a tutti, ho deciso di aprire questo blog sulla programmazione in  generale, per mettere a disposizione di tutta la comunità web le mie personali conoscenze in materia e raccogliere nuovi consigli e tecniche. Spero che lo troviate utile e che possiate anche voi arricchirlo!&lt;br /&gt;&lt;br /&gt;Un saluto,&lt;br /&gt;Daniele Veratti&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2461040131188227561-9178613753463944149?l=attitudeprogramming.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://attitudeprogramming.blogspot.com/feeds/9178613753463944149/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2461040131188227561&amp;postID=9178613753463944149' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/9178613753463944149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2461040131188227561/posts/default/9178613753463944149'/><link rel='alternate' type='text/html' href='http://attitudeprogramming.blogspot.com/2008/06/benvenuti.html' title='Benvenuti!'/><author><name>Daniele</name><uri>http://www.blogger.com/profile/02832259283470025802</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://bp0.blogger.com/_2Ajo-mgQpBo/SFDYmkBchWI/AAAAAAAAAAg/SfG90odDtUI/S220/P1010397.JPG'/></author><thr:total>0</thr:total></entry></feed>
