.net comments edit

In questi giorni sono parecchio incasinato con il lavoro e per questo sto tralasciando un po' la comunity, (forum, blog, ecc.) e me ne scuso, d'altro canto il lavoro è sempre il lavoro.

In particolar modo sto lavorando alla realizzazione di un motore di ricerca un po' diverso dal solito, ossia con la possibilità di indicizzare dei documenti presenti all'interno del nostro sito o indicizzare pagine esterne tramite url.

Per capire bene la cosa immaginiamo un sito dove le news, articoli, delibere, ecc, vengono create dinamicamte tramite un CMS o un FTP da parte dell'amministratore. 
Nel motore di ricerca del sito dobbiamodo dare la posssibilità di indicizzare anche il testo contenuto in questi file.Operazione solitamente scomoda se il cms non offre questa possibilità o l'amministratore non scrive le keyword del documento distribuito on-line in qualche field che ci andiamo a leggere successivamente.

Partendo da quest'idea la prima cosa fatta è stata una ricerca sul web di prodotti già esistenti e qui sono incappato su DotLucene, motore di ricerca realizzato in .Net, che per lo storage dell'indice utilizza un file e non un database. Da lì sono finito su SeekaFile, che non è altro che un servizio windows che indicizza dei file presenti all'interno di un path impostato da noi, con in più una dependency sul file che, nel caso venga modificato, l'indice è automaticamente aggiornato.Funzione spettacolare, ma non sempre si ha la possibilità di installare dei servizi custom sul server, quindi ho preso il tutto, ho scorporato il servizio, gli ho aggiunto un po' di plug-in per leggere l'html direttamente da un url ripulendolo e indicizzando solo il testo, stessa cosa per i PDF e RTF e ottenendo come risultato di ricerche e indicizzazione delle mie custom entity e collection (ormani le uso da tutte le parti, non mi ricordo neanche come si crea un datatable).

L'aspetto più interessante di questa versione da me creata è che tutto è utilizzabile senza realizzare nessun setup ma soltanto impostando dei valori nel web.config ed effettuando una chiamata quando si crea, upload o modifica un file.
L'indicizzazione avviene tramite thread, con una gestione della coda, a volte per leggere un pdf di diversi mega e ripulirlo la macchina può impiegare diversi secondo, ma la ricerca continua a funzionare e tutti gli altri file da indicizzare sono in attesa che finisca il primo thread.
L'indicizzazione avviene in lowpriority, il che significa che in caso altre applicazioni sul server richiedano risore lui le rilascia, aspettando che la macchina si meno indaffarata :)

Ricapitolando le caratteristiche del motore.

  • Indicizzazione su file senza Database;
  • Non necessita di installazione;
  • Indicizza documenti DOC,PDF,XLS,PPT,RTF,HTML,TXT,XML;
  • Indicizza direttamente l'HTML da un url (grabba il codice lo filtra e lo indicizza)
  • Possibilità di crearsi plug-in personalizzati e caricarli a runtime;
  • Possibilità di indicizzare direttamente delle directory;
  • Utilizzo di custom entity e collection;
  • Gestione della coda di indicizzazione;
  • Low priority per l'indicizzazione.
  • e poi non so vediamo un po' l'ispirazione cosa porta :)

Per chi fosse interessato alla cosa non posso che dire Stay Tuned!!.
( frase brutalmente copiata, non dico a chi, ma sono sicuro che lui lo sa )

Ovviamente se avete esperienze, idee o altro sono ben accette.
Chissà che non mi venga in mente di realizzare un desktop search tipo quello di Google o Microsoft, il principio è lo stesso. :D

 

asp.net comments edit

In rete ho "scovato" questo interessante link che mostra come realizzare un pannello di controllo per la gestione della cache nelle nostre applicazioni web.
Personalmente ritengo che in fase finale non serva in quanto un'applicazione dovrebbe cancellare e creare la cache automaticamente senza intervento dell'untente, ma in fase di sviluppo può diventare molto utile per capire come muoversi.

Una schermata del pannello:



Tra le caratteristiche più interessanti la possibilità di vedere il valore della cache massima utilizzata e quella attualmente disponibile oltre che la visualizzazione dei dati contenuti in cache per gli oggetti semplici (Datetime. ecc).

.net comments edit

Ci sono delle cose che a volte proprio non capisco e che mi fanno imbufalire. Ho pubblicato un lavoro abbastanza semplice realizzato in .net 1.1 su un server web (tra quelli che vanno per la maggiore). Ma quando vado a provare l'applicazione mi trovo di fronte ad un bel errore nel create directory.
Lo stack mi diceva che non avevo l'autorizzazione necessaria per la creazione della cartella; vado a controllare nel mio pannello di controllo ed era tutto ok; provo a resettare i permessi, ma niente. Preso dalla disperazione chiamo il provider chiedo un controllo, ma niente da fare l'errore persiste.
Poi, cerca cerca su google trovo questo articolo che mi risolve il problema, tranne per il fatto che se cerco di creare la cartella C:\Disney\Pluto e la cartella Disney non esiste lui va in errore.

Il problema è facilmente risolvibile con questo codice:

[DllImport("msvcrt.dll", SetLastError = true)] 
     
static extern int _mkdir(string path); 
  
static DirectoryInfo CreateDirectory(string path) 
     
{ 
    int returnCode = _mkdir(path); 
    
    if (returnCode == -1)       
    { 
        string[] percorsi = path.Split(new Char[] {'\\'} ); 
    
        if(percorsi.Length > 1)         
        { 
            if(Directory.Exists(percorsi[0]))  
            { 
                string percorso = percorsi[0] + "\\"; 
 

                for (int i = 1; i < percorsi.Length; i++) 
                { 
                    percorso += percorsi[i] + "\\"; 
               
                    if (!Directory.Exists(percorsi[i])) 
                         _mkdir(percorso); 
                } 
            } 
            else 
                throw new ApplicationException("Drive not found."); 
           
        } 
        else  
            throw new ApplicationException("String format error!"); 
       
    } 
       
    else if (returnCode != 0) 
         
    throw new ApplicationException("Error calling [msvcrt.dll]:_wmkdir(" + path + "), error code: " + returnCode.ToString()); 

    return new DirectoryInfo(path); 
     
} 

La sintassi per la creazione della cartella rimane la stessa, ma viene intercettata la funzione CreateDirecotry e sostituita con la nostra.
Un unica precisazione, all'interno del ciclo for utilizzo l'_mkdir per la creazione della cartella e non la mia funzione; faccio ciò per evitare la ricorsione.