Blog di LucaB

audio, video, disco
Add-in per Microsoft Office per leggere i file ODF (OpenOffice)

Mi è capitato di dover aprire da Office 2007 (Word ed Excel) dei file creati con OpenOffice e salvati in formato ODF (OpenDocument File), rispettivamente con estensione .odt (OpenDocument Text) e .ods (OpenDocument Spreadsheet).

Per chi dovesse avere questo stesso problema, o magari quello di aprire file .odp (OpenDocument Presentation), o più in generale di ineroperabilità tra i formati ODF e Microsoft OpenXML, può tornare utile il progetto di OpenXML/ODF Translator Add-ins for Office (grazie a Roberto per la segnalazione).

Io ho scaricato, installato e provato solo gli ODF Add-in per Word 2007 e per Excel 2007, che sembrano funzionare egregiamente.

Una volta installati gli add-in, sia in Word 2007 che in Excel 2007 compaiono due nuove voci del menù, per aprire e salvare file ODF, come nella figura seguente.

opzione per odf nel menu di word 2007

View blog reactions

Posted: Nov 03 2007, 12:34 AM by lucab | with no comments
Filed under:
Dove sono finite le mappe di Live Search Maps?

Quando è uscita la nuova versione di Live Search Maps, mi è capitata una cosa strana: ogni volta che mi collegavo all'indirizzo live.maps.com, il browser veniva reindirizzato all'indirizzo intl.local.live.com, ossia Live Local Search, per cui niente mappe.

Ho googlato un po', ma non sono riuscito a trovare nessuna soluzione, a parte che è un problema che non capita a tutti (qualcuno vede tranquillamente le mappe) e che può succedere a prescindere dal browser[1].

Mi sono ricordato che avevo avuto più o meno lo stesso problema nello scaricare Windows Live Writer. Anche in quel caso si veniva reindirizzati ad un'altra pagina, in cui non c'era traccia di Windows Live Writer, perciò si doveva ricorrere al link diretto per effettuare il download.

Allora pensai si trattasse di un problema di localizzazione e con un espediente riuscii a vedere il sito originale. Anche in questo caso ho provato ad usare lo stesso metodo ed ha funzionato.

Riepilogo i semplici passaggi, validi sia per Internet Explorer che per Firefox:

  1. impostare come prima lingua del browser l'inglese, o meglio en-US
    per farlo in IE dal menu Strumenti->Opzioni Internet, nella scheda Generale cliccare su Lingue
    per farlo con Firefox, dal menu Strumenti->Opzioni, nella scheda Avanzate cliccare su Scegli nel riquadro lingue

    cambiare le impostazioni della lingua con IEcambiare le impostazioni della lingua con Firefox
  2. eliminare la cache del browser
    in IE Strumenti->Opzioni Internet e cliccare su Elimina nella sezione Cronologia esplorazioni
    in Firefox Strumenti->Elimina dati personali
  3. riavviare il browser (non sono sicuro che sia necessario, ma io ho fatto così)

Con questo espediente non si viene più reindirizzati e finalmente appaiono le mappe, perciò ne deduco che il problema sia legato alla localizzazione. Non riesco a spiegarmi, però, come mai ripristinando l'italiano come prima lingua, Live Search Maps continua a funzionare.

E non capisco neanche perché il team di Windows Live abbia adottato questo strano metodo. Mi sembra normale, infatti, che per le versioni beta non ci sia la versione localizzata in italiano. Non mi sembra molto furbo, invece, che mi si dirotti verso un altro servizio in mancanza di una versione localizzata.


[1] In un forum qualcuno ha ipotizzato che, visto che a lui con Firefox non andava e con IE sì, la Microsoft lo avesse fatto apposta per svantaggiare Firefox (della serie zappa sui piedi...), smentito però da un altro nella situazione opposta (con Firefox andava, mentre con IE no, veniva reindirizzato). Ci mancava solo il solito consiglio di disinstallare Vista... (in compenso ho trovato quello di usare Google Maps). Per quanto mi riguarda, venivo reindirizzato sia con IE che con Firefox (par condicio quindi Stick out tongue).

View blog reactions

E vai...

reuters114612512110194311_bigafp_11461647_54560 

Big SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig SmileBig Smile

(very OT, ma chi se ne frega...)Wink

Technorati Tags: ,

View blog reactions

Posted: Oct 21 2007, 08:02 PM by lucab | with no comments
Filed under:
Burocrazia sul web - 2

La notizia del giorno ha giustamente scatenato un putiferio, per chi volesse alcuni spunti di discussione, oltre a quelli citati nel mio precedente post, può leggere qui, o qui o qui o ancora qui.

E in più si aggiunge anche la notizia della ratifica del costosissimo fallimento di Italia.it

Che ne dite di raccogliere l'idea lanciata da Andrea Boschin, il cui post condivido in pieno (ma poi ho visto anche da Beppe Grillo) e mandare tutti una mail a levi_r@camera.it (promotore della legge)? Che ne so, magari è in buona fede e non si rende conto di cosa sta combinando, avvisiamolo Wink

AGGIORNAMENTO:

mentre cominciano i primi dissensi ufficiali verso questa proposta (vedi questo post, segnalato da qui), vi segnalo questa petizione online (segnalata qui).

Io ho già firmato, ed ho pure messo il banner in questo blog, fermiamola finché siamo in tempo.

Technorati Tags: , ,

View blog reactions

Posted: Oct 19 2007, 04:15 PM by lucab | with 2 comment(s)
Filed under:
Burocrazia sul web

Stamattina ho letto questa notizia e le prime reazioni.

Che dire, sono sconcertato, l'Italia è forse l'unico paese in cui registrare un dominio è un'operazione burocratica e lenta (si usa ancora il fax), adesso si vogliono pure peggiorare le cose.

Posso capire l'esigenza di evitare che il web possa essere usato con disinvoltura come mezzo di diffamazione, ma non comprendo la necessità di introdurre iscrizioni, bolli e quindi burocrazia e costi.

Spero solo di sbagliarmi e che questa legge non tocchi siti amatoriali e blog personali, come ha affermato qualcuno degli ideatori di questa che per ora è solo una proposta.

Però non mi è chiaro come si stabilisce quando un sito è amatoriale e quando no. Ad esempio questa e altre community come potrebbero essere classificate?

E poi dopo aver visto partorire, non molto tempo fa, la Legge Urbani, a mio parere indecente scritta male[1], sono molto scettico sulla capacità di legiferare in un campo che evidentemente non è molto conosciuto da chi se ne vorrebbe occupare, o forse viene proprio temuto, per la libertà che offre questo mezzo di comunicazione.

Temo, insomma, che ci aspetti un altro obbrobrio.


[1] anche soltanto limitandosi agli aspetti tecnici, tanto è vero che per certi versi non è applicata in quanto inapplicabile (vedi qui), mentre dov'è stata applicata, come la tassa sulle memorie, ossia HD, CD, DVD, ecc., (e meno male che quello era il governo di meno tasse per tutti) viene puntualmente elusa con conseguenze assurde.

Technorati Tags: , ,

View blog reactions

Posted: Oct 19 2007, 01:02 PM by lucab | with 1 comment(s)
Filed under:
Branching patterns e anti-patterns

Segnalo questo post su Coding Horror, che vale sempre la pena leggere, da cui si arriva a Branching and Merging Primer, in cui si elencano una serie di pattern di branching (per release, code-promotion, per task, per component, per tecnologia) nonché di anti-pattern di merging e branching (se siamo in uno di questi casi, allora qualcosa non va):

  • Merge Paranoia—avoiding merging at all cost, usually because of a fear of the consequences.
  • Merge Mania—spending too much time merging software assets instead of developing them.
  • Big Bang Merge—deferring branch merging to the end of the development effort and attempting to merge all branches simultaneously.
  • Never-Ending Merge—continuous merging activity because there is always more to merge.
  • Wrong-Way Merge—merging a software asset version with an earlier version.
  • Branch Mania—creating many branches for no apparent reason.
  • Cascading Branches—branching but never merging back to the main line.
  • Mysterious Branches—branching for no apparent reason.
  • Temporary Branches—branching for changing reasons, so the branch becomes a permanent temporary workspace.
  • Volatile Branches—branching with unstable software assets shared by other branches or merged into another branch.
    Note   Branches are volatile most of the time while they exist as independent branches. That is the point of having them. The difference is that you should not share or merge branches while they are in an unstable state.
  • Development Freeze—stopping all development activities while branching, merging, and building new base lines.
  • Berlin Wall—using branches to divide the development team members, instead of dividing the work they are performing.

Technorati Tags:

View blog reactions

Posted: Oct 09 2007, 01:54 AM by lucab | with no comments
Filed under:
Gestire diversi file di configurazione (web.config) nello stesso progetto

Ogni volta che lavoro ad un'applicazione web ho il problema di dover modificare alcune righe del file web.config per gestire alcune situazioni ricorrenti.

Di solito, infatti, devo modificare le connection string, impostare il debug a false o a true nella sezione compilation(ma anche la voce debug o i customerrors) a seconda che stia sviluppando il sito dal pc in azienda o dal notebook connesso mediante VPN, oppure che lo debba provare sul server locale, o per pubblicarlo on line.

Il tutto è complicato dal fatto che potrei non essere l'unico a lavorare su quel progetto e che comunque lavoro in un ambiente con source control (Subversion nel mio caso).

In questo post di Scott Guthrie viene spiegata una soluzione molto comoda a questo problema, sfruttando le configurazioni di build della soluzione e del progetto e gli eventi di pre-build. La procedura dettagliata, che è descritta nei particolari in questo post di Scott Hanselman, può essere riassunta nei seguenti passi:

  1. È essenziale che si parta da un progetto di tipo ASP.NET web application, per poter sfruttare gli eventi di pre-build, che non sono disponibili quando si sceglie "Nuovo sito web".image
  2. In configuration manager, accessibile dalla barra degli strumenti standard (vedi figura a lato),  aggiungiamo le nuove configurazioni, oltre a quelle di default (Debug e Release);
    nel creare le nuove configurazioni, bisogna stare attenti a crearle sia per la soluzione che per il progetto; si può partire indifferentemente da uno dei due e mettere una spunta alla richiesta di creare una nuova configurazione anche per l'altro.
  3. Per ciascuna configurazione creiamo un file web.config (magari copiandolo da quello esistente) e chiamiamolo web.config.nomeConfigurazione, ad esempio web.config.debug, ecc.;
    personalizziamo quindi ciascuno dei file a seconda della configurazione, ad esempio cambiandone la connection string.

A questo punto abbiamo impostato diverse configurazioni per la soluzione e per il progetto e per ciascuna di esse abbiamo un diverso file di configurazione web.config

Dobbiamo solo aggiungere un evento di pre-build che si occupi di sovrascrivere automaticamente al file web.config la versione specifica della configurazione impostata.

Per evitare di sovrascrivere comunque il file web.config[1], possiamo utilizzare un file batch che effettui la copia solo nel caso in cui riscontra delle differenze tra il web.config e le impostazioni legate alla configurazione.

Ad esempio, salviamo nella root del progetto un file chiamato copyifdifferent.bat, con le seguenti istruzioni:

@echo off
echo Confronto il file %1 con il file %2

if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound

fc %1 %2
if %ERRORLEVEL%==0 GOTO NoCopy

echo I file sono differenti. Copio %1 su %2.
copy %1 %2 /y & goto END

:NoCopy
echo I file sono uguali. Non effettuo la copia.
goto END

:File1NotFound
echo Il file %1 non esiste. Impossibile effettuare la copia.
goto END

:File2NotFound
echo Il file %2 non esiste. Copio %1.
copy %1 %2 /y
goto END

:END
echo Fine.

A questo punto non resta che impostare un evento di pre-build. Visualizziamo la finestra proprietà del progetto (tasto destro sul progetto e poi proprietà) e in questa scegliamo la scheda "compile" e quindi in basso il tasto "build events".

Nella finestra che compare, scriviamo nello spazio per la command line dell'evento di pre-build:

"$(ProjectDir)copyifdifferent.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"

Adesso basterà scegliere la configurazione voluta e Visual Studio modificherà, se necessario, il file web.config con le impostazioni specifiche.  

Fonti:


[1] Ogni volta che si modifica il file web.config (e quindi anche se lo si sovrascrive con un file identico), tutti i designer e gli AppDomain avviati che guardano ad esso vengono fatti ripartire.

Technorati Tags: ,

View blog reactions

Posted: Oct 08 2007, 08:55 AM by lucab | with no comments
Filed under: ,
Mappe di Virtual Earth e controllo Tabs di AJAX Control Toolkit

Sto usando sempre più spesso i controlli dell'AJAX Control Toolkit, anche se non senza qualche problema: sono carini e comodi, ma anche ben forniti di bug.

Poco tempo fa ho scoperto un comportamento strano del controllo Tabs dell'AJAX Control Toolkit quando usato insieme a una mappa Virtual Earth.

Il codice utilizzato era il seguente:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="TabsSample.aspx.vb"
Inherits="TabsSample" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
TagPrefix="cc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Tabs e mappe</title> <script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=5"
type="text/javascript"></script> <script type="text/javascript"> <!-- function GetMappa() { map = new VEMap('divMappa'); map.SetDashboardSize(VEDashboardSize.Small); map.LoadMap(new VELatLong(40.8224663105625, 16.4207463591201), 16,
'h', false, VEMapMode.Mode2D, false); map.SetScaleBarDistanceUnit(VEDistanceUnit.Kilometers); var pp = new VEShape(VEShapeType.Pushpin, map.GetCenter()); pp.SetTitle("Sede Webis"); pp.SetDescription("<a href='http://www.webis.it' target='_blank'
title='WEBIS'><img src='http://www.webis.it/images/logomappa.png'
alt='WEBIS'></a><p>La sede di <a href='http://www.webis.it'
target='_blank' title='WEBIS'>Webis</a>"); map.AddShape(pp); } //-->
</script> </head> <body onload="GetMappa()"> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <div> <cc1:TabContainer iD="TC1" runat="server" ActiveTabIndex="0"> <cc1:TabPanel runat="server" ID="TP1"> <HeaderTemplate> Mappa </HeaderTemplate> <ContentTemplate> <div id="divMappa"
style="position: relative; width: 400px; height: 300px;"> </div> </ContentTemplate> </cc1:TabPanel> <cc1:TabPanel runat="server" ID="TP2">
<HeaderTemplate> Altro </HeaderTemplate> <ContentTemplate> <p>Bla bla bla</p> </ContentTemplate> </cc1:TabPanel> </cc1:TabContainer> </div> </form> </body> </html>

Il risultato è che il centro della mappa risulta spostato in alto a sinistra, e la mappa è fuori dalla visibilità. In pratica quello che si vede nei due screenshot, a sinistra come appare la mappa con il codice riportato, a destra invece come dovrebbe apparire.

mappa sballata mappa corretta

Dopo vani smanettamenti sul DOM e CSS e dopo aver verificato che quasi casualmente talvolta la mappa veniva visualizzata correttamente, ho cercato un po' in rete e lì ho trovato che altri avevano riscontrato lo stesso problema utilizzando le mappe di Google, ma con una differenza: questo strano comportamento avveniva solo se la mappa non era presente nel primo tab container, ma in uno dei successivi.

Ho verificato che la stessa cosa avveniva pure nel mio caso, e secondo me potrebbe non trattarsi di un vero e proprio bug, ma di una incompatibilità congenita del codice javascript necessario a costruire la mappa con quello necessario a gestire i tabs. La mappa viene fuori "sballata" poiché viene costruita all'interno di un container che ha larghezza zero, per cui qualcosa va storto. Pertanto anche quando si passa a visualizzare il tab con la mappa, restituendogli una larghezza effettiva con javascript, questa non viene visualizzata correttamente.

Ma perché allora nel mio caso il problema si presentava anche nel caso in cui la mappa fosse inserita nel primo tab?

Be' per risolvere il tutto è bastato eliminare dal codice ActiveTabIndex="0" lasciando che si attivasse da solo il primo tab per default (e questo mi sembra proprio un bug).

Con questo workaround ho risolto il problema, rimane però il fatto che per poter inserire delle mappe all'interno di un controllo Tabs si è costretti ad utilizzare solo il primo.

 View blog reactions

Come personalizzare il controllo Tabs (e quello Calendar) dell'Ajax Control Toolkit usando i fogli di stile

Ho inserito il controllo Tabs dell'AJAX Control Toolkit in un sito web ed avevo la necessità di personalizzarne l'aspetto per adeguarlo alla grafica del sito.

Le spiegazioni fornite sul sito live dell'AJAX Control Toolkit sono alquanto scarne, perciò anche dopo aver smanettato un bel po' coi fogli di stile, non ero ancora riuscito a combinare niente di decente.

Ho cominciato a cercare in giro, ma le ricerche fatte sul forum ufficiale e in rete mi portavano sempre ad un link ormai inesistente Angry, nel quale, come dicevano tutti, c'era la soluzione ai miei problemi.

Solo dopo un bel po' di giri sono finalmente arrivato a questa pagina.

Qui Ron Buckton chiarisce anzitutto che questo post riproduce l'articolo originale non più disponibile in rete (quello misteriosamente scomparso Surprise).

L'articolo vero e proprio, quindi, spiega dettagliatamente come modificare attraverso classi CSS gli elementi dei controlli Calendar e Tabs, riportandone per intero le classi di default.

Per tutti i particolari: Skinning model for Calendar and Tabs in Ajax Control Toolkit

Technorati Tags: ,

View blog reactions

Posted: Oct 04 2007, 01:43 AM by lucab | with no comments
Filed under: , ,
Io sono incasinato, ma le poste...

Non scrivo da moltissimo tempo, avrei anche dei post mezzi pronti, ma sono davvero impegnatissimo tra famiglia e lavoro praticamente da luglio (ferie a parte).

C'è chi sta evidentemente peggio di me: le poste (italiane?).

Wall Clocks - Whatever Wall ClockA maggio, infatti, ho vinto il 10 premio di Community Credit.

In realtà l'orologio da polso che avevo vinto non era più disponibile, per cui l'hanno sostituito con quello da muro in foto ed hanno spedito il premio il 9 luglio avvisandomi per e-mail che mi sarebe arrivato entro 6-8 giorni lavorativi.

Be', mi è arrivato il 20 settembre scorso: possibile che tra il 9 luglio ed il 20 settembre ci siano solo 8 giorni lavorativi nei paesi che ha dovuto attraversare? (visti i tempi, non posso credere che sia arrivato in Italia direttamente dagli USA).

(Ingrandendo la foto sotto si può vedere come il pacco sia stato effettivamente inviato a luglio e mi sia stato recapitato il 20 settembre, tra l'altro non subito ma con un avviso nella cassetta nonostante l'ufficio fosse aperto!) 

DSC_3726

A presto (spero Indifferent)

Technorati Tags: ,

View blog reactions

Posted: Oct 03 2007, 02:02 AM by lucab | with 2 comment(s)
Filed under:
Chiuso per ferie

Finalmente sono arrivate le ferie. E ci volevano proprio, dopo 15 giorni massacranti, tra impegni di lavoro, con scadenze da rispettare tassativamente, e non meno gravosi impegni in famiglia. (Anche per questo è da un bel po' che non postavo nulla).

Ne approfitterò per rilassarmi un po' e andare in giro, perciò credo che difficilmente posterò altro fino a fine mese.

Buone vacanze.

Technorati Tags:

View blog reactions

Posted: Aug 10 2007, 04:48 PM by lucab | with 1 comment(s)
Filed under:
Sitemap 0.90: un HttpHandler per i motori di ricerca

Come anticipato in questo post, ho scritto un semplice HttpHandler che costruisce il file XML sitemap rispondente alle specifiche Sitemap 0.90, basato sulla classe System.Web.SiteMap.

Per chi utilizza ASP.NET 2.0, può essere comodo implementare un HttpHandler che costruisca la sitemap a partire dal file con estensione .sitemap (utilizzato dalla classe System.Web.SiteMap). Tra l'altro, in caso di modifiche alla struttura del sito, si avrebbe in automatico la nuova sitemap, al massimo toccherà segnalarla nuovamente ai motori di ricerca.

Possiamo, inoltre, personalizzare il file .sitemap ed il codice dell'HttpHandler per fargli includere nella mappa del sito anche anche le pagine dinamiche.

Avevo già realizzato qualcosa del genere, pescando a piene mani da basandomi soprattutto su alcuni esempi di Andrea Boschin[1], come l'articolo indicato in questo post e il suo webcast su tecniche di Search Engine Optimization con ASP.NET 2.0.

Ho ripreso quel codice e guardando un po' in rete ho trovato che anche qualcun'altro ha già realizzato qualcosa del genere.

Vediamo pertanto come costruire l'HttpHandler.

Anzitutto bisogna considerare che il file .sitemap può contenere, per ciascun nodo, anche altri attributi personalizzati, che potremmo sfruttare per i nostri scopi.

Allora considerato un semplice sito web, possiamo scriverne il file Web.sitemap aggiungendo (facoltativamente) 3 parametri a ciascun nodo:

  • LastChangeDate - rappresenta la data dell'ultima modifica della pagina, scritta secondo il formato W3C Datetime
  • ChangeFrequency - è la frequenza stimata di modifica della pagina, può avere uno dei seguenti valori (autoesplicativi)
    • always
    • hourly
    • daily
    • weekly
    • monthly
    • yearly
    • never
  • Priority - è la priorità relativa della pagina, ossia quanto riteniamo importante quella pagina relativamente alle altre della sitemap, con valori da 0.0 a 1.0

Ad esempio un semplice file Web.sitemap

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns=http://schemas.microsoft.com/AspNet/SiteMap-File-1.0>
  <siteMapNode url="~/Default.aspx" title="Home" description="Home Page">
    <siteMapNode url="~/Profile.aspx" title="Profile" description="Company"/>
    <siteMapNode url="~/Info.aspx" title="Info" description="Info"/>     
  </siteMapNode>
</siteMap>

diventa:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/Default.aspx" title="Home" description="Home Page" 
LastChangeDate="2006-04-26" Priority="0.9" ChangeFrequency="weekly" > <siteMapNode url="~/Profile.aspx" title="Profile" description="Company"
LastChangeDate="2007-07-16T19:20:30+01:00" Priority="0.4"/> <siteMapNode url="~/Info.aspx" title="Info" description="Info"
Priority="0.8"
LastChangeDate="2007-07-16T19:20:40+01:00"
ChangeFrequency="yearly"
/> </siteMapNode> </siteMap>

Si può realizzare un primo semplice HttpHandler con il codice seguente:

Namespace Handlers
  Public Class SiteMapHttpHandler : Implements IHttpHandler

    Public Sub ProcessRequest(ByVal context As HttpContext) _
Implements IHttpHandler.ProcessRequest Using writer As XmlWriter = _
XmlWriter.Create(context.Response.OutputStream) writer.WriteStartElement("urlset", _
"http://www.sitemaps.org/schemas/sitemap/0.9") Me.WritePageNode(writer, SiteMap.RootNode, _
context.Request.ApplicationPath) writer.WriteEndElement() End Using End Sub Private Sub WritePageNode(ByVal wr As XmlWriter, _
ByVal siteMapNode As SiteMapNode, ByVal appPath As String) If siteMapNode IsNot Nothing Then If siteMapNode.Url <> "" Then SiteMapHttpHandler.WriteUrl(wr, siteMapNode) End If Dim child As SiteMapNode For Each child In siteMapNode.ChildNodes Me.WritePageNode(wr, child, appPath) Next End If End Sub Private Shared Sub WriteUrl(ByVal wr As XmlWriter, _
ByVal smp As SiteMapNode) wr.WriteStartElement("url") ' parametro obbligatorio, presente come condizione per chiamare wr.WriteStartElement("loc") wr.WriteString(("http://www.miosito.it" & _
VirtualPathUtility.ToAbsolute(smp.Url))) wr.WriteEndElement() ' parametri facoltativi, da controllare con delle regex ' sperando che siano giuste ;-) Dim rx As Regex rx = New Regex("^\d\d\d\d((-\d\d)|(-\d\d-\d\d(T\d\d\:\d\d(\:\d\d" & _
"(\.\d+)?)?(Z|(((\+)|(\-))\d\d\:\d\d)))?))?$", RegexOptions.Compiled) If (smp.Item("LastChangeDate") <> "") AndAlso _
(rx.IsMatch(smp.Item("LastChangeDate"))) Then wr.WriteStartElement("lastmod") wr.WriteString(smp.Item("LastChangeDate")) wr.WriteEndElement() End If
rx = New Regex("^((always)|(hourly)|(daily)|(weekly)|(monthly)|" & _
"
(yearly)|(never))$
", RegexOptions.IgnoreCase Or RegexOptions.Compiled) If (smp.Item("ChangeFrequency") <> "") AndAlso _
(rx.IsMatch(smp.Item("ChangeFrequency"))) Then wr.WriteStartElement("changefreq") wr.WriteString(smp.Item("ChangeFrequency").ToLower) wr.WriteEndElement() End If rx = New Regex("^(0?\.\d)|((0|1)(\.0)?)$", RegexOptions.Compiled) If (smp.Item("Priority") <> "") AndAlso _
(rx.IsMatch(smp.Item("Priority"))) Then wr.WriteStartElement("priority") wr.WriteString(smp.Item("Priority")) wr.WriteEndElement() End If wr.WriteEndElement() End Sub Public ReadOnly Property IsReusable() As Boolean _
Implements IHttpHandler.IsReusable Get Return True End Get End Property
End Class End Namespace

Basta registrare l'HttpHandler nel file web.config:

<httpHandlers>
   <add path="sitemap.axd" verb="GET" type="Handlers.SiteMapHttpHandler"/>
</httpHandlers>

Il risultato è questo:

<?xml version="1.0" encoding="utf-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.miosito.it/Default.aspx</loc>
    <lastmod>2006-04-26</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>http://www.miosito.it/Profile.aspx</loc>
    <lastmod>2007-07-16T19:20:30+01:00</lastmod>
    <priority>0.4</priority>
  </url>
  <url>
    <loc>http://www.miosito.it/Info.aspx</loc>
    <lastmod>2007-07-16T19:20:40+01:00</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

visualizzabile nel browser all'indirizzo http://www.miosito.it/sitemap.axd

Ovviamente tale file dovrà essere segnalato ai principali motori di ricerca e nel file robots.txt.

In un prossimo post proverò a personalizzare il codice per includere pagine generate dinamicamente.

Technorati Tags: , , , ,

View blog reactions


[1] Andrea Boschin ha da poco ricevuto il premio di MVP per ASP.NET. Quando l'ho saputo sono rimasto stupito, poiché ero convinto che lo fosse già da tempo, vista la qualità dei suoi interventi.
Sitemap per i motori di ricerca

Le sitemap a cui ci si riferisce nel titolo servono ad informare i motori di ricerca su quali siano le pagine di un sito disponibili per la scansione e quindi per essere indicizzate. Contribuiscono, pertanto, ad un migliore posizionamento delle pagine del sito nei risultati delle ricerche. 

Possono essere dei semplici file di testo, costituiti dall'elenco degli URL corrispondenti a ciascuna pagina. Oppure dei file XML, in cui ad ogni URL è possibile associare dei metadati, come la data dell'ultimo cambiamento, la frequenza con cui la pagina viene modificata o ancora l'importanza di tale pagina relativamente alle altre del sito.

Vagando per la rete mi sono imbattuto in questo post sul blog di Marco D'Angelo (che spesso si occupa di Community Server) e da lì ho appreso, con notevole ritardo[1], che Google, Yahoo e Live Search, ossia i più utilizzati motori di ricerca, supportano insieme lo stesso protocollo delle sitemap.

Un protocollo serve appunto a definire come deve essere fatto il file XML della sitemap, ed in genere dipende dallo specifico motore di ricerca. Quello descritto su sitemaps.org (Sitemap 0.90), per il fatto stesso di essere accettato e supportato dai prinicipali motori di ricerca, si propone come uno standard adottato a livello generale.

Chi come me utilizza ASP.NET 2.0 ha avuto a che fare con gli strumenti offerti dal framework per la navigazione del sito, come i comodi controlli Menu, SiteMapPath, ecc., basati sulla classe System.Web.SiteMap.

Per chi non lo sapesse, la classe System.Web.SiteMap contiene la rappresentazione della struttura di navigazione del sito, composta da una collezione gerarchica di nodi. A ciascun nodo corrisponde una pagina o una directory dell'applicazione. Il provider predefinito per questa classe è la classe XmlSiteMapProvider, che serve a recuperare le informazioni dalla sorgente dati, ossia, nel caso predefinito, da un file XML con estensione .sitemap (per approfondimenti si può partire da qui oppure da qui).

Può essere molto comodo, allora, riuscire a generare in automatico un file XML di sitemap, secondo le specifiche Sitemap 0.90, utilizzando la classe System.Web.SiteMap, eventualmente modificando il file .sitemap ed estendo il provider per SiteMap. E magari utilizzando un HttpHandler, ma questo sarà oggetto di prossimi post.

Technorati Tags: , ,

View blog reactions


[1] La notizia risale al 15/11/2006
Posted: Jul 25 2007, 11:56 PM by lucab | with 1 comment(s)
Filed under:
Icone in Vista

Ho appena finito l'upgrade di un notebook da XP a Vista. Sembra che tutto sia andato per il meglio, però mi era rimasto un piccolo problema, retaggio di un programmino per XP che lo rendeva graficamente simile a Vista. Avevo provveduto a disinstallare il programmino, ma l'icona dell'hard disk non risultava visibile. Non c'è però la possibilità di cambiare direttamente l'icona, né avevano effetto cambiamenti del tema.

Ho creato un collegamento all'hard disk e da lì ho potuto verificare che per l'icona si faceva riferimento ad un file non più esistente, poiché cancellato con la disinstallazione del programmino.

Cercando nel registro un riferimento a quel file ho trovato la chiave:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\explorer\DriveIcons

qui era specificata un'ulteriore chiave C e all'interno di essa il valore DefaultIcon con il percorso al file incriminato.

Per ripristinare il tutto è bastato eliminare la chiave DriveIcons. Probabilmente (ma non ho provato), si può fare anche il contrario, ossia aggiungere le chiavi ed un path ad un file .ico per impostare un'icona personalizzata per i drive.

Technorati Tags:

View blog reactions

Posted: Jul 20 2007, 11:58 AM by lucab | with no comments
Filed under:
Debug di JavaScript con VS 2008

In questo post Scott Guthrie illustra le nuove caratteristiche del debug di JavaScript in VS 2008 (anche nella versione Express), che semplificano significativamente la realizzazione di applicazioni web con AJAX.

Nello stesso post si trovano due link a post che spiegano come arrangiarsi se si usa VS 2005:

View blog reactions

More Posts « Previous page - Next page »