My Personal Budget

Da un pò di tempo a questa parte sto sviluppando un progettino in php identificato dal nome provvisorio (che però potrebbe diventare definitivo in mancanza di alternative) di “My Personal Budget” (facile, no?). Scopo del progettino è realizzare un sistemino di contabilità personale per tenere traccia delle mie spesucce (che nei prossimi mesi tenderanno ad aumentare, mentre le entrate tenderanno a diminuire, ma questa è un’altra storia :-) ). Si tratta di una web application basata su php e un database SQLite3, con massiccio uso di JQuery, JQuery UI e css e l’ottimo appoggio del framework css Blueprint e di Php Activerecord.

Al momento il progettino vanta features quali:

  • una (semplice) gestione utenti e livelli;
  • diversi conti per ciascun utente;
  • categorie e tag;
  • chiusura contabile di fine mese con saldo;
  • traccia del saldo per tutto l’anno fiscale;
  • un’interfaccia colorosa e pastellosa :-) per la quale però si accettano suggerimenti visto che a detta di molti è un tantino psichedelica :-) .

Altre cosucce sono in cantiere: grafici, resoconti, resoconti stampabili (e magari anche in pdf!), cose così.. se qualcuno vuole giocherellare con il progetto il codice è ovviamente open e liberamente scaricabile da GitHub (https://github.com/PicciMario/My-Personal-Budget). Sono aperto a qualunque tipo di commento o suggerimento, e qualunque supporto è ben accetto!

Server2Go: server web standalone per Windows

E’ sempre comodo nella vita di tutti i giorni poter disporre di un server web pronto per ogni evenienza, che ci si trovi in un ambiente ostile (ad esempio su una macchina Windows senza i permessi di amministrazione) o sul computer (ovviemtne Windows) di un cliente cui si debba mostrare una webapp non ancora online. Un server web standalone altro non è che un eseguibile che gira su una macchina (normalmente senza richiedere permessi di amministrazione) e fa le veci di un server web più normalmente qualche altro orpello interessante (tipo un database).

Server2Go fa proprio questo: si scarica, si modificano un paio di file di configurazione, si copiano in una cartella i file della propria web app, si lancia l’eseguibile e voilà!

Un pò di caratteristiche interessanti:

  • pò funzionare da disco fisso, da un disco rimovibile (ad esempio una chiavetta usb) o addirittura da CD;
  • è donationware (e vale la pena fare una piccola donazione, vista la qualità del software);
  • è disponibile per Windows;
  • è disponibile in varie versioni in base ai servizi offerti. La più completa al momento porta PHP 5.3.2, SQLite, MySQL 5.1.46, Perl 5.8;
  • è facilmente configurabile e completamente customizzabile;
  • non richiede installazione.

Giusto l’altro giorno me lo sono scaricato su un computer windows per fare girare un’applicazioncina web basata su PHP e SQLite3, e lascio ai posteri qualche nota circa la configurazione. Sostanzialmente bisogna modificare due file:

pms_config.ini

Questo file contiene informazioni generali circa l’aspetto e il comportamento di Server2Go. I parametri sono semplici e ben commentati, i più importanti (per me) sono:

  • ServerName: il nome mostrato all’avvio e nella tray icon che indica che il programma è in esecuzione.
  • UserSplash: nome di un file grafico da usare come splash screen all’avvio.
  • KeepRunningAfterBrowserClose: quando il programma si avvia lancia automaticamente un browser (configurato in seguito), e si chiude alla chiusura del brower. Poichè voglio poter lanciare il servizio e chiuderlo quando voglio imposto questo valore a 1.
  • ShowTrayIcon: imposto il valore a 1 per mostrare una tray icon quando il programma è in esecuzione (e avere modo di chiuderlo senza passare dal task manager).
  • Port: la porta sul quale mettere in ascolto il web server. Io ho usato il valore 4001, va bene qualunque valore purchè sia sopra il 1024 (viceversa il server richiede permessi di amministratore).
  • BrowserType: io metto NONE, così il programma non tenta di aprire automaticamente un browser.
  • UseMySql: metto 0 (zero), poichè non mi occorre MySql.

server/config_tpl/php.ini

Configurazione del motore PHP, basta apportare un paio di modifiche per abilitare SQLite3: nella sezione “Windows Extensions” bisogna togliere il “;” dalle righe:
extension=php_sqlite.dll
extension=php_pdo_sqlite.dll
inoltre bisogna aggiungere, se non c’è, la riga:
extension=php_sqlite3.dll

A questo punto basta piazzare i file della propria applicazione nella cartella HTDOCS, lanciare l’eseguibile Server2Go.exe e puntare il proprio browser di fiducia a http://localhost:4001

Voilà!

Appunti AJAX: caricamento asincrono di HTML in un DIV

Giusto un breve post su una cosa sulla quale sto giocherellando in questi giorni. Sto scrivendo un’applicazioncina web php/sqlite3 di una paginetta; in questa applicazione appaiono sigle e simboli arcani, che richiedono un help contestuale: io clicco su una stringa (che camuffa un link) e da qualche parte nella pagina una sezione cambia contenuto per andare a contenere il testo di un help. Come fare? Mi servono tre cose:

1) Nella pagina principale dell’applicazione il div che andrà a contenere il testo. Basta una cosa qualunque

<div id="helpdiv">Help in linea</div>

2) Una pagina esterna destinata a creare l’help online a partire da un parametro “codice” fornito mediante GET. La chiameremo “decodifica.php”, e inizierà con qualcosa del tipo:

<!-- pagina decodifica.php  -->
<?php
if (!isset($_GET['formula'])) return "Beh?";
else return $_GET['formula'];
?>

Una cosina semplice, che se chiamata senza parametro restituisce un accigliato warning mentre se viene richiamata correttamente con il parametro “formula” fa un echo di quanto passato.. giusto per provare!

3) una funzioncina javascript nella pagina principale.

<script type="text/javascript">

Questa prima funzione viene richiamata dal link con un parametro, l’url della pagina di decodifica. La funzione lancia la richiesta della pagina di decodifica e poi resta in attesa dell’acknowledge, all’arrivo del quale lancerà la funzione “scriviDiv”

function impostaDiv(url) {
 if (window.XMLHttpRequest) { // Non-IE browsers
 req = new XMLHttpRequest();
 req.onreadystatechange = scriviDiv;
 try {
 req.open("GET", url, true);
 } catch (e) {
 alert(e);
 }
 req.send(null);
 } else if (window.ActiveXObject) { // IE
 req = new ActiveXObject("Microsoft.XMLHTTP");
 if (req) {
 req.onreadystatechange = scriviDiv;
 req.open("GET", url, true);
 req.send();        
 }
 }
}

Questa funzione invece viene richiamata al termine della chiamata alla pagina di decodifica, e scrive il testo restituito nel div di destinazione “helpdiv”.

function scriviDiv() {
 if (req.readyState == 4) { // completato
 if (req.status == 200) { // risposta affermativa
 document.getElementById("helpdiv").innerHTML = req.responseText;
 } else {
 alert("Problem: " + req.statusText);
 }
 }
}
</script>

4) Per concludere, occorrono i link nella pagina principale per richiamare la funzione impostaDiv, una cosa del tipo:

<a href="javascript:impostaDiv('decodifica.php?formula=sorpresa')">Scritta strana</a>

Ecco fatto! A questo punto dovremmo avere un sistema che si comporta così:
- l’utente preme il link “scritta strana”;
- viene chiamata una funzione javascript impostaDiv con parametro formula=sorpresa;
- la funzione impostaDiv richiama la pagina decodifica.php?formula=sorpresa;
- la pagina ritorna la scritta “sorpresa” (la stessa che gli è stata passata!);
- appena la pagina è pronta si attiva la chiamata di ritorno scriviDiv, che va a scrivere l’output di cui sopra (ovvero la scritta “sorpresa”) nel div “helpDiv”, che fino a poso tempo fa conteneva solo il testo “Help in linea”.

Facile, no?

Saluti!

Aggiornamento EarthQuake Map

Come promesso ho giocherellato un pochino ancora con la mia mappa dei terremoti in php. Per l’esattezza ho aggiunto delle icone personalizzate per indicare gli eventi sismici, da utilizzare al posto dei marker di default. Ho disegnato (evviva inkscape) dei segnalini personalizzati di tre diversi colori per indicare la magnitudine degli eventi visualizzati, in modo che sia possibile a colpo d’occhio riconoscere le normali scosse da quelle un pò più serie e da quelle (speriamo di non vederne mai più) catastrofiche.

Uno screenshot della mappa con uno zoom sulla zona de L’Aquila, in cui si vedono molto chiaramente le numerosissime scosse di assestamento che da giorni affliggono la popolazione.

Ultimi eventi sismici nell'Aquilano, aggiornati al 27 aprile

Ultimi eventi sismici nell'Aquilano, aggiornati al 27 aprile

Come sempre il codice (e adesso pure le icone :-) ) è distribuito con licenza Beerware ed è liberamente scaricabile dalla pagina del progetto. E come sempre sono aperto a domande, dubbi e suggerimenti. Ciao!

Disegnare una mappa dei terremoti

L’altro giorno ho letto un interessante articolo in cui si valutava la possibilità di estrarre dal sito dell’Istituto Nazionale di Geofisica informazioni circa i terremoti rilevati (argomento tornato tragicamente d’attualità, come sappiamo) e sfruttare queste informazioni per rappresentarli su una mappa.

L’autore dell’articolo di cui sopra ha svolto un ottimo lavoro realizzando uno script in Python che esegue il parsing di questa pagina, ne estrae le informazioni e fornisce un report testuale degli eventi sismici, ciascuno corredato da un link per visualizzare il punto sulle mappe di OpenStreetMap.

Io ho cercato di fare un ulteriore passo in avanti, ovvero realizzare un sistema automatico che mostrasse direttamente su una mappa le posizioni degli ultimi eventi sismici. Il risultato è abbastanza gradevole, e con moltissimi margini di miglioramento, e ho quindi deciso di condividerlo con il mondo nella speranza che a qualcuno possa servire.

A livello pratico, si tratta di una singola pagina in php che scarica la pagina dell’INGV, ne esegue il parsing con pesante e doloroso uso di regexp creando un array con i dati, e poi provvede a disegnarli su una mappa OSM sfruttando le API di Mapstraction. Quest’ultimo, per chi non lo sapesse, è un insieme di API cartografiche open source progettate per interagire con i principali fornitori web di cartografia, che forniscono una serie di interessanti funzioni ben descritte sul loro sito web; ovviamente come fonte dei dati io ho scelto il migliore, OpenStreetMap!

Al momento il risultato è questo:

omsphpresult1

Oltre alla mappa ho anche previsto un div per loggare le operazioni svolte dallo script (immagino sappiate quanto è doloroso lavorare con le regexp :-) ). Nulla vieta di rimuoverlo, ovviamente. Inoltre ho previsto anche la possibilità di cliccare sui marker, per visualizzare data, ora e magnitudine degli eventi:

osmphpresult2

Ho caricato il file online, e per chi volesse vederlo in azione è raggiungibile a questo indirizzo. Inoltre il sorgente è ovviamente libero (pubblicato con licenza Beerware, per intenderci) ed è scaricabile dalla stessa pagina.

I margini di miglioramento sono enormi: rendere più efficiente il parsing, prevedere sistemi di filtraggio e scelta del numero e tipo di eventi da mostrare, differenziare il tipo di evento (ad esempio un marker diverso a seconda della magnitudine) e altro ancora, e non è escluso che un pò alla volta ci giocherellerò per aggiungere queste funzioni. Per ora lascio tutto a voi, e se avete qualche idea o del codice migliorato che volete inserire fatemelo avere e lo aggiungerò.

Ciao a tutti!