Come cercare all’interno delle stored procedure in MySql

Non so voi, ma io ho sempre fatto largo uso delle stored procedure di MySql, sia per query semplici che per vere e proprie procedure complesse. Ad esempio penso che siano una manna dal cielo per chi fa uso di SqlDataSource in Asp.net WebForms: sia a livello di leggibilità che di compattezza, preferisco scrivere una procedura lato database che una query complessa all’interno di una stringa, a sua volta all’interno di un tag XML.

Ad ogni modo, piacciano o meno, può fare comodo effettuare una ricerca testuale al loro interno. Una via potrebbe essere quella di tenere il codice di tutte le s.p. in un file, da tenere costantemente aggiornato: poco pratico. Un’altra è eseguire un dump delle procedure su file e poi usare un editor di testo con la funzione “trova”.

Personalmente preferisco usare l’engine di query di MySql anche per cercare questo genere di “metadati” (occhio alle virgolette): infatti è sufficiente eseguire una query!

1
2
3
4
SELECT *
FROM mysql.proc
WHERE db = 'nome_db'
AND LOWER(CONVERT(body USING utf8)) LIKE '%testo_da_cercare%';

Eseguite la query ed otterrete un elenco di routine che corrispondono alla vostra ricerca. Tra le colonne restituite ce ne sono tante di interessanti come il DEFINER, il tipo (PROCEDURE o FUNCTION), date di creazione ed aggiornamento varie e così via. Se vi interessa solo il nome della procedura scrivete “name” al posto dell’asterisco nella SELECT. Ho specificato il filtro “db = ‘nome_db'” (da sostituire con il nome del database che vi interessa), altrimenti restituisce quello che trova in tutti i database.

Un paio di curiosità: mysql.proc è la cosidetta “Routines table“, tabella di sistema in cui vengono memorizzate le routine, per l’appunto.

Il codice delle stored procedure viene memorizzato in questa tabella come BLOB, quindi va convertito in formato testuale. A quel punto è possibile cercare del testo al suo interno.

Color Lover – La mia prima app per Windows Phone 7

Come progetto per l’esame di Windows Phone 7, nell’ambito del master di cui ho parlato qualche post fa, ho realizzato un’applicazione un po’ fuori dal comune: Color Lover. Sostanzialmente è un’utility per gestire i propri schemi di colore. L’idea di base da cui sono partito era l’estrazione dei colori dominanti da un’immagine, cosa che può fare comodo in diversi casi: si pensi ad esempio di voler realizzare un sito di un’azienda, il cui unico input grafico è il logo (naturalmente si prestano a questo loghi di una certa complessità, se il logo è composto da due colori consiglio di prendere un color picker qualsiasi e si fa prima).

Questa funzionalità, il cui algoritmo è piuttosto semplice, verrà ancora migliorata nelle versioni successive. Sto infatti riscrivendo il componente che calcola i singoli colori, sfruttando lo spazio HSV (più vicino alla percezione umana del colore) anziché quello RGB. Ho anche altre idee che, tempo permettendo, renderanno l’app ancora più completa.

Un mare di colori! :)

La mia piccola app, che sembra andare bene a livello di download, fa un’altra cosetta interessante: si collega al web service di COLOURLovers.com– sito consigliatissimo a chi si occupa di design – fruendo dei contenuti da esso messi a disposizione: palette già composte e singoli colori. Non manca ovviamente la possibilità di selezionare i colori “a mano”, cioè con un color picker e degli slider RGB.

Il programmino è giunto alla versione 1.1, in cui ho corretto qualche bug e soprattutto ho implementato la traduzione in italiano. A tal proposito, nel caso di app localizzate in diverse lingue, assicuratevi di tradurre OGNI singola parte dell’interfaccia: i tester di Microsoft mi hanno respinto la nuova release perché mi ero dimenticato di tradurre UNA voce all’interno delle impostazioni. Fanno sul serio.

Se avete un telefono WP7, provate Color Lover e lasciate un voto/commento, siano essi negativi o positivi! 🙂

Master in Sviluppo di Applicazioni Mobili

Venerdì 18 novembre ho iniziato con i “precorsi” – i corsi veri e propri inizieranno non appena le questioni burocratiche saranno completamente risolte – del Master in Sviluppo di Applicazioni Mobili, organizzato dall’Università di Pisa e tenuto presso il Dipartimento di Informatica. Ho tenuto sott’occhio questa opportunità da quando se ne iniziò a parlare, cioè dopo il crash course su iOS, sempre organizzato dall’Università di Pisa, tenutosi un po’ di mesi fa.

Il master è ben articolato, in quanto affronta tre delle piattaforme principali del mondo mobile: Android, iOS e Windows Phone 7 (quest’ultimo pare che avrà una crescita superiore alle aspettative nell’immediato futuro, grazie all’accordo con Nokia). Le lezioni non saranno soltanto di programmazione di App, ma anche su tutto quello che vi ruota intorno. Ci saranno quindi seminari riguardanti il design di interfacce grafiche, l’avvio di un’impresa, la commercializzazione delle app sui vari market, e così via.

Per ora sono molto entusiasta dell’andamento delle lezioni, anche se, devo dire, mi aspettavo un afflusso di gente molto più alto. Il minimo per iniziare le lezioni era di 15 persone, e abbiamo raggiungo poco più delle 20. Da una parte meglio così, il rapporto con i professori è più vicino e quindi in un certo senso si imparano meglio le cose. Forse alcuni (ma anche io) sono stati scoraggiati dai 2500 euro di costo del master, ma mi pare che di solito costino molto di più.

Tutto questo per dire anche che non sarà escluso che, d’ora in avanti, io pubblichi qualche appunto anche su Windows Phone e – ahimè – su iOS. Dico ahimè anche perché mi toccherà comprarmi un Mac, spesa che dovrò aggiungere ai 2500 euro di cui sopra…

ASP.NET, Routing, Context.Session=null e mal di testa

L’URL routing è un meccanismo introdotto nella versione 3.5 SP1 del framework ASP.NET, e già presente dalla prima versione del framework ASP.NET MVC. Sostanzialmente si tratta di una funzionalità di URL rewrite in cui la creazione di oggetti detti Route all’interno del file Global.asax, sostituisce le classiche regole di rewrite di mod_rewrite e similari.

Non è compito di questo breve articolo parlare dell’URL routing in ASP.NET, al quale invece potrei dedicarne qualcuno in futuro (anche se è palese che il mio impegno su questo blog è molto saltuario 🙂 ). Vorrei invece evitare arrabbiature, mal di testa, ore ed ore di ricerche su Google (tutte cose alle quali ho già provveduto io) a chi si trova di fronte allo scenario seguente: sito configurato su IIS 7+ (sul web server integrato in Visual Studio, Cassini, nessun problema), URL routing, e oggetto di sessione valorizzato a null. Qualunque accesso all’oggetto Session restituisce una fastidiosa NullReferenceException.

Dopo numerose ricerche sul web, fedele compagno risolutore di problemi, ero giunto a non ricordo bene quale blog/post/thread in cui si suggeriva di aggiungere un attributo al tag modules all’interno del Web.config: runAllManagedModulesForAllRequests="true". Onestamente non so bene il motivo per il quale questo suggerimento effettivamente funzioni: sicuramente è complice il fatto che le URL che generalmente si utilizzano quando si applica una qualunque forma di rewrite, non hanno estensione, e in particolare non hanno estensione .aspx. Questo potrebbe disturbare tutto il sistema generando l’inconveniente della sessione nulla. Quella direttiva indica ad IIS di utilizzare i moduli registrati nel Web.config per tutte le richieste, cosa che evidentemente in qualche modo risolve la questione.

Una cosa che non avevo considerato quando cercavo una soluzione era che appunto stavo utilizzando l’URL Routing. In pratica mi limitavo a cercare un motivo per cui l’oggetto di sessione era nullo ma non in relazione al meccanismo di rewrite. A volte basta poco per perdere tanto tempo.

Detto questo, uno potrebbe prendere questa prima soluzione come buona e concludere qui la lettura dell’articolo. A chi invece è un po’ più curioso, ma soprattutto più attento alle prestazioni generali delle proprie applicazioni, suggerisco di continuare a leggere. Mi sono infatti imbattuto in un articolo in cui si sconsigliava l’utilizzo di runAllManagedModulesForAllRequests="true", e il motivo l’ho già detto poco fa: il fatto che tutte le richieste vengano indirizzate ai moduli registrati, significa che anche i file statici (js, css), le immagini, e tutto il resto passa prima dai suddetti moduli, con conseguente inutile spreco di risorse. L’oggetto di quell’articolo era un altro problema, ovvero l’errore di pagina non trovata per URL senza estensione in ASP.NET MVC, ma in ogni caso è stato utile.

Ecco invece la soluzione migliore che ho trovato: de-registrare il modulo di gestione della sessione e ri-registrarlo. Anche in questo caso, non so bene spiegarmi il perché funzioni.

1
2
3
4
5
6
7
8
9
10
11
<configuration>
  ...
  <system.webServer>
    ...
    <modules>
      <remove name="Session" />
      <add name="Session" type="System.Web.SessionState.SessionStateModule"/>
      ...
    </modules>
  </system.webServer>
</configuration>

Quite stupid, actually (cit).

Risorse stringa singolari e plurali in Android

Una caratteristica carina che ho trovato nell’SDK di Android sono i cosiddetti plurals, cioè risorse stringa con cui indicare più versioni della stessa parola o frase in base al numero di entità che si devono descrivere. Credo che bene o male in tutte le lingue del mondo ci sia la possibilità di distinguere tra singolare e plurale: con Android la gestione di questa distinzione è molto rapida. Un plural di solito si definisce insieme alle altre stringhe (res/values/strings.xml):

1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <plurals name="numero_gatti">
    <item quantity="one">%d gatto</item>
    <item quantity="other">%d gatti</item>
  </plurals>
</resources>

In Italiano, come anche in Inglese, la differenza tra singolare e plurale si riduce a due casi (“one” e “other”). In altre lingue, non so quali onestamente, ci sono altri modi per indicare più di un’entità. Per questo motivo l’attributo quantity può avere, oltre a “one” e “other”, anche altri valori: “zero”, “two”, “few”, “many”. E’ il sistema che si occupa di decidere quale di essi usare in base alla lingua impostata. Si potrebbe pensare che avrei potuto aggiungere anche un altro elemento:

1
<item quantity="zero">Nessun gatto</item>

Ma in Italiano lo 0 non è grammaticalmente diverso da 2 o più. Quindi con un valore di 0, la stringa risultante sarebbe “0 gatti”, mentre “Nessun gatto” sarebbe stato ignorato.

Utilizzare questo tipo di risorsa in Java è immediato:

1
2
int cats = getCats();
String catsFound = getResources().getQuantityString(R.plurals.numero_gatti, cats, cats);

La funzione getCats() è inventata per l’esempio. Il metodo getQuantityString() della classe Resources richiede, in questo caso, 3 (o più) parametri:

  1. l’id della risorsa (R.plurals.nome_risorsa);
  2. la quantità, che serve al sistema per stabilire quale item del plural ritornare;
  3. l’argomento che effettivamente sostituirà il segnaposto (%d) nella stringa ottenuta.

L’ultimo parametro (che può essere anche un elenco di parametri) potrebbe essere omesso: in tal caso la stringa ritornata sarà quella con i segnaposto ancora da sostituire. Sostanzialmente si salta il passaggio per formattare la stringa con il valore.

1
2
3
4
5
// restituisce "%d gatto"
getResources().getQuantityString(R.plurals.numero_gatti, 1);

// restituisce "1 gatto"
getResources().getQuantityString(R.plurals.numero_gatti, 1, 1);

Per maggiori dettagli vi rimando alla documentazione ufficiale.