La percezione della realtà

Voglio appuntarmi una breve riflessione, sollecitata da questo interessante esperimento del Washington Post, sintetizzato bene anche in questo video:

In sintesi l’esperimento voleva misurare l’effetto che fa far suonare un violinista di primaria importanza, Joshua Bell, che suona un violino eccezionale in una stazione della metropolitana per quasi un’ora, al mattino.

Il violinista aveva suonato la sera prima in in elitario teatro della stessa città, con posti a sedere molti costosi. Il teatro era tutto esaurito.

Alla stazione, invece, su circa un migliaio di persone solo poch

issime si sono fermate, erano attratti per lo più i bambini, e qualcuno ha messo qualche dollaro, o qualche centesimo nella cesta per l’offerta.

Ora qual è la realtà? Quali i dati oggettivi?

violin scroll

Il violinista è oggettivamente bravo e il violino è davvero un vero pezzo raro. Ma quanti sono davvero in grado di apprezzare queste cose? L’esperimento voleva dimostrare che la “bellezza” oggettiva è riconoscibile da tutti, ma così non è stato. I bambini, forse per le minori preoccupazioni, i minori pregiudizi, eccetera erano più attratti e forse riconoscono meglio la bellezza.

Gli adulti invece riconoscono la bellezza se questa è inserita in un contesto dove tutto gli indica che ciò che osservano è bello, come il teatro, dove il prezzo del biglietto è alto.

Quindi, l’amara riflessione, è che ci pare bello ciò che ci viene detto essere bello e che, purtroppo ciò che è bello spesso non siamo preparati per apprezzarlo.

Annunci

ICT: non si può farne a meno

Paese vecchio 2
Paese vecchio 2 (Photo credit: jerik0ne)

Condivido pienamente quanto dice in questa intervista il mio professore di Ingegneria del Software al Politecnico di Milano, prof. Alfonso Fuggetta.

Qui voglio commentare in particolare qualche passo:

Sono due i fenomeni drammatici a cui abbiamo assistito da una decina d’anni a questa parte. Da un lato non si è capito che l’IT fa rima con innovazione e che dunque gioca un ruolo decisivo per lo sviluppo. Dall’altro l’IT per certi versi è considerato una commodity, ma nel senso più negativo del termine, vale da dire che si pensa all’IT come a qualcosa che deve essere disponibile a basso costo.

La ricerca della soluzione a basso costo, a mio avviso, ne pregiudica la qualità. La qualità dell’IT è però un concetto sfuggente per i più; io qui cerco di essere meno effimero e di concretizzarlo in pochi esempi:

  • Un SW più qualitativo ha un costo iniziale più elevato, ma un costo complessivo di possesso (il cosiddetto TCO) generalmente più basso: si spende un po’ di più oggi per spendere meno domani. La collusione culturale tra quella SW house che non vuole perdere la maintenance e quella domanda IT che vuole sempre spendere poco è micidiale! In una tale non infrequente situazione, conviene a tutti e due gli attori mantenere bassa la qualità.
  • Un SW più qualitativo è più semplice da verificare: è più chiaro capire quando un SW di buona qualità è completo, perché supera tutti i test che per questo sono stati concordati. Sembra un’assurdità, ma per non pochi progetti succede che non si capisca mai se sono terminati o no; in queste situazioni si arriva spesso a blocchi o a contenziosi.
  • Un SW più qualitativo ha una collocazione nello spazio dei tempi e dei costi più prevedibile: maggiore è la qualità, migliore sarà il rispetto dei budget e delle previsioni sulle date della messa in opera. Anche i budget vacillanti sono motivi di scontro: fornitori che spendono più del previsto e fanno progetti “a perdere”, clienti che pur di avere il prodotto finito continuano a rivedere al rialzo il loro budget, consegne oltre i limiti di tempo e tanta, tanta frustrazione per tutti.

[…] l’Italia rischia di diventare un Paese nearshoring, un Paese a basso costo di manodopera, un Paese da “spremere”. Ciò può rappresentare in parte un vantaggio poiché si potrebbe assistere a una maggiore richiesta di nostri professionisti, ma la faccia negativa della medaglia è che i nostri giovani non sarebbero motivati e che la macchina dell’innovazione vera in questo modo non troverebbe la giusta spinta in direzione della crescita-Paese.

Potremmo diventare “gli indiani” degli indiani. Negli anni più recenti, gli operatori IT hanno sentito spesso parlare di questo “mito” degli indiani. Programmatori bravissimi a prezzi bassissimi. Avrei da dire sulla veridicità di questa leggenda metropolitana… Io di programmatori indiani venuti in Italia a lavorare ne ho conosciuti, ma tra loro di guru della programmazione non ne ho potuti notare.

Ma tant’è effettivamente questi programmatori indiani costavano meno, ma oggi le tariffe si stanno adeguando a quelle occidentali (non le nostre tariffe italiane, magari); questo segnale dai BRICS è l’evidenza del fatto che chi è emergente (affermato ormai) e fa sforzi per dominare il mercato globale, riconosce il ruolo fondamentale di un IT sana e non drogata dai soliti miseri particolarismi tipici dell’italianità che stiamo esportando in questi ultimi decenni.

Altro che seconda repubblica! Con un magheggio tipo un gioco delle tre campanelle dove tutti vincono sempre ancora un po’ e torniamo al medioevo. Svegliamoci! Non si può vincere tutti: bravi e non bravi, onesti e disonesti, sgobboni e fannulloni. Qualcuno per forza dovrà saltare giù dalla barca per non fare affondare tutti! E l’IT come tutto il resto soffre e boccheggia…

IT: l’analisi indipendente

To err is human, but to really foul things up you need a computer.

– Paul Ehrlich

Come ci ha insegnato Steve McConnell sul suo Code Complete, le attività di costruzione di un progetto software dovrebbero essere condotte ordinatamente ed in modo completo per evitare gli ormai classici e famosi disastri, o anche quelli più vicini a casa nostra.

Con particolare riferimento alle prime fasi di un progetto informatico, si nota [Boehm – Papaccio – Understanding Software Costs] che maggiore è la distanza tra la fase progettuale in cui un difetto viene rilevato/identificato e la fase in cui viene determinato, cioè l’errore che c’è a monte e che ha prodotto il difetto, è esponenzialmente proporzionale al costo della risoluzione del difetto.

Quindi si deduce che le attività di studio di fattibilità ed analisi dei requisiti, sono le fasi le cui carenze pesano maggiormente sui costi finali dei progetti, anche informatici.

Oggi nessuno potrebbe pensare di affrontare la costruzione di un edificio che sia più complesso di un’aia per galline, senza un’opportuna fase di studio ed analisi. Eppure nel campo dell’informatica persiste ancora questa deprecabile abitudine.

Un modo che trovo possa essere efficace per rimuovere questo ostacolo è quello di autoregolamentarsi per eliminare il conflitto di interessi che oggi c’è tra analista e sviluppatore.

Oggi il tipico provider di soluzioni informatiche, piccolo o grande, offre lo studio di fattibilità, l’analsi, lo sviluppo e il collaudo della soluzione informatica; c’è un discreto conflitto di interessi nelle attività elencate, infatti:

  • quasi sempre lo studio di fattibilità indicherà che il progetto è fattibile e che proprio questo solution provider ha la soluzione
  • l’analisi mostrerà che la soluzione appropriata è quella che il solution provider ha già fornito anche ad altri clienti

Ovviamente non è affatto detto che le due affermazioni sopra siano sempre false né che siano sempre vere. Ciò che è vero è che spesso anche se il progetto fallisce, il solution provider è comunque e giustamente da pagare per il lavoro svolto.

Lo studio di fattibilità, l’analisi e specifica dei requisiti, così come la direzione dei lavori e il collaudo finale dell’applicazione informatica dovrebbero essere sempre condotti con un “capitolo di spesa” diverso da quello utilizzato per la produzione vera e propria della soluzione informatica.

Quindi un’organizzazione che ha a cuore l’efficacia dei suoi investimenti dovrebbe autoregolamentarsi in tal senso adottando un processo di acquisizione dei beni IT che comprenda:

  • lo studio di fattibilità
  • l’analisi dei requisiti e la loro specifica
  • la redazione di un capitolato di gara per l’assegnazione dei lavori e l’identificazione di un produttore di software adeguato sia sotto il profilo economico che qualitativo
  • la nomina di un responsabile per la direzione dei lavori e per il collaudo finale

Oggi quante organizzazioni hanno un processo di acquisizione di beni IT di questo tipo? E quante di quelle che spendono soldi pubblici possono dire di averci anche solo pensato alla formalizzazione di un processo strutturato di acquisizione? Purtroppo poche…

Ictus: scoperto gene che segnala il rischio

Arco d'Augusto, Aosta
Image via Wikipedia

Sono incappato proprio pochi minuti fa in quest’articolo su Bergamo Sera, giornale on line locale di cui ricevo gli aggiornamenti per e-mail: Ictus: scoperto gene che segnala il rischio.

Mi fa piacere che quella ricerca si sia conclusa con un risultato positivo, dato che ho potuto fornire il mio piccolo contributo di tecnico informatico.

Nel 2007 ho implementato, per conto anche dell’istituto “Carlo Besta” e all’interno di un progetto europeo coordinato da alcuni conoscenti, la parte di servizi web (SOAP web services) che consentivano l’interrogazione integrata dei dati clinici e genetici delle migliaia di pazienti di cui si parla nell’articolo.

Ricordo tra l’altro con piacere qualche piacevole gita ad Aosta, per presentare i lavori tecnici svolti sul progetto.

HOWTO: stream response with struts 2 that works in IE6

Web browser
Image via Wikipedia

Sometimes I had to display a dinamically generated file to the browser without save it locally on the server where I produce it.

HTTP allows you all of this, but browsers implemented the feature in different ways, so here I will report a method for sending a stream of binary data to a browser that works for every browser, in particular IE6.

The environment I use for this example is:

The struts.xml fragment for the action that rertieves the bytes and send them to the browser is as follows:

<action name="getFile" class="my.app.ExportFileAction" method="getFile">
    <result type="stream" name="success">
        <param name="contentType">${mimeType}</param>
        <param name="inputName">exportStream</param>
        <param name="contentDisposition">attachment; filename=${fileName}</param>
    </result>
</action>

The getFile() method of the my.app.ExportFileAction class is as follows:

public String getFile() {
  try {
    exportStream = new ByteArrayInputStream(getFileContent());
    mimeType = "application/pdf"; // in this example I use PDF mime
    fileName = "ExportedFile.pdf"; // the name we want to be proposed in the Save as... dialog
  } catch (Exception e) {
    return ERROR;
  }
  return SUCCESS;
}

exportStream, mimeType and fileName are members of my JavaBean Action class, each of which must have its getter and setter:

 protected String mimeType;
 protected String fileName;
 protected InputStream exportStream;

getFileContent() will be the method that retrieves the bytes of your file to send to the browser; here I will report only the method signature:

 private byte[] getFileContent() {}

HOWTO: JS triggered link showing a DIV with LightBox

 Questo articolo è disponibile anche in italiano.

To use Lightbox to display the content of a DIV instead of an image can be not so straightforward.
In my example, to obtain the desired effect, I used the scsLightbox  jQuery plug-in. This makes easier to interact with page elements.
Here are brief instruction on how to do it:

  1. Download jQuery and the scsLightbox plug-in
  2. Link in your page the jQuery script of the desired version (I tested for this example the 1.4.2 and 1.5.2 releases), the plugin script, and the CSS bundled with the plug-in:
<script type="text/javascript"
     src="MyScripts/jquery/jquery-x.y.z.min.js"></script>
<script type="text/javascript"
     src="MyScripts/scsLightbox/jquery.scslightbox.js"></script>
<link rel="stylesheet" type="text/css" 
     href="MyStyles/scsLightbox/jquery.scslightbox.css">
  1. We want to activate the lightbox clicking a link, so we need the link, and the DIV with the content we want to disply in the LightBox; the link will not have a content because it will only be an anchor that we will activate it from JS:
<a id="link-content-div" href="#content-div"></a>
  <div id="content-div" style="display: none;">
    Il contenuto del nostro div.
  </div>
</div>
DIV is initially hidden. Note that the href link’s attribute point to the DIV’s selector: this is the same selector we would use in CSS to style the DIV.
  1. Now, we want to display the content-div in the LightBox and define the JS function we can call to activate the LighBox. To find DOM elements and activate the link we use jQuery:
<script type="text/javascript">
  $(function() {
    $('#link-content-div').scsLightbox();
  });
  function ShowContentDiv() {
    $('#link-content-div').trigger('click');
  }
</script>

This trick is quite simple and useful, because it allows you to display whatever HTML you want in a LightBox.

As an alternative you can try to use FancyBox to do the same work.

HOWTO: get a recordset result from a PL/SQL Function

 Questo articolo è disponibile anche in italiano.

How to get a recordset result from a parametric query in PL/SQL in one command?

At first, I thought:

  • It should be useful to use a view but…. We can’t “pass” parameters to a view; a view could read some information from the SYS_CONTEXT or from a table where to store the parameter, but in this way the commands used would be complicated ad we should involve a transaction, isolation of the parameter etc.
  • I may use a procedure but… A procedure can’t return a recordset; it can return a cursor, that cannot be directly “viewed” but rather used by another procedure or PL/SQL code that loops thorugh it.
So, here comes the solution. We may use OBJECT TYPES and PIPELINED FUNCTIONS.
A pipelined function, can return a collection of objects, each of which will be rendered as a record of a table in the resulting recordset; so we have to define this object and the relative collection object in PL/SQL:
    CREATE OR REPLACE
    TYPE O_MY_OBJECT AS OBJECT (
      MY_DATE                       DATE
    , MY_NUMBER                     NUMBER
    , MY_VARCHAR                    VARCHAR2(20)
    );

    CREATE OR REPLACE
    TYPE T_MY_OBJECT AS TABLE OF O_MY_OBJECT;
Then, we can declare a function as PIPELINED and say it will return the previously defined collection type and, in the function body, create the objects (the record) and send them to the output with PIPE ROW():
    FUNCTION MY_FUNCTION(V_MY_PARAM IN VARCHAR2)
      RETURN  T_MY_OBJECT
      PIPELINED
    AS
    V_MY_OBJ_VAR O_MY_OBJECT := O_MY_OBJECT(null, null, null);
    BEGIN
          SELECT
                SYSDATE
              , 10
              , 'CIAO MONDO! -> ' || V_MY_PARAM
          INTO
              V_MY_OBJ_VAR.MY_DATE
            , V_MY_OBJ_VAR.MY_NUMBER
            , V_MY_OBJ_VAR.MY_VARCHAR
          FROM
              DUAL;

          PIPE ROW(V_MY_OBJ_VAR);

      RETURN;
    END MY_FUNCTION;
Let’s go deep in some detail:
  • V_MY_OBJ_VAR O_MY_OBJECT := O_MY_OBJECT(null, null, null); => I define a variable and init it with the object’s default constructor
  • INTO clause => set the desired values (in this case some constant value) in my object’s properties
  • PIPE ROW(V_MY_OBJ_VAR) => send the object to output
If we have to work with rows returned by a parametric query that we want to execute inside the pipelined function, we can declare and LOOP through a cursor and, at every loop cycle, build a new object instance and send it to the output with PIPE ROW.
In the end, to call this function and get the final result, we must use the PL/SQL TABLE function:
     SELECT * FROM TABLE(MY_FUNCTION('SAMPLE VALUE'));
The result, will be a grid of results usable as a table or a view.