IT Trends – Buzzwords anti crisi

Tutti lo dicono ma pochi dimostrano di averlo capito nel profondo. Per uscire dalla crisi non basta aspettare che passi; bisogna metterci l’impegno.
Allora nel piccolo e nel personale, ci viene chiesto (o, meglio, imposto) di contribuire maggiormente alle spese dello stato.

Lo facciamo, contribuiamo, ma solo perché siamo costretti; lo facciamo malvolentieri, un po’ come pinocchio quando deve bere la medicinaccia amara, anche se poi ci fa stare bene. Se non fossimo costretti la maggior parte di noi semplicemente non lo farebbe.

Logo Information Technology
Logo Information Technology (Photo credit: Wikipedia)

Così è per gli investimenti in innovazione e, per quanto riguarda quest’articolo, in Information Technology. Le aziende spesso investono in IT non quando e come gli conviene di più, ma solo quando sono costrette da fattori esterni:

  • concorrenza
  • normative
  • adattamento ad aziende fornitrici o clienti

In questi casi quando si investe in IT lo si fa in ritardo, spinti da impulsi che non sono ben compresi verso obiettivi altrettanto scarsamente compresi. Inutile dire che questo non è un buon investimento, nonostante sia meglio di niente. Per riprendere l’incipit dell’articolo, lo si fa perché si è costretti, altrimenti non lo si farebbe. Non si tenta, o non si è in grado, di scorgere il potenziale virtuoso di un tale investimento: se ne vede la voce “spese” a bilancio senza avere gli strumenti per poi verificare il “risparmio” nelle epoche successive. Non si misura quasi mai in maniera complessiva il ritorno su questi investimenti.

Le buzzwords di questo momento, su cui mi trovo in sintonia e di cui voglio brevemente far cenno qui, sono CLOUD, MOBILE e SOCIAL.

Sono evidentemente soluzioni ancora non del tutto note o sfruttate, ma vanno indiscutibilmente nella direzione della razionalizzazione e del risparmio sulle infrastrutture il cloud, del miglioramento della qualità del servizio e dei tempi di risposta agli eventi il mobile e dell’interconnessione sinergica delle relazioni il social.

Una soluzione cloud, a parità di servizio offerto, per fare un esempio, pensiamo al servizio di posta elettronica, è certamente:

  • più efficiente
  • meno inquinante
  • meno costosa
Perché pochi l’adottano? Perché molti vogliono ancora la propria sala server con le macchine da raffreddare, con il proprio server di posta elettronica da manutenere, da patchare, da proteggere dagli attacchi esterni, da backuppare, ecc, ecc. Molti hanno già fatto il passo della virtualizzazione. Alcuni stanno spostando la propria infrastruttura presso un datacenter, ma pochissimi si concentrano sull’acquisto del “servizio” chiavi in mano.

Pensiamo sempre alla posta elettronica e immaginiamo il plus offerto dai dispositivi mobile, come smartphone e tablets: la comunicazione è capillare, può raggiungere l’utente ogni luogo e momento. I dispositivi mobile hanno spesso la capacità di sapere dove si trovano (GPS), di connettersi a vari tipi di rete (Wi-Fi, UMTS, 3G), di fare e ricevere chiamate, di aggiungere video, immagini ai suoni. Una ricchezza informativa che può essere sfruttata. Le applicazioni possibili, da cui trarre valore, sono immense.

Mettiamo il tutto insieme con il social e con il potenziale dei famosi 6 gradi di separazione; il reperimento e la trasmissione delle informazioni attraverso le relazioni sono il motore della società e per certi versi il mondo (umanamente parlando) va alla stessa velocità delle informazioni che è in grado di diffondere. I passaggi evolutivi dell’umanità sono sempre stati legati alla capacità di reperire, elaborare e trasmettere delle informazioni. Da trasmissione orale a scritta è migliorata la reperibilità: è l’inizio della Storia. Da trasmissione a tele-trasmissione si sono accorciati gli spazi e quindi i tempi: radio, televisione, telefono e fax sono stati mezzi dall’impatto enorme. Internet ha aggiunto maggiore reperibilità, la ricerca, la trasmissione asincrona: un enorme impulso verso la scrittura automatica della Storia; la storia moderna sta scritta in gran parte su supporti informatici. La fase attuale è quella sociale: ognuno contribuisce peer to peer alla Storia e trova il modo di farsi osservare anche da chi non conosce direttamente: è un po’ come essere tutti in piazza, tutti sui manifesti, tutti in TV.

Queste sono le leve da sfruttare oggi, ma ancora c’è molta resistenza dovuta principalmente alla non conoscenza e all’impostazione delle proprie aspettative su un orizzonte temporale sempre più corto. Troppo corto.

Perdiamo la capacità dio investire, di innovare, di riconoscere la modernità e di cavalcarla per evolvere fino al prossimo stadio.

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.