Stampa

comStudio v1.0 rilasciato su sourceForge

Scritto da Koalakoker. Postato in Programmazione

Ecco la mia ultima fatica in ambito sviluppo software... vi presento comStudio

ComStudio è un programma di utilità in grado di supportare l'utente nello sviluppo e nel testing di un protocollo di comunicazione seriale (tipo USART o RS232) specificatamente orientato ad applicazioni embedded.
ComStudio è un applicazione open-source e multi piattaforma basata sulle librerie QT e sulla libreria QSerialDevice (adesso ribattezzata QtSerialPort).
Tramite comStudio è possibile creare un set di comandi da spedire attraverso una porta COM ed un set di frame tra cui decodificare la risposta proveniente dal dispositivo target. Il protocollo di comunicazione può essere completamente customizzato tramite un'interfaccia utente grafica.

Decisamente dedicato ad un target super specializzato... speriamo possa risultare utile a qualcuno.

Link su sourceForge: http://sourceforge.net/projects/comstudio/
Wiki su sourceForge: http://sourceforge.net/p/comstudio/wiki/Home/

Stampa

Rilasciato Open Gapp - OGapp v1.1.0

Scritto da Koalakoker. Postato in Programmazione

Oggi ho rilasciato la versione 1.1.0 di open Gapp il programma di gestione note di cui abbiamo parlato in questo articolo. Disponibile nella home page del progetto su Source Forge.


Ecco le nuove caratteristiche:
- La interfaccia utente ha un nuovo look. La MainWindow ha preso il posto della Dialog ed è stato aggiunto un set di icone per la toolbar.
- I bottoni per massimizzare o minimizzare la finestra è stato aggiunto ed è funzionate sotto Windows.
- E' stata aggiunta la dialog di informazioni con la licenza GNU v2.
- Sono stati aggiunti i comandi: nuovo documento, salva, salva come e importa.
- E' stata aggiunta la possibilità di aprire un documento esistente o di crearne uno nuovo anche nella finestra di immissione password.
- E' stata aggiunta la possibilità di visualizzare un preview delle note prima di aprire un file esistente.
- E' stata aggiunta la feature di ricerca.
- E' stata aggiunta la finestra per selezionare le preferenze (file di default,auto salvataggio all'uscita, salvataggio dello stato della finestra)
- Sono stati aggiunti i consigli all'avvio
- minor bug fixing

Ovviamente tutte queste caratteristiche nuove sono frutto dei miei sforzi delle ultime settimane e sono state richieste dal più assiduo utilizzatore di questo programma... ovvero me medesimo.

Di questa versione ho al momento rilasciato la sola versione per Windows, testata sul mio vetusto XP, in due versioni:

- OGapp_1_1_0_win_121029.exe (File in installazione per windows)
- OGapp_1_1_0_win_121029.zip (Zip file contenente l'eseguibile e le dll richieste da scaricare in qualsiasi folder e utilizzare)

Se aveste la possibilità di testarlo in Windows più recenti come Vista, Seven e 8 mi fareste un gran favore. I feedback sono ben accetti.

Per la prossima versione (v1.2) ho ancora qualche asso nella manica, prima tra tutti la localizzazione in lingua italiana che è quasi completa. Per cui: "Stay tuned".

Concludo dicendo che nello sviluppo del programma ho avuto modo di apprezzare la straordinaria completezza e facilità d'uso delle librerie QT. Fantastici sotto ogni aspetto. Spero che il progetto QT abbia una lunga e prosperosa vita perché i ragazzi del team QT se lo meritano proprio ed anche perché mi sto cominciando ad affezionare a librerie e ambiente di sviluppo facile, potente, cross platform e open source. Bravi bravi bravi.

Stampa

Restore desktop icon position

Scritto da Koalakoker. Postato in Programmazione

Uno dei molti problemi che mi affliggono a lavoro è la naturale propensione di Windows di dimenticare o riposizionare le tante icone che popolano il mio desktop secondo una logica perversa. Mi riferisco almeno alla versione XP, magari in qualche “nuova” versione questo aspetto è stato curato maggiormente.
Questa tendenza naturale è amplificata nel caso occorra, come spesso mi accade, di collegare il portatile a monitor diversi o a video proiettori. Passando da una risoluzione all'altra le icone vengono riposizionate seguendo geometrie non euclidee.
La prima idea che viene in questi casi è quella che, visto e considerato essere un problema comune, probabilmente ci sarà qualche programmino in giro che si occupa di memorizzare la posizione delle icone in un dato istante e di riposizionare le icone ai loro posti su richiesta. Un programmino da quattro soldi che magari si potrebbe trovare come PowerToy o mini utility open source.
Niente.
Beh allora visto che la cosa è così semplice perché non ce lo facciamo da noi.
Comincio a cercare informazioni su qualche API di Windows che faccia al caso mio. Infondo le operazioni di base che mi servono sono:

  • un metodo che mi restituisca il numero di icone presenti sul desktop,

  • per ogni icona un metodo che mi restituisca la posizione sul desktop,

  • uno che mi consenta di impostare la posizione dell'icona,

  • ed infine uno che mi restituisca una stringa con il nome da usare come riferimento.

Devo dire che la cosa non è stata così facile come possa sembrare e per questo motivo adesso che ne sono riuscito a venire a capo ho deciso di scrivere questo articolo. In realtà i motivi sono due: uno perché io ho già fatto questa cosa qualche anno fa ma purtroppo ho perso i sorgenti e adesso che voglio modificare il programma devo ripartire da zero. Grazie anche alla mia scadente memoria, il secondo perché su internet c'è veramente poco, mal spiegato e non in italiano.
Mettiamoci all'opera.
Per prima cosa occorre procurarsi un handler (ovvero l'identificativo che assegna Windows ad ogni oggetto che maneggia). Per poter maneggiare un qualsiasi oggetto con una API di Windows occorre per prima cosa conoscere il suo handler. Quello che interessa a noi è quello della finestra di nome “Program manager”. Ed in particolare di un suo sottofiglio: “SHELLDLL_DefView” e del sottto sotto figlio “SysListView32”. Il tutto con le seguenti tre istruzioni:

progman_wnd = FindWindow(NULL, L"Program Manager");
desktopview_wnd = FindWindowEx(progman_wnd, NULL, L"SHELLDLL_DefView", NULL);
listview_wnd = FindWindowEx(desktopview_wnd, NULL, L"SysListView32", NULL);

Questa list view è quella che contiene tutte le icone del desctop. Per interagire con essa occorrerà mandargli messaggi tramite SendMessage(listview_wnd,MESSAGGIO,PARAMETRO1, PARAMETRO2).
Sembrerebbe finita qui ma non è ancora vinta. I due processi hanno uno spazio dati differente per cui ogni qual volta occorre scambiare dati per riferimento (cosa necessaria ad ottenere la posizione delle icone) tra un processo ed un altro occorre usare una tecnica particolare:

  • Dal processo 1 occorre creare uno spazio di memoria nel processo 2 ed ottenere un riferimento valido per il processo 2. (Riferimento).

  • Se necessario scrivere sull'area creata nel processo 2 a partire dal riferimento ottenuto.

  • Il processo 1 manda il messaggio con il SendMessage passando il riferimento valido.

  • Leggere dall'area del processo 2.

Il messaggio in questione è:

SendMessage(listview_wnd,LVM_GETITEMPOSITION,(WPARAM)(index),(LPARAM)(ptr));

Dove index è la posizione dell'icona nella lista e ptr è il puntatore ottenuto in precedenza.
Come? Non l'abbiamo ancora ottenuto? Ecco la sequenza di istruzioni:

  • Troviamo il proces ID ovvero l'ID che Windows assegna al processo relativo alla listview.

GetWindowThreadProcessId(listview_wnd,&processID);

  • Otteniamo l'handler del processo.

proc = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, processID);

  • Noto l'handler proc si può allocare lo spazio sul processo che detiene la list view delle icone ed ottenere un puntatore valido nel suo spazio di memoria.

ptr = VirtualAllocEx(proc,NULL,sizeof(POINT),MEM_COMMIT, PAGE_READWRITE);

Ora che abbiamo il ptr possiamo mandare i messaggi.

SendMessage(listview_wnd,LVM_GETITEMCOUNT,0,0);

Restituisce il numero di icone sul desktop.

SendMessage(listview_wnd,LVM_GETITEMPOSITION,(WPARAM)(index),(LPARAM)(ptr));

Scrive sul puntato da ptr la posizione della icona all'indice index.

SendMessage(listview_wnd,LVM_GETITEMTEXT,(WPARAM)(index),(LPARAM)(ptr));

Per ottenere il nome dell'icona.

SendMessage(listview_wnd,LVM_SETITEMPOSITION,(WPARAM)(index),MAKELPARAM((WORD)X,(WORD)Y));

Per impostare la posizione dell'icona all'indice index alle coordinate X e Y.

Infine per leggere o scrivere nello spazio di memoria dell'altro processo occorre utilizzare le due funzioni:

ReadProcessMemory(proc, ptr, (void*)(&myPtr), SIZE, NULL);

e

WriteProcessMemory(proc,ptr, (void*)(&myPtr), SIZE, NULL);

Dove myPtr è invece un riferimento valido all'interno del processo 1 (ovvero il mio programma).
Beh mettendo tutto questo insieme ci si riesce.

Io il programma l'ho fatto e per non perderne più traccia l'ho anche inserito su sourceforge.
Si chiama XPDesktopIconsManager e questo è il link per raggiungerlo. Ovviamente software libero.

Stampa

Open Gapp su Source Forge

Scritto da Koalakoker. Postato in Programmazione

Questo fine settimana mi sono occupato di riaprire un codice che ho scritto parecchio tempo fa.
Facciamo un po' di storia. Tutto è cominciato parecchio tempo a dietro quando mi sono messo in testa di scrivere un programma per tenere sotto mano tutte le mie note sparse qua e la come documenti .txt
Ai tempi sviluppavo sotto Windows con Visual studio e il progetto si è sviluppato ed è stato usato con soddisfazione dai suoi utenti (Io, mio fratello e mia sorella principalmente). Il programma venne battezzato Gapp (Starebbe per G-igi App-unti).

Al programma affiancai tante utili funzioni una tra tutte fu' copiata tanti anni dopo da Microsoft ed era l'idea di avere un multi-clipboard che contenesse tutti i testi copiati per poterli selezionare e incollare successivamente. La fine della solita possibilità di copiare un solo testo alla volta.

Oltre a questo il programma divenne molto complesso perché aggiunsi alcune funzioni come la gestione degli URL.

Ma la funzione principe era quella di poter proteggere i propri appunti con una password che serviva anche a criptare i dati nel file che altrimenti sarebbero rimasi in chiaro.

Bene tutto questo ha funzionato per molto tempo ma le cose cambiano e anche le preferenze sui sistemi operativi. Dopo qualche anno mi indirizzai verso Linux (sistema che uso ancora adesso) come sistema che uso a casa. Il passaggio è stato definitivo dopo l'ultimo computer su cui ho pagato quello schifo di sistema operativo che va sotto il nome di Vista. Sviluppando sotto Linux mi sono posto problematiche come progetto aperto o cross platform e ho quindi deciso di riprendere il progetto Gapp e farlo diventare OGapp (O-pen Gapp).

Ho scritto la prima versione di OGapp qualche anno fa basandomi sulle librerie Qt e una versione compilata per Windows è quella che uso quotidianamente anche a lavoro. Il programma è molto utile... non lo dico solo perché l'ho fatto io.

Questa settimana ho ripreso il codice è ho aggiunto alcune funzioni di cui sentivo la mancanza: la possibilità di aprire e salvare un file .ogp (ovvero quello in cui sono memorizzati tutti i dati) diverso da quello di default. Nel frattempo ho sistemato qualcos'altro ed ho aggiunto una simpatica feature che non è neanche documentata e che rivelerò in questo post:
Se in un appunto è conservato un indirizzo URL è possibile premere crl+w e cliccare sull'URL per aprirlo nel browser di default. Aggiungerò dei Tips da visualizzare all'avvio (disabilitabile).

Funziona al momento solo nella versione Linux ma estenderò appena possibile anche a Windoz.

Nel frattempo ho anche aperto il progetto su Source Forge. Il link è questo... dove l'ho messo? A qui dentro il mio GApp ;)

https://sourceforge.net/projects/ogapp/

 

Questa è una screen shoot del programma

 

 In fine vorrei anche suggerire il favoloso IDE fornito da QT insieme alle librerie ovvero QT Creator. Una sola parola... anzi due: completo e funzionale. Ti farà dimenticare la lentezza di Eclipse. Dopo ore di pena per far digerire al bestione (Eclipse) il progetto, aver tentato con Code::Blocks inutilmente ho googlato un po' è ho letto il suggerimento di qualcuno su un forum di usare QT creator. Lo installo, eseguo. La pagina iniziale è gradevole. Clicco su open existing project e clicco sul .pro del mio progetto fino a quel momento sviluppato con un altro IDE ed è fatta. Il completamento automatico è perfetto. Compila ed esegue senza problemi. IL toolbox per le GUI è equivalente a quello di Eclipse (il plugin per Eclipse è sempre sviluppato da QT). Dovrebbe esserci la possibilità di fare debug (anche se non l'ho provato), ed ha anche alcuni tool extra che non so se ci sono/sono facili da usare su Eclipse: una specie di analyzer del codice (probabilmente per il coverage et similare) ed udite udite supporto al Git.

Il Git è un sistema di controllo della versione distribuito. Evoluzione di SVN e similari. Source Forge lo fornisce di default per i nuovi progetti per cui ho deciso di studiarmelo un po' ed alla fine sono riuscito ad averne la meglio committando la mia prima versione dell'OGAP che è adesso online.

Per gli utenti mi occuperò appena possibile (ovvero quando avrò un WIndows sotto mano) di compilare una versione stand alone (vediamo se glie faccio pure il setup ;)) e la metto in sezione download (dai sorgenti non è cosa da tutti). Poi vorrei anche fare un piccolo video tutoria per mostrare le features... ci ho provato con il portatile ma il video che ne è uscito fuori era scattosissimo (credo per via delle risorse limitate)... lo devo fare su di un PC più performante.