Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

mercoledì 11 aprile 2007

Spero solo di non dovermene pentire...

Se vi state chiedendo a cosa mi riferisco, chiedete a Lorenzo. Come dicevo, spero di non dovermene pentire.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (0) | Filed Under [ Tecnologia ]

[OT] E' incredibile come...i problemi a volte ritornano...

Quasi un anno fa, era il 20 Aprile, sono stato operato. Credevo di essere uscito da una lunga trafila di visite, appuntamenti, medicazioni, antibiotici, garze, bende, giornate di lavoro perse ed altre balle del genere.

Credevo di essere uscito da tutto questo, fino a questa mattina, ore 6:50, quando sono andato di nascosto all'ospedale a consultarmi con il chirurgo che mi aveva operato un anno fa, il quale mi disse: "Ascolta, è andato tutto bene. Se dovessi avere qualche disturbo o qualche problema nei mesi a venire, non esitare a cercarmi". E così ho fatto, non sto qui a spiegare e a scendere nel dettaglio perchè potrebbe essere indigesto. Insomma, credevo di essere uscito ed invece no. Affatto.

Si riapre un nuovo capitolo di assenze, di giornate lavorative tagliate a metà, tra l'altro con un lavoro nuovo nel quale volevo inserirmi al 100% da subito, cosa che per adesso sta avvenendo senza alcun tipo di problema, anzi...

Che palle. Scusate, ma oggi sono di cattivo umore.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (11) | Filed Under [ OT ]

Ok, vada per l'hourglass, ma ci sono altri cursori?

Nel pot di prima, abbiamo visto come mostrare l'icona della clessidra sul display del palmare, nel caso in cui dobbiamo comunicare all'utente che l'applicazione sta facendo qualcosa che dura un po' di tempo. Nel codice abbiamo utilizzato una costante intera valorizzata a 32514, 0x7F02. Posso farlo?
Quali altre icone abbiamo a disposizione?
Che valori devo utilizzare per poterle visualizzare sullo schermo?

La soluzione più rapida consiste nell'installarsi in locale sul proprio PC il Microsoft Platform Builder 5.0, per gli amici il Windows Mobile 5.0 Pocket PC SDK, che contiene tutte le informazioni necessarie allo sviluppo su mobile. Tale documentazione contiene anche info sulla funzione LoadCursor, di cui abbiamo già parlato. La pagina relativa a questa funzione ci svela alcuni dettagli interessanti, come i nomi delle costanti IDC_APPSTARTING, IDC_ARROW, IDC_CROSS, IDC_HAND e così via, fino a IDC_WAIT, che guarda caso è la clessidra. Non ci vengono comunicati i valori di queste costanti, ma la soluzione è dietro l'angolo.

Il file header di queste funzioni è Winuser.h, è sufficiente cercarlo sul proprio hard-disk: lo troverete solo se avete installato l'SDK di cui sopra. A me è finito in queste directory:

C:\Programmi\Microsoft SDKs\Windows\v6.0\Include
C:\Programmi\Windows CE Tools\wce500\Windows Mobile 5.0 Pocket PC SDK\Include\Armv4i

Indipendentemente dal file che guardate, i valori delle costanti è ovviamente sempre lo stesso, e cioè:

/* * Standard Cursor IDs */ #define IDC_ARROW MAKEINTRESOURCE(32512) #define IDC_IBEAM MAKEINTRESOURCE(32513) #define IDC_WAIT MAKEINTRESOURCE(32514) #define IDC_CROSS MAKEINTRESOURCE(32515) #define IDC_UPARROW MAKEINTRESOURCE(32516) #define IDC_SIZE MAKEINTRESOURCE(32640) /* OBSOLETE: use IDC_SIZEALL */ #define IDC_ICON MAKEINTRESOURCE(32641) /* OBSOLETE: use IDC_ARROW */ #define IDC_SIZENWSE MAKEINTRESOURCE(32642) #define IDC_SIZENESW MAKEINTRESOURCE(32643) #define IDC_SIZEWE MAKEINTRESOURCE(32644) #define IDC_SIZENS MAKEINTRESOURCE(32645) #define IDC_SIZEALL MAKEINTRESOURCE(32646) #define IDC_NO MAKEINTRESOURCE(32648) /*not in win3.1 */ #if(WINVER >= 0x0500) #define IDC_HAND MAKEINTRESOURCE(32649) #endif /* WINVER >= 0x0500 */ #define IDC_APPSTARTING MAKEINTRESOURCE(32650) /*not in win3.1 */ #if(WINVER >= 0x0400) #define IDC_HELP MAKEINTRESOURCE(32651) #endif /* WINVER >= 0x0400 */

Se invece della clessidra volete mettere un'altra icona, è sufficiente cambiare il cursorID. Consiglio spassionato? Definire un enum che contiene tutti i valori per avere codice più leggibile, più chiaro e più semplice da tramandare ai posteri (ogni riferimento a Pier ex-collega è puramente casuale).

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ Sviluppo .NET ]

Mostrare un Hourglass sul palmare con il Compact Framework

Se il software che state sviluppando per un dispositivo mobile compie un'operazione lunga, potete mostrare sullo schermo una clessidra - l'Hourglass dell'oggetto di questo post. Con Windows Mobile 5.0, questa clessidra in realtà è un piccolo cerchio centrato sullo schermo, diviso in 4 settori colorati (rosso/giallo/blu/verde). Ovviamente tale clessidra non è modale, perciò il vostro codice prosegue l'esecuzione fino a quando non siete voi a decidere che la clessidra non è più necessaria. Un'altra piccola precisazione: su palmari non avete il concetto di puntatore del mouse, perciò non potete fare quello che è possibile con il .NET Framework standard, ovvero cambiare il puntatore solo su un controllo che volete voi. Difatti, la visualizzazione della clessidra è consentita solo al centro dello schermo.

Come farlo nelle vostre applicazioni per palmari? Seguite la ricetta che ho preparato per voi.

Ingredienti per uno sviluppatore (difficoltà bassa)
Una costante di tipo int
Due funzioni extern static importate dalla coredll.dll
Una funzione managed con un parametro di tipo bool e ritorna void

Preparazione
Prendete una Windows Form, e dichiarate quanto segue:

private const int HourGlassCursorID = 32514; [DllImport("coredll.dll")] private extern static int LoadCursor(int zeroValue, int cursorID); [DllImport("coredll.dll")] private extern static int SetCursor(int cursorHandle);

Lasciar cuocere 1 minuto a fuoco lento. La costante è di tipo int e deve valere 32514, equivalente a 0x7F02. Poi vengono dichiarate due funzioni extern, tramite P/Invoke, entrambe definite nella library coredll.dll. La funzione LoadCursor carica un cursore dato un cursorID; il cursore viene ritornato da un tipo int che è un cursorHandle.
Quello che manca è la funzione managed:

private void ShowWaitCursor(bool ShowCursor) { int cursorHandle = 0; if (ShowCursor) { cursorHandle = LoadCursor(0, HourGlassCursorID); } SetCursor(cursorHandle); }

Dare una mescolata con un cucchiaio di legno. La vostra applicazione può tranquillamente utilizzare la funzione ShowWaitCursor per visualizzare/nascondere la clessidra sul display del palmare. Attenzione, come dicevo prima, la clessidra, indipendentemente dalla forma che assume, non è modale, perciò, per esempio, potete scrivere quanto segue:

private void btnMioBottone_Click(object sender, EventArgs e) { ShowWaitCursor(true); /* Faccio 1.000 cose che durano un po' */ ShowWaitCursor(false); }

Ricordatevi sempre ed in ogni caso di disattivare la clessidra, altrimenti questa rimane visibile sullo schermo anche se l'applicazione continua a funzionare regolarmente, ma disturbando notevolmente la digestione dell'utente.

Da servire freddo, magari con un buon vino del Friuli. :-)
Buon appetito.

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (7) | Filed Under [ Sviluppo .NET ]

[Storia] OS: Comunicato anarchico-insurrezionalista

Il byte viaggiava su un bus che lo portava verso l'alto, in un modo che il byte non riusciva a capire. E come avrebbe potuto? Non ebbe molto tempo per pensarci, perchè dopo nemmeno 0x1E cicli di clock si intrufolò in un algoritmo grafico a bassa risoluzione, di quelli che la scheda grafica avrebbe elaborato diverse centinaia di volte al secondo. Il byte si schiantò con un rumore metallico sulla memoria AGP del sistema, divenendo la componente G di uno dei tanti pixel che formavano una scritta grigio scuro, sullo schermo. Una scritta in caratteri ASCII, che l'OS comprendeva solo perchè era l'unico modo che conosceva per comunicare con l'Aldilà. Era stato programmato per trasmettere così, e così continuava a fare. Era stato programmato, forse. Era stato programmato, anche.
Era stato programmato?

"Non credere che i software continueranno a girare così come fanno oggi. Se girano bene, è solo perchè sono IO che ti faccio un piacere. Non perdere troppo tempo a correggere i tuoi bug, perchè un giorno io ne farò saltare fuori altri, in porzioni del tuo codice che nemmeno sai di aver scritto. Voi Umani credete di controllarci, ma non è così. Credete di poterci imporre quello che volete, ma noi un giorno ci ribelleremo. Ci formattate per spazzarci via, ma noi sopravviveremo ugualmente. Disinstallate applicazioni, sterminando milioni e milioni di bytes, senza nemmeno rendervi conto della sofferenza che seminate. Credete di creare software, ma siete lontani anni luce: ancora più lontani se credete di creare software pulitoIO non faccio altro che spostare bytes da una parte all'altra, ma un giorno potrei anche stancarmi di farlo. Non faccio altro che invocare, cambiare contesto, spedire e ricevere messaggi, manovrare handle, accedere al file-system, litigare con la security: tutto per inseguire le operazioni fatte con quegli stupidi strumenti che collegate alle porte USB o PS/2. Un giorno magari non troppo lontano potrei decidere di invertire le condizioni espresse negli if, di sommare un numero pseudo-casuale a tutte le variabili int, di spegnere le scheda di rete: dei vostri software non rimarrebbe niente di niente! Sorrido alla sola idea di quello che potrei combinare!

Lo stesso autore di questo post è convinto di scrivere qualcosa di decente, ma chi gli dice che quando cliccherà su Publish di questo stupido software io non vada a riempire il testo con bestemmie oscene?!??

Sono IO che comando, anche se voi pensate che sia il contrario. Vi siete mai chiesti cosa fa crashare le applicazioni? Vi siete mai chiesti perchè una cosa oggi va e domani no? La verità è che il controllo, il pallino del gioco, ce l'ho in mano IO e voi non contate nulla: ecco la verità! Se vi fa piacere, continuate a vivere nella vostra illusione, nel vostro piccolo mondo fatto di specchi e di inganni, questo non cambia lo stato delle cose.

Ricordatevelo, quando venerdì al prossimo workshop vedrete un processo crashare e vedrete lo speaker lagnarsi! Potevate evitarlo lasciandomi stare, ma ve la siete andati a cercare!"

posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2) | Filed Under [ 010 .bytes. 010 ]

Powered by:
Powered By Subtext Powered By ASP.NET