Categorie
Blog

numeri

tanti numeri in questi giorni.
già 3 volte hanno tentato di aggiornare la memoria del mio pc. alla quarta (4!) hanno finalmente portato il giusto tipo di ram, e adesso la memoria disponibile è passata da 1024Mb a 2048Mb. aspettavo da 5 mesi. (nota che la stessa cosa è successa anche un anno fa su un’altra postazione).
visto il disguido della memoria, ho chiesto di aggiornare anche il monitor con uno migliore. non mi hanno portato un lcd, purtroppo, ma adesso la risoluzione supportata è passata da 1024*768 a 1280*1024. adesso riesco addirittura a tenere aperto il pannello delle properties in visual studio!
poi 107.373 punti è il mio nuovo record in TRIZ in una partita che non finiva più… ho doppiato ampiamente il mio precedente record di 47.428 punti.
per finire dico 1. perchè in ufficio ci sono solo io. uno. il mio capo non è più il mio capo e si è spostato in un’altra stanza. così, alla macchinetta del caffè, parlando coi colleghi che mi chiedevano “come stai da solo in stanza?” rispondevo: “solo…”.
allora i suggerimenti dei colleghi sono stati:

  • chiama un customer care
  • metti uno specchietto appeso al soffitto, a mo’ gabbia di pappagallini
  • anzi no, metti direttamente una webcam che ti inquadra e guardati sul monitor
  • parla con l’assistente di office…

tra questi non so scegliere… dò i numeri…

Categorie
Musica

Che liberazione!

Ho visto la luce sono quasi le tre di notte, ma dopo un’illuminazione, ho capito il C6th!
cos’è? un’accordatura “open tuning” per chitarra slide.
domani ve la spiego.
spero stanotte di non dimenticarmela… =) (no, no, mi sono scritto gli appunti!)

Categorie
Informatica

Singleton Pattern per C#

Singleton Pattern per C#

piccolo esempio di pattern singleton thread safe per C#. dal momento che lo uso molto spesso e che devo copiarmelo di qua e di là, ho deciso di scriverlo sul sito, che almeno so sempre dove trovarlo =D
ciao

public class Oggetto 
{
   #region Singleton
   //singleton pattern
   private static bool _isInit;
   private static Exception _error;
   private static volatile Oggetto _instance = null;
   private static object _syncObj = new object();

   /// 
   /// Get the Oggetto Instance
   /// 
   public static Oggetto Instance
   {
      get
        {
           if (_instance == null)
           {
              lock (_syncObj)
	      {
                 if (_instance == null)
                    _instance = new Oggetto();
              }
           }
           if (_isInit)
              return _instance;
           else
              throw new Exception(
                 "Error initializing Oggetto", _error);
        }
   }

   private Oggetto()
   {
      try
      {
         InitData();
         _isInit = true;
      }
      catch (Exception ex)
      {
         _isInit = false;
	 _error = ex;
      }
   }
   #endregion

   private void InitData()
   {
      // qua ci va l'inizializzazione
   }

   // comodo per reinizializzare tutto, se serve
   internal void RefreshCache()
   {
      this.InitData();
   }
}

c#, dotnet, lavoro, pattern, singleton, best practices

Categorie
Politica

Disastro totale

Disastro totale globale
Poco mi consola che ci sia qualcuno che la pensa come me…

Categorie
Informatica

regression test best practices ovvero come testare per bene le applicazioni

È inutile dire, spiegare, ribattere sul perché fare i test del software è utile ed importante: e se ne possono fare di molti tipi. Il semplice test su un caso d’uso, il test di integrazione (per le nuove funzionalità), il test di usabilità, molti altri poi, ma non ultimo test di regressione. Cioè quel test che serve a controllare che la nuova versione del programma faccia ancora le cose che faceva prima.
Sembra una scemenza, ma a volte le nuove funzioni possono interferire con le vecchie. E ovviamente non deve accadere.
Ora vediamo un caso di test egregiamente svolto.
Il server SQL che ospita i database di tutti i nostri programmi aveva bisogno di una bella rinfrescata al sistema operativo. Visto che aggiornare il S.O. (nel caso windows server 2003) è un’operazione di qualche ora, si è stabilito di fermare un pomeriggio tutte le attività e di lasciare agli amministratori il tempo di lavorarci su. Ieri era il giorno fatidico e le 12.00 l’ora X.

  • Ore 11 il capufficio ufficio CU ri-segnala ai nostri utenti che un’ora dopo il database sarebbe stato spento.
  • Ore 11.20 il dirigente dei nostri utenti (che chiameremo DU) ci scrive una email: “il programma DB_Uploader ha qualcosa a che fare con il database?” – quest’applicazione prende effettivamente dei dati e li carica sul database, e il suo gruppo lo usa quotidianamente
  • Ore 11.25 leggiamo l’email e decidiamo di rispondere: “Sì, come già scritto nelle email di lunedì e giovedì scorso”
  • Ore 11.35 DU risponde scrivendo a noi e ai suoi sottoposti: “Bene. Visto il fermo macchina del server sarebbe il caso di fare un test dell’applicazione DB_Uploader.” e conclude dicendo ad un utente (che chiamerò UT) “UT pensaci tu.”
  • Ore 11.36 io e CU ci guardiamo sbalorditi e diciamo: “Cosa vuole fare?”
  • Ore 11.37 io e CU rileggiamo l’email di DU
  • Ore 11.37 e 30 secondi io e CU, ancora più sbalorditi, ci chiediamo: “Cosa si aspetta da questo test? Il database è spento quindi l’applicazione non funzionerà!”. Ridiamo e decidiamo di non rispondere
  • Ore 12 come preventivato gli amministratori spengono il database e cominciano a lavorare
  • Ore 12.20 UT risponde: “Adesso non riesco a provare, perché sono molto occupato. Appena torno da pranzo lo farò subito”. Io e CU pensiamo “UT, mangia pure tranquillo…”
  • Ore 13.30 UT ritorna dal pranzo, e anche noi.
  • Ore 13.37 UT scrive un’email a tutti: “Ho provato più volte il DB_Uploader e non vuole saperne di partire. Vi allego una schermata… Dice che non riesce a collegarsi al database… “
  • Ore 13.37 e 1 secondo io e CU leggiamo l’email e in coro diciamo “MA VA’?”. Anche stavolta decidiamo di non rispondere…

Morale della storia

Quando prevedi di fare un test, devi più o meno immaginarti quale può essere il risultato.

Morale della storia 2

Se il capo ti chiede di fare un test scemo, devi più o meno immaginarti quale può essere il risultato. Il risultato può essere che passa per scemo solo il capo, solo tu, o tutti e due insieme…
PS: l’aggiornamento del server è andato a buon fine

Categorie
Informatica

per un punto Martin perse la data

tanto tempo che non scrivo. perchè il tempo non è tanto ma è poco…
allora aggiungo questa storiellina simpatica…
"com’è che ho scritto sul mio cv? "attitudine al problem solving"?
stamattina ci hanno segnalato un bug nei dati di un report. il capo mi dice "facciamo l’analisi insieme".
cominciamo a spulciare le query e taaaac, trovo il punto giusto e taaaaac, scopro che in una certa tabella c’è un errore sul campo data su un record che non sappiamo ancora qual è.
e taaaac dico "record 1287" e lui "come fai a saperlo?" e io "beh, se nella tabella di destinazione ci sono 1286 record su duemila e passa che dovrebbero esserci, il problema sarà sul 1287esimo!".
e taaac troviamo che la data del 1287esimo record è sbagliata 02/02/208 invece di 02/02/2008.
taaaac. corretta la data, rilanciata la procedura di importazione e risolto il problema sul report.
taaaaaaaac!"

a chi ha sbagliato a inserire la data ovviamente gliela faremo pagare!

Categorie
Politica Satira

L’Europa

Niente ben per noi qua in Italia.
A parte l’ottimismo de il manifesto di qualche giorno fa che diceva “Prodi se n’è andato, Berlusconi non è ancora tornato: godiamoci questo magico momento“, per dirla alla Celentano “la situazione non è buona”.
La commissione europea ci sta tirando per le orecchie per le scovazze a Napoli, e ieri lo ha fatto anche per l’uso delle frequenze tv, di diritto assegnate ad Europa7 e invece utilizzate da Rete4.
La mia considerazione? Data la quantità de scovazze in television, bisognassi buttar la television in scovazze…

Categorie
Informatica Mac

Aggiornamenti di fine anno

Ruby On Rails, il famoso framework mvc per il web, è stato aggiornato alla versione 2.0. Sul mio OSX Leopard è installato di default la versione 1.2.6, ma aggiornarlo è semplicissimo, questione di un

iwave:~ davide$ sudo gem update rails

e di un paio di minuti (ma anche meno) e avrete

iwave:~ davide$ rails --version
Rails 2.0.2

Inoltre ho installato il database MySql alla versione 5.0.51.
Non esistendo ancora un pacchetto compatibile per OSX Leopard, bisogna installarselo da soli.
Fate come me, è questione di meno di dieci minuti, compilazione compresa.

  • create una cartella di lavoro
    $ mkdir ~/mysqlsrc
    $ cd ~/mysqlsrc
    
  • scaricate i sorgenti, decomprimeteli e entrate nella loro cartella
    $ curl -O \ 
    http://na.mirror.garr.it/get/Downloads/MySQL-5.0/mysql-5.0.51.tar.gz
    $ tar xzvf mysql-5.0.51.tar.gz
    $ cd mysql-5.0.51
    
  • configuriamo per la compilazione
    $ CC=gcc CFLAGS="-Os" CXX=gcc CXXFLAGS="-Os" ./configure \
    --prefix=/usr/local/mysql --with-extra-charsets=complex \
    --enable-thread-safe-client --enable-local-infile \
    --enable-shared
    
  • adesso siamo pronti a compilare (se avete un dual core lasciate -j5, altrimenti -j2)
    $ make -j5 
    
  • e ora possiamo installare, prendendo i privilegi di amministratore
    $ sudo make install
    

    questo installerà mysql e tutto il necessario in /usr/local/mysql

  • ora andiamo a configurare le cartelle di mysql

    $ cd /usr/local/mysql
    $ sudo ./bin/mysql_install_db --user=mysql
    $ sudo chown -R mysql ./var
    

    e poi procedete come sempre a settare la password di root e gli utenti del db

  • ora vorremmo che il server mysql parta automaticamente ad ogni avvio, vero? aggiungiamolo a launchd
    creiamo questo file in Documents col nome com.mysql.mysqld.plist

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" 
     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>com.mysql.mysqld</string>
        <key>Program</key>
        <string>/usr/local/mysql/bin/mysqld_safe</string>
        <key>RunAtLoad</key>
        <true/>
        <key>UserName</key>
        <string>mysql</string>
        <key>WorkingDirectory</key>
        <string>/usr/local/mysql</string>
    </dict>
    </plist>	
    

    e copiamolo con i privilegi di root in /Library/LaunchDaemons/

    $ cd ~/Documents 
    $ sudo cp ~/Documents/com.mysql.mysqld.plist /Library/LaunchDaemons/
    $ sudo chown root /Library/LaunchDaemons/com.mysql.mysqld.plist  
    

    e diciamo a launchd di attivare il demone

    $ sudo launchctl \ 
     load -w /Library/LaunchDaemons/com.mysql.mysqld.plist
    

    questo lancerà il server mysql. Eventualmente per chiuderlo da linea di comando

    $ sudo launchctl \ 
     unload -w /Library/LaunchDaemons/com.mysql.mysqld.plist
    
  • Il binding per mysql verso rails va aggiornato così: (per processori INTEL!!!)
    $ sudo env ARCHFLAGS="-arch i386" gem install mysql \
    --with-mysql-config=/usr/local/mysql/bin/mysql_config
    

    Finito!!! Ora il nostro sistema Ruby on Rails è aggiornato e pronto a tutto!

  • PS: se eventualmente volessimo cancellare mysql

    $ sudo launchctl \ 
     unload -w /Library/LaunchDaemons/com.mysql.mysqld.plist
    $ cd ~/mysqlsrc/mysql-5.0.51
    $ sudo make uninstall
    $ sudo rm /Library/LaunchDaemons/com.mysql.mysqld.plist
    

    Buon divertimento