November 2005 Blog Posts


try ruby! (in your browser)

Una (IMHO) fantastica web application in ajax per provare ruby. Scrivete help sula console per far partire il tutorial try ruby! (in your browser) P.S: E' vero che tanti considerano ajax "aria fritta", però che figata...   powered by IMHO 1.3

Invoke e Compact Framework

Dell'importanza del metodo Control.Invoke non mi sembra il caso di discuterne nemmeno; è stato sorprendente per me però scoprire che di base non è possibile passare argomenti ad un metodo tramite invoke nel compact framework, visto e considerato che nell'ambiente di sviluppo per palmari l'overload  public virtual object Invoke(Delegate, object[]); non è supportato! Ecco quindi una classe, leggermente maneggiata (ma nemmeno tanto) rispetto a quella disponibile qui, per superare la limitazione: using System;using System.Collections;using System.Windows.Forms;namespace TerraNova.OnSite{        public delegate void MethodCallInvoker (object[] o);    public class ControlInvoker    {        private class MethodCall         {            public MethodCallInvoker invoker;            public object[] arguments;            public MethodCall (MethodCallInvoker invoker, object[] arguments)             {                this.invoker = invoker;                this.arguments = arguments;            }        }        private Control control;        private Queue argumentInvokeList = new Queue();        public ControlInvoker(Control control)         {            this.control = control;        }        public void Invoke(MethodCallInvoker invoker, params object[] arguments)         {            this.argumentInvokeList.Enqueue(new MethodCall(invoker, arguments));            control.Invoke(new EventHandler(ControlInvoke));        }        private void ControlInvoke (object sender, EventArgs e)         {            MethodCall methodCall = (MethodCall)argumentInvokeList.Dequeue();            methodCall.invoker(methodCall.arguments);        }    }}   powered by IMHO 1.3

ImpersonationChanger: una classe per la modifica a runtime dell'account loggato al sistema

Questa classe incapsula una serie di dichiarazioni P/INVOKE per la modifica a runtime dell'utente loggato al sistema, utile ad esempio se da una pagina ASP.NET occorre accedere MOMENTANEAMENTE a risorse accessibili solo come utente != ASP.NET... Chiaramente occhio a quello che fate... using System;using System.Runtime.InteropServices;using System.Security.Principal;namespace GisSharpBlog.Logging{    /// <summary>    /// Changes the account logged to system.    /// </summary>    public class ImpersonationChanger : IDisposable    {                #region STATIC P/INVOKE DECLARATIONS        [DllImport("advapi32.dll")]        private static extern int LogonUser(string userName, string domain, string password,                                            int logonType, int logonProvider, ref IntPtr token);        [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]        private static extern int DuplicateToken(IntPtr token, int impersonationLevel, ref IntPtr newToken);        [DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]        private static extern bool RevertToSelf();        [DllImport("kernel32.dll", CharSet=CharSet.Auto)]        private static extern  bool CloseHandle(IntPtr handle);                #endregion        #region PARAMETERS                private const int LOGON32_LOGON_NETWORK = 3;        private const int LOGON32_PROVIDER_DEFAULT = 0;            #endregion                #region CLASS IMPL        private WindowsImpersonationContext impersonationContext = null;        private string domain = String.Empty;        private string username = String.Empty;                private string password = String.Empty;                        public ImpersonationChanger(string domain, string username, string password)        {            this.domain = domain;            this.username = username;            this.password = password;        }        /// <summary>        /// Log to system with modified user informations.        /// </summary>                /// <exception cref="ApplicationException">If wrong user parameters are used.</exception>        public WindowsImpersonationContext ImpersonateValidUser()        {            WindowsIdentity windowsIdentity = null;            IntPtr token = IntPtr.Zero;                        if(RevertToSelf())            {                if(LogonUser(username, domain, password, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, ref token) != 0)                {                                        windowsIdentity = new WindowsIdentity(token);                        impersonationContext = windowsIdentity.Impersonate();                    if (impersonationContext != null)                    {                                                CloseHandle(token);                                                return impersonationContext;                    }                }            }            if(token != IntPtr.Zero)                    CloseHandle(token);                        throw new ApplicationException("Should never reach here!");        }        /// <summary>        /// Revert changes.        /// </summary>        /// <param name="impersonationContext"></param>        public void UndoImpersonation()        {                    if(impersonationContext != null)                impersonationContext.Undo();            impersonationContext = null;        }        #endregion        #region IDISPOSABLE IMPL        /// <summary>        ///         /// </summary>        public virtual void Dispose()        {            Dispose(true);            GC.SuppressFinalize(this);                    }        protected virtual void Dispose(bool disposing)         {            if (disposing)                             UndoImpersonation();                impersonationContext = null;        }                ~ImpersonationChanger()        {            Dispose (false);        }        #endregion    }} download code Ecco come si usa: using(new GisSharpBlog.Logging.ImpersonationChanger("domain", "username", "password")){    // Do work with new log user credentials...}// Continue with old credentials... Difficile, no? Sia benedetto il pattern Dispose... Posto un paio di configurazioni: questo codice mi serviva per accedere a dei files in rete locale da un WebService, cosa che l'utente normale ASP.NET non permette di fare; ora, non sono riuscito a compiere tale operazione utilizzando questa classe (da alcuni post trovati su internet pare che non sia possibile se non...

Prossima trasferta a Milano... Microsoft Mobile Conference!

Compatibilmente con gli impegni e le risorse finanziarie, mi sembra molto interessante come conferenza, soprattutto perchè il Compact Framework 2.0 è un bel salto in avanti... Se qualcuno si aggrega, magari si fa il viaggio insieme Iscrizioni aperte alla Microsoft Mobile Conference : evento gratuito del 15 Dicembre dovi si parlerà di sviluppo mobile con la piattaforma .NET Compact Framework 2.0, Visual Studio 2005 e SQL 2005 Mobile (tutti rilasciati settimana scorsa) . La giornata si propone con una serie di sessioni che vanno dalle caratteristiche di base di VS 2005 fino all'approfondimento di alcune tecniche per l'ottimizzazione dell'accesso a SQL 2005 Mobile. Molti...

[OT] : Veronesi, la chiesa, l'eutanasia...

Segnalo un articolo estremamente interessante dell'oncologo Umberto Veronesi sul sito della Repubblica. Lo segnalo perchè parla, con la competenza, la pacatezza e la decisione che solo un uomo di scienza e di cultura come lui può dare, di argomenti "spinosi" e importanti, e di questi tempi poche persone parlano di argomenti "spinosi" e importanti in  modo così chiaro. Certo che bruciare la sua candidatura a sindaco di Milano è stata una bella stupidaggine, anche se una intervista del genere avrebbe di certo messo in difficoltà una buona parte della "sinistra" (mi immagino le reazioni di Rutelli e Mastella...). Ecco alcuni estratti: In questo clima che...

Classe Color, serializzazione XML, WebServices...

Memore dei "problemi" avuti in un recente passato da Igor con la serializzazione della struttura Color, non mi sono stupito più di tanto quando non ho trovato i membri R, G, e B di una mia proprietà di tipo Color "dall'altra parte" di un Web Service... Mi spiego meglio: ho realizzato un semplice WebService (che dovrà essere obbligatoriamente consumato da una applicazione .NET - Desktop e PocketPC), che espone una classe, la quale contiene una proprietà, TrasparentColor, di tipo Color per l'appunto. Lato client, e per gli stessi motivi citati da Igor nel suo post, non vengono ricostruite le proprietà che permettono di recuperare i valori...

Anche SourceForge si rifà il trucco...

Dopo asp.net e gotdotnet, pure sourceforge cambia layout: da oggi (pare) con ancora più XMLHttpRequest (sta frase mi ricorda una certa maglietta...). Cmq fatto bene... P.S: scusate la pubblicità occulta, ma è per campa... powered by IMHO 1.3

Google Base in partenza!

E finalmente aggiungo io... Google Base powered by IMHO 1.3

P/Invoke e PocketPC: la rivincita di .NET...

Al di là del titolo stupido, i problemi di "convivenza" tra PocketPC e codice nativo C++ che citavo in precedenza sono stati risolti grazie alla segnalazione di Stefano Ottaviani : su MSDN ci sono una serie di articoli che spiegano + o - tutto quello che c'è da sapere... compreso il problema della ridenominazione dei metodi, che in realtà si chiama Name Mangling: basta aggiungere alla firma dei metodi extern  "C" per evitare la modifica del nome dei metodi! Per quanto riguarda il problema dell'eccezione NotSupportedException generata se si usano come tipo...

P/Invoke e Pocket PC: istruzioni per l'uso

Parallelamente al progetto che sto intraprendendo attualmente, ho iniziato a seguire un "percorso alternativo": sto cercando di vedere se e come realizzare un software GIS su piattaforme PocketPC.Nell'analisi delle possibilità di sviluppo del software, ho verificato che non esiste la possibilità di gestire via palmare i file .dbf tramite codice managed, sia tramite il Compact Framework 1/2, che tramite estensioni OpenNET o componenti esterni.Siccome xò i file dbf sono alla base della gestione degli attributi nei file shapefile (PDF delle specifiche del formato di file Shapefile), ed è essenziale che qualsiasi cosa si chiami GIS gestisca bene questo formato di file (che...

DllImport ed extern functions: tipi unmanaged e corrispondenti tipi managed

Questa tabella riassuntiva penso sarà utile a chiunque stia "impazzendo" col P/Invoke, (e dire che l'intervento di Raffaele al workshop è stato pure molto istruttivo... C/C++ C# HANDLE, LPDWORD, LPVOID, void* IntPtr LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t*, LPWSTR String [in], StringBuilder [in, out] DWORD, unsigned long, Ulong UInt32, [MarshalAs(UnmanagedType.U4)] bool bool LP<struct> [In] ref <struct> SIZE_T uint LPDWORD out uint LPTSTR [Out] StringBuilder PULARGE_INTEGER out ulong WORD uInt16 Byte, unsigned char byte Short Int16 Long, int Int32 float single double double NULL pointer IntPtr.Zero Uint Uint32 L'articolo completo lo trovate qui P.S: Postare senza IMHO (che non so perchè oggi non vuole andare... aspetto di riavviare il PC e riprovare prima di dichiararlo un bug!) è un incubo...

[OT] IE in un tab di firefox!

Chi usa Firefox conosce sicuramente IE View, che permette di aprire il browser Internet Explorer durante la navigazione in internet con Firefox. Con IETab però è possibile aprire IE come tab di Firefox! Fantastico...

[OT - Fantacalcio]: L'armata rossa alla prima vittoria della nuova gestione!

Spinto da pressanti moti di piazza, ho rilevato una società di (fanta)calcio oramai allo sbando, causa una precedente gestione a dir poco fallimentare da parte di un presidente, tale Lorenzo Secchiaroli (il cui soprannome "Mostro di Jesi" dice tutto...), interessato più agli eventuali introiti dei diritti televisivi (che non ci sono stati visti i deludenti risultati) che agli autentici valori sportivi che sottendono alla gestione di una società sportiva qualsiasi; la squadra, al termine del girone di andata, occupava il terz'ultimo posto in classifica, ed i giocatori erano oramai abbandonati a loro stessi e ai piaceri del lusso in attesa...

Google aiuta OpenOffice...

Google plans to hire programmers to improve OpenOffice.org, a demonstration of its affinity for open source initiatives and one the company believes also shows sound practical sense. Fonte: Google throws bodies at OpenOffice | CNET News.com Sembra chiara la voglia di aiutare OpenOffice nella lotta contro Office, strano xò che Google non pensi a creare una web application di qualche tipo (in effetti un Word fatto in ajax nn me lo immagino proprio...). Magari è solo per dare fastidio "politicamente" a Microsoft...   powered by IMHO 1.3