Tacun

Un vecchio detto dell’informatica — talmente vecchio che fa riferimento al termine ABEND, con cui i mainframe IBM segnalavano l’ABnormal END di un programma —, recita:

I PDF non ABENDano mai.

Questo invito a diffidare delle descrizioni eccessivamente entusiastiche di prodotti hardware o software si applica anche ai siti Web. Anche a questo.
Perciò, non cercheremo di convincervi che siamo bravissimi e che il nostro software funziona sempre. Per quanto possibile, eviteremo avverbi e aggettivi e ci limiteremo ai dati oggettivi del nostro lavoro: cosa sappiamo fare e come potremmo esservi utili.

Cosa sappiamo fare

La cosa che sappiamo fare meglio è scrivere software che risolve problemi.
Abbiamo cominciato a lavorare con i computer nel 1988; abbiamo realizzato il nostro primo sito Web dinamico nel 1995 e il nostro primo sito di commercio elettronico nel 2001.
Dal 2008 ci occupiamo anche di cybersecurity, tenendo corsi di formazione ed effettuando vulnerability assessment e penetration test per clienti come INPS, INAIL e Consip.
Abbiamo competenze (comprovabili) relative ai seguenti prodotti, linguaggi e paradigmi:

Sicurezza Office365, FortiGuard, FireEye, MISP, OWASP
RDBMS PostgreSQL, MySQL, DB2
Linguaggi C++, C, PHP, SQL, Perl, HTML
Altro SEO, caching Akamai e Cloudflare, Git, Jekyll

Come potremmo esservi utili

Se vi serve un sito in Wordpress o una PowerApp che legga i dati da un foglio Excel, non siamo la scelta giusta per voi, ma se vi serve un CMS ad alte prestazioni o una libreria in C++ per l’analisi dello spettro di Plutonio e Uranio, probabilmente vi possiamo dare una mano.

bool uranium_spectrum::solid_samples_analysis()
{
   le_relative_efficiency();
   he_relative_efficiency();
   
   peak peak1;
   peak peak2;
   peak peak3;
   int i = 0;
   while (i < _rois.size())
   {
      int j = 0;
      while (j < _rois[i]._peaks.size())
      {
         if (_rois[i]._peaks[j]._RefData._Energy == 93.35)// KA1 Th
            peak1 = _rois[i]._peaks[j];         
         if (_rois[i]._peaks[j]._RefData._Energy == 92.38)// TH 234
            peak2 = _rois[i]._peaks[j];         
         if (_rois[i]._peaks[j]._RefData._Energy == 92.80)// TH 234
            peak3 = _rois[i]._peaks[j];         
         j++;
      }
   i++;
   }

   double eff1 = 1.;
   if (peak1._RefData._Energy < 115)
      eff1 = exp(_LERelEff[0]*log(peak1._RefData._Energy) + 
               _LERelEff[1]*pow(log(peak1._RefData._Energy),2.));
   else
      eff1 = exp(_HERelEff[0]*log(peak1._RefData._Energy) + 
               _HERelEff[1]*pow(log(peak1._RefData._Energy),2.) +
               _HERelEff[2]*pow(log(peak1._RefData._Energy),3.));

   double eff2 = 1.;
   if (peak2._RefData._Energy < 115)
      eff2 = exp(_LERelEff[0]*log(peak2._RefData._Energy) + 
               _LERelEff[1]*pow(log(peak2._RefData._Energy),2.));
   else
      eff2 = exp(_HERelEff[0]*log(peak2._RefData._Energy) + 
               _HERelEff[1]*pow(log(peak2._RefData._Energy),2.) +
               _HERelEff[2]*pow(log(peak2._RefData._Energy),3.));
   
   double eff3 = 1.;
   if (peak3._RefData._Energy < 115)
      eff3 = exp(_LERelEff[0]*log(peak3._RefData._Energy) + 
               _LERelEff[1]*pow(log(peak3._RefData._Energy),2.));
   else
      eff3 = exp(_HERelEff[0]*log(peak3._RefData._Energy) + 
               _HERelEff[1]*pow(log(peak3._RefData._Energy),2.) +
               _HERelEff[2]*pow(log(peak3._RefData._Energy),3.));
   
   double *err = new(double);
   double ratio1 = isotopic_ratio(peak2,eff2,peak1,eff1,err);
   double ratio1err = *err;
   double ratio2 = isotopic_ratio(peak3,eff3,peak1,eff1,err);
   double ratio2err = *err;

   double ratio = 0.5 * (ratio1 + ratio2);
   double ratioerr = sqrt(pow(0.5*ratio1err,2.) + pow(0.5*ratio2err,2.));

   _Ab235 = 1 / (1 + ratio);
   _Ab235err = pow(1 / pow((1 + ratio),2.) * ratioerr,2.);
   _Ab234 = 0.;
   _Ab238 = 1 - _Ab235 - _Ab234 - _Ab236;
   
   return true;
}

Ci sono informatici, anche bravi, che si specializzano e fanno le stesse cose per tutta la vita; a noi, invece, piace imparare qualcosa di nuovo a ogni progetto e creare qualcosa che prima non c’era — come il primo prototipo della Posta Elettronica Certificata, nel 2002.

int Sessione::firma_messaggio(const char* file_in, const char* file_out) 
{
    DEBUG( "firma_messaggio", DBG_FUNZIONI )

    int   esito = ESITO_OK; // default OK
    DATI_FIRMA df;

    df.file_in  = file_in;
    df.file_out = file_out;
    df.cert     = _configurazione.valore("PATH_CERTIFICATO");
    df.chiave   = _configurazione.valore("PATH_CHIAVE");
    df.pass     = _configurazione.valore("PASSWORD");;

    if( ( esito = pec::firma_messaggio( &df ) ) != ESITO_OK )
    {
        // le funzioni di crittografia non scrivono sul file 
        // di debug, quindi, per sapere cosa sia andato storto, 
        // si deve leggere il valore tornato.
        char str_errore[80];
        sprintf( str_errore, "errore %d in firma_messaggio", esito );  
        _str_errore = "errore-firma";
        _str_errore_esteso = str_errore;
    }

    return esito;
}

Ci piace anche insegnare. In particolare, ultimamente, insegnare ai non tecnici come difendersi dalle minacce — sempre più frequenti e sofisticate — dei pirati informatici, perché pensiamo (e scriviamo) che la formazione del personale sia il metodo migliore per combattere il crimine informatico.