Etichette

Visualizzazione post con etichetta INFORMATICA. Mostra tutti i post
Visualizzazione post con etichetta INFORMATICA. Mostra tutti i post

sabato 10 marzo 2012

Ancora info su Nhibernate

Sempre per la serie :
COLCAZZOCHEFUNZIONA 
mi trovo a scrivere un altro bel Post.
 Lavorando in ambienti  eterogenei e integrando procedure già in essere si trovano sempre mille eccezioni da gestire! Nel mio caso dopo aver scapocciato (Famoso termine informatico!!)  con entity frame  della Microsoft e dopo aver scelto  immediatamente Nhibernate, mi sono trovato di fronte ad altri mille piccoli problemi!!! (La povera esistenza dell'informatico)

Premessa:
ho voluto mappare un db esistente su sqlserver su Nhibernate, tale db ha svariate stored procedure e trigger, per esempio all'insert su una tabella scatta un trigger che fa insert su altre N tabelle...
Bella trovata no?
 Ma che succede?  che quando faccio insert su una tabella parte il count row di SQL che segna N insert e non 1 singolo insert, questo provoca una "famosa" eccezione su NHIBERBATE (Ovviamente per me famosa, visto che ripeto mi ha fatto scapocciare).

NHibernate.AdoNet.TooManyRowsAffectedException 

Cerchiamo di rimanere calmi e vediamo come  ragiona Nhibernate e perché da eccezione:
Nhibernate, segue questo processo: se io sto inserendo  una nuova riga in una tabella e sto inserendo in questa tabella una chiave primaria, si aspetta che ci sia solo una riga inserita,  perché la chiave primaria di solito è univoca e per cui non potrebbe essere altrimenti, se ci fossero piu righe con la stessa chiave primaria, ci sarebbe un bel errore, o di progettazione o del motore sql.

Nel mio caso, però c'è un trigger che fa insert su altre tabelle, per cui non c'è nessuna tipologia di malfunzionamento, anzi è stato progettato per funzionare cosi!!!! (in un altra sede insulteremo i progettisiti!)

Ovviamente chi mi legge è curioso, oppure potrebbe avere avuto  il mio stesso problema ed voler sapere conoscere come ho risolto il mio problema.

Io propongo tre vie:

  1. The attach this  practice
  2. The dirty practice
  3. The good pratice






La prima è  semplice, efficace, e consiste nell'attaccarsi a .... e cambiare progetto o cambiare lavoro!



[

La seconda è la pratica brutale, nel senso che grazie al costrutto, (che tutti conosciamo) try  catch
L'immagine associata alla soluzione è stata censurata
(costrutto applicabile all'intera nostra esistenza) possiamo esattamente catturare questa eccezione e far finta che non sia successo niente, con un unica attenzione: -> Nhibernate è transazionale, per cui se volgiamo che tutto funzioni, dobbiamo forzare il flush dei nostri oggetti, e ancora meglio dopo il flush chiudiamo la sessione con NHibernate, perche altrimenti avendo memorizzato quell'eccezione su quella sessione non vi farà più fare niente, se non delle semplici select.



Terza via  è quella di riscrivere i trigger, poichè ogni trigger puo essere riscritto in modo che dopo essere partito non alteri il row count di MS SQL server.
Come ? ecco il comando:

SET NOCOUNT { ON | OFF } 
ovviamente nel nostro caso è da mettere a OFF!


Vorrete sapere quale scelta è stata fatta per il mio progetto? 
Ovviamente deve rimanere una curiosità!


domenica 5 febbraio 2012

Entity Framework Vs NHibernate

Finalmente ritorno a scrivere qualcosa di informatica!!
Faccio una premessa d'obbligo,  io non voglio essere sempre contro i prodotti di microsoft, come un principio, io ce la metto tutta per essere a favore di prodotti fatti bene, è colpa di microsoft che non riesce proprio a fare alcune cose, a favore di questo vi dico che da tempo utilizzo la piattaforma .Net e ho sempre un buona opinione di C#, di alcune funzionalità all'interno di visual studio 2008 e 2010, certo potrei un innervosirmi se vado a vedere il costo di questi tool!!

Queste pillole informatiche non vogliono essere un manuale, ne la bibbia, ne il corano (sempre per parcondicio) ma vogliono aiutare tutti coloro che come me si trovano a progettare e implementare sistemi informativi software e quanto altro, insomma per evitare quella famosissima frase:
"COL CAZZO CHE FUNZIONA!!!!"
Questa volta mi ci ero messo proprio di impegno, volevo usare entity framework!
Ne avevo letto, pensavo di averlo capito, sembrava tutto facile, spingi un pulsante qua, scegli un DB poi una tabella e UALA, il gioco è fatto. Ho iniziato il progetto, ci ho lavorato e che scopro, che come al solito è una scatola chiusa ermeticamente, e se ci vuoi mettere le mani dentro non c'è modo. La grossa difficoltà è stata quella di voler implementerare delle entità sopra a delle viste, queste viste avevano tutti i campi Not Null, e questo produceva un entity in cui tutte le colonne erano chiavi!!!

Ho cercato per giorni, e giorni una soluzione software a questo problema, ma non ho trovato soluzioni valide ovviamente per il mio progetto.

E cosi ho dovuto dirottare il lavoro fatto su un altro ORM per .NET: NHIBERNATE

Fortunatamente lo avevo utilizzato già un un altro progetto, e ad ho potuto apprezzarlo ancora meglio.
La cosa più bella che trovo in Nhibernate e di conseguenza in Hibernate, è la possibilità di adattarsi a qualsiasi situazione, e questo con la massima trasparenza. Con dei "semplici" xml di mapping, Nhibernate riesce a mappare i nostri oggetti come vogliamo, non dobbiamo perseguire delle regole di programmazione restrittive sui nostri oggetti, non dobbiamo ereditare o rifarci a classi astratte per definire le nostre entity, e le nostre entità possono essere caratterizzate da funzioni e attributi a nostro piacimento. Questo ci permette di disegnare una bussiness logic come meglio è necessario per il nostro progetto.

Per cui:

  • Programmazione a Oggetti senza limitazioni
  • .Net nativo di codice
  • Infinità di tipologie di mapping XML
  • Non c'è da compilare niente altro che il nostro progetto
  • Diverse tipologie per interagire  tra i nostri oggetti i lo strato SQL
  • LGPL
Insomma un gran bel progetto, consiglio a tutti di provarlo.




martedì 15 novembre 2011

Ricercare file Audio

Allora il titolo sembra banale, fare un programmino di ricerca è banale con qualsiasi strumento software, ma il mio intento era diverso.

I sistemi windows  riconoscono la tipologia di file dall'estensione, o meglio nel sistemi windows  riconosciamo se è un file audio o meno da la sigla che troviamo in fondo al file dopo il punto, al cosi detta estensione, un modo semplice e chiaro, direi quasi user friendly, ma che succede se io prendo un file .doc e lo rinomino in .mp3? niente, l'unica cosa fastidiosa è che  il nostro pc tenterà di aprire un file doc con un lettore di file mp3! avete mai provato!!
Mentre nei sistemi *NIX,  il riconoscimento si basa sui i primi byte che vengono  incontrati  nella lettura del file, ogni file è codificato da un "MAGIC NUMBER".
L'intento del programma che sto per mostrarvi è proprio quello di ricercare i file audio tramite la propria codifica e non tramite estensione.
Per esempio molto utile è se dovete cercare un file tra i file temporanei di un broswer oppure nella directory temp di windows dove vengono cacheati  i file in lavorazione.
Vi posto il listato:


<?php


$path_to_search_s = "/mnt/HD12";
echo "Start...." . "\n";
cercaFile(($path_to_search_s));


function cercaFile($path_to_search) {
    //echo "ENTRATA FUNZIONE...\n";
    //echo $path_to_search . "\n";


    if (is_dir($path_to_search)) {
      //echo $path_to_search . " 2\n";
        $tree = scandir($path_to_search);
        foreach ($tree as $item) {
            if (strtoupper($path_to_search) != strtoupper(($item)) && $item != "." && $item != ".." && $item !="Dati applicazioni" && $item!="Application Data") {
                $item = $path_to_search . "/" . $item;
                //echo "Sono pronto prima " . $item . "\n";
                //$item=realpath($item);
                //echo "Sono pronto" . $item . "\n";


                if (is_dir($item)) {


                   // echo "Dir:" . ($item) . "\n";
                    cercaFile(($item));
                } else {


                    if (is_file(($item)) && ($item) != "") {
                        //echo "Debug file:" . ($item) . "\n";
                        //é un file percui dobbiamo analizzarlo in tutti i modi possibili
                          $finfo = finfo_open(FILEINFO_MIME_TYPE);
                          $type=finfo_file($finfo, realpath($item));
                          finfo_close($finfo);
                          if (strrpos($type, "audio")!==false)
                          echo "Audio:".realpath($item)." ".$type."\n"; 
                    }
                }
            }
        }
    } else {
        echo "<p class=\"error\">Path is not a directory</p>";
    }
}


?>


Lo script è in php, semplicemente perchè era l'unico modo di farlo girare sia su sistemi windows sia su sistemi *Nix.


Cambiando  semplicemente il path dove cercare $path_to_search_s = puoi fare ricerche ovunque crediate.
Altro punto importante, cambiando if (strrpos($type, "audio")!==false) potreste tentare di cercare qualsiasi altra tipologia di file, il valore in $type e il valore mime  per cui nel nostro caso è "audio/mp3", ma per una ricerca  di file word è text/word, per cui basterà sostituire word alla parola audio es:  if (strrpos($type, "word")!==false).


Ovviamente il sistema di ricerca sfrutta la ricorsione!

lunedì 24 ottobre 2011

iphone VS Google Contact

Oggi mi sono imbattuto in grande problema.
Di quei problemi che quando avevo 6 anni non potevo proprio immaginare.

Avete mai pensato che succederebbe, se la vostra rubrica telefonica del vostro Iphone  scomparisse all'improvviso?

Be è quello che mi è successo!
Dopo una bella sincronizzazione sono andato a vedere la lista dei contatti, e c'erano tutti, ma entrando dentro questi mi sono accorto  che non c'è il telefono memorizzao (insomma una scheda vuota.

AVEVO  360 SCHEDE VUOTEEEEE!

Adesso viene il bello...

Voi state gia pensando  che io ho i backup, perche sincronizzo sempre il mio iphone,   in fondo sono anche un informatico e  mi piace essere sempre pronto per ogni evenienza.
E infatti  ero  tranquillo, riaggancio il mio iphone al PC,
parte la sincornizzazione parte il  nuovo backup (mi doveva suonare gia strano, perche rifaceva il backup?).

Ma sono Fidocioso, mi dico "Vai bello" -> ripristina backup,
Parte il ripristino, qualche minuto e sono felice come una pasqua,
stacco tutto e mi preparo e cercare i numeri sui contatti, sicuro di avere una ovvia sorpresa....

INVECE NOOOOO! non c'è nessun numero in nessun contatto,
Qualcosa non ha funzionato...
ma  io sono un tecnico, percui mi dico, "Ma dai è ovvio mi ha messo l'ultimo beckup che è già corrotto".

Allora mi metto a cercare tutti i backup, e sapete che scopro!!

Diamine, quelli dell'apple hanno deciso che registrano due backup....
capite! solo due backup, e  oltre tutto ogni volta che attacchi l'iphone  fa backup, percui:

sono completamente fottuto (quasi)

Ma qui per fortuna che arriva SAN GOOGLE, il santo salvatore,

che avvolte fa davvero i miracoli.
Se siamo stati bravi, cioè abbiamo almeno una volta sincronizzato il nostro iphone con google, allora possiamo recuperare TUTTO, grazie a un piccolo programma che possiamo scricare da APPStore (Cercando Google Sync),


Per una conclusione modlleo Vittoria con cappottone!

GOOGLE batte APPLE 6-0

Spero che la mia storia vi abbia almeno divertito.... perche quando mi è successo io davvero non mi sono divertito!!!.

martedì 12 aprile 2011

Alla fine furono i Pattern, l'inizio degli Anti-Pattern

Una delle cose piu interessanti e piu divertenti della programmazione (e non ce ne sono tante), è  che scrivere un programma, è come scrivere un  Tema, una Prosa, una Poesia.
Nella reltà nella programmazione si utilizza un linguaggio di programmazione, un linguaggio molto semplice, ma anche lui con la sua sintassi e semantica, la fine di questo linguaggio è quella di impartire dei comandi ad una macchina molto stupida, ma per arrivare a dare un comando cosa si fa:

  1. Si descrive un contesto
  2. Si delineano gli attori
  3. Si definisce una storia

altrimenti il programma difficilmente funziona correttamente, ma come ben si vede è la stessa identica cosa che succede quando si scrive una racconto, una prosa, una poesia,  cosi come noi riusciamo a distinguere questi genere lettereari molto facilemnte, cosi nella programmazioni ci sono i "Generi" di programmazione, e dentro ogni "Genere" di programmazione c'è lo stile.

Vi è mai capitato di leggere un racconto e percepire chiaramente lo stile dell'autore? e di farvi anche un idea dell'autore, di quello che pensa?
Secondo me nella programmazione questo è ancora piu evidente, mettendo  in risalto la personalità del programmatore.
Mi è capitato spesso di leggere codice altrui, di revisolnarlo, patcharlo, e s  ogni volta mi rendevo conto della persona che avevo di fronte, insomma il codice prendeva vita, anima, personalità.
Un programma in definitiva è un "racconto" che parla ad una macchina e tenta di spiegargli di come risolvere un "problema" (lasciatemi utilizzare queste parole tra virgolette forse un purista potrebbe dire che sono esatte, ma come si dice sti c***i dei puristi ).

Ci sono mille modi di risolvere e di comunicare un problema, e ognuno scegli i suoi, e/o quelli piu congeniali a se stesso.

Come  nel linguaggio tradizionale si è tentato piu volte di dare delle soluzioni  astratte e funzionali ai problemi del parlato, gli scrittori sanno bene cosa vuol dire comunicare in prosa, in poesia, con un racconto, ed utilizzano strumenti tipo  figure retoriche....
Questi possono essere riportati a dei pattern di comunicazione, cioè ad un'astrazione di una soluzione per un problema.
In informatica o meglio nella programmazione  in generale questi pattern sono stati codificati in modo molto preciso, i primi a fare questa analisi furono la Gang Of Four, nel famosissimo libro "Design Pattern", che tra l'altro ho letto e presto scriverò una recensione.

Dall'altra parte molto piu divertente è stata l'analisi e lo studio degli Anti-Pattern, cioè lo studio di tutte quelle non soluzioni che quotidianamente i programmatori utilizzano piu o meno consapevolmente, in nome del famigerato PARADIGMA:
"BASTA CHE FUNZIONI!!"

lunedì 11 aprile 2011

mercoledì 9 febbraio 2011

SQL Management con Intellisense

Era  molto tempo che cercavo un plugin che mi permettesse nel mio Sql Server Management studio di utlizzare le carateristiche dell'Intellisense, fino ad oggi avevo trovato solo software a pagamento,
oggi ne ho trovato uno free,
 uso il termine generico poiché non ho approfondito che cosa  si intende per free (sappaimo tutti, o dovremmo in generale sapere che oramai esistono diverse tipologie di licenze free, e Open Source non vuol dire Free!).

DEVART SQL COMPLETE 2.0

Non voglio fare pubblicità ai prodotti di questa azienda, che non conosco,solo che questo software è scaricabile gratuitamente e mi sembra una buona cosa.

giovedì 27 gennaio 2011

Cosa sono i design pattern

Nel mio lavoro quotidiano, mi trovo ad affrontare determinate problematiche dello sviluppo  software.

Faccio una  precisazione, per chiarezza, poiché non costruisco sistemi realtime per centrali nucleari, o sistemi per i calcoli quantistici utilizzando  la matematica dei numeri primi, ma  molto spesso il mio lavoro consiste nel trovare delle soluzioni progettuali, che permettano uno sviluppo agile, uno sviluppo in team, uno sviluppo che renda facile il mantenimento di un progetto (Mi sembra di essere un po troppo serie!!8-O).
(questo è quello che mi ostino a pensare che sia il mio lavoro, ma alla fine il mio lavoro è mettere pacth e far funzionare ciò che di base non funziona)


IN questa fase, in realtà quello che si cerca è un modello, un modello per lo sviluppo di una classe , un modello di sviluppo per l'interea soluzioni software.
Ed è proprio per quest che i desiign pattern  sono dei modelli di sviluppo, dei modelli di astrazione utilizzati nello sviluppo software.

Oggi come oggi sono divenuti  fulcro dell'interna letteratura sull'ingegneria del software, poichè applicabile come soluzioni a piccole problematiche, come a  grandi soluzioni.

Il primo libro che consiglio di leggere:
  Design Patterns: Elementi per il riuso di software ad oggetti di Erich GammaRichard HelmRalph Johnson e John Vlissides (1995) 
questi furono i primi a codificare in modo dettagliato e esemplificativo questa tipologia di approccio.

domenica 23 gennaio 2011

Il Mitico file .CSV

Oggi mia moglie, mi ha fatto una domanda che io  sono rimasto esterrefatto, sbalordito, insomma come quando  qualcuno viene e ti domanda:

Scusi ma Dio esiste davvero?

Tu non sai che rispondere, ti sembrerebbe  ovvio dare una risposta, ma nel fra tempo non capisci perché ti venga chiesto.
Semplicemente  è una domanda personalissima a cui tutti noi almeno abbiamo pensato una volta e ci siamo dati una risposta. Insomma una cosa base.

A me è successo questo, in questa tranquilla mattina di domenica, mi moglie ad un tratto ti dice:
Che cosa è un file CSV?

Capite lo sgomento?
è ovvio che gli ho risposto:
"In che senso cara ?"
Mentre Dentro di Me. sono iniziate le mille trafile di perché, dei come, dei quando.... ho pensato:
 oddio il latte non era scaduto, forse sta male!

E invece no, niente di tutto questo, era una domanda  come le altre, lei davvero non sapeva cosa fosse un file .csv. Capite?
 Insomma  una tragedia

Per cui questo Post è dedicato a lei

CSV = Comma, separated Values (valori separati da virgole) per l'appunto è un file di testo in cui i valori sono separati da un delimitatore, che può essere una virgola, un punto virgola, o altro carattere, e su ogni riga c'è una diversa informazione.

PS: ho pensato che la prossima cosa che spiego a mio figlio è appunto cosa è un file csv, non vorrei che fra qualche anno mi facesse la stessa domanda, questa volta potrei proprio non farcela a dare una risposta!!

Questo è il link per WIKIPEDIA

mercoledì 19 gennaio 2011

Come Creare velocemente un esportazione da un DB a CSV

Vorrei iniziare questa sezione informatica, in modo eclatante, per cui;


  •  non avendo il tempo di riscrivere un sistema operativo (è ovvio che non lo scrivo solo per questioni di tempo, per cui portate pazienza)
  •  non avendo potuto creare un  algoritmo di ordinamento che avesse un rapporto di complessità pari a "n"  (è ovvio che non lo scrivo perché non lo ritengo un esercizio valido, a chi potrebbe interessare???)
  •  non avendo  voluto cercare di rompere l'algoritmo RSA a 2048 bit (per i troppi rischi connessi, che questo provocherebbe  sia alla mia persona fisica, sia il livello destabilizzazione  di alcune certezze oramai cardinate nella nostra cultura informatica)
Mi sono preso l'incarico di fornirvi un pezzetto di codice  di livello molto basso,  ma dico molto basso,  e proveniente da un esigenza ancestrale, che prima o poi tutti hanno durante la loro dita da informatici.

Produrre un file csv da una query.

Linguaggio C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace CreaFileCSV
{
    public partial class sql2CSV 
    {
        public SqlDataReader rs;
        string pathEsecuzione = "";
        string NomeFile = "";
        string sqlquery = "";
        public sql2CSV()
        {
           
        }

        

        private void ScriviFile()
        {
            string output = "";
            FileInfo miofile = new FileInfo(NomeFile);
            StreamReader sr ;
            sr = miofile.OpenText();
            while (sr.EndOfStream == false)
            {
                sqlquery = sr.ReadToEnd();
            }
            string separator = ";";
            string conn = @"Data Source=NOME_SERVER;Initial Catalog=NOME_DB;User Id=user1;Password=user1;";
            SqlConnection cn = new SqlConnection(conn);
            cn.Open();
            SqlCommand cm = new SqlCommand(sqlquery, cn);
            rs = cm.ExecuteReader();
            //INTESTAZIONE
            for (int i = 0; i < rs.FieldCount; i++)
            {
                output += rs.GetName(i) + separator;
            }
            output += Environment.NewLine;
            //RECORD
            while (rs.Read())
            {
                for (int i = 0; i < rs.FieldCount; i++)
                {
                    string p = rs.GetFieldType(i).ToString();
                    if (rs.GetFieldType(i).ToString().Contains("String"))
                        if (rs.IsDBNull(i))
                            output += separator;
                        else
                            output += rs.GetString(i) + separator;
                    else if (rs.GetFieldType(i).ToString().Contains("Decimal"))
                        output += rs.GetDecimal(i) + separator;
                    else if (rs.GetFieldType(i).ToString().Contains("Double"))
                        output += rs.GetDouble(i) + separator;
                    else
                        output += rs.GetInt32(i) + separator;
                }
                output += Environment.NewLine;
            }
            File.WriteAllText(pathEsecuzione, output.ToString());
        }

        
    }
}

Ovviamente il codice è altamente instabile, percui se qualcuno volesse segnalarmi errori, sarò ben lieto  di modificare il mio codice, secondo i vostri suggerimenti.


ATTENZIONE:
Sembra che tutto funzioni.... ma provate a compilarlo!!!
Ci sono dei pezzi di codice che definirei  imbarazzanti, per come sono scritti.


Si raccomando i lettori di seguire i link ipertestuali inseriti nel testo, per avere una panoramica piu esatta di cio che si sta parlando.