Concatenare Stringhe e Date in un campo calcolato di Sharepoint

Posted 24. giugno 2009 12.40 in Informatica

Oggi in una mia custom List di MOSS 2007 dovevo creare un campo calcolato che fosse la concatenazione di Titolo e Data.

Primo problema: come si chiamerà la funzione che converte una data in una stringa ? Un rapida ricerca mi porta a scoprire che si chiama TEXT() e ha il formato

TEXT (value, format)

come <sarcastic mode="On">BEN</sarcastic> descritto qui
http://office.microsoft.com/en-us/sharepointserver/HA011610831033.aspx

Provo quindi a fare [Title] & " del " & TEXT([Data], "dd/mm/yyyy") e mi becco un errore:

The formula contains a syntax error or is not supported.

Pensando che fosse un problema di come formattavo la data (ed in effetti il format giusto è "dd/MM/yyyy" perchè mm minuscolo sono i minuti) le ho provate tutte... alla fine pensando a come scrivo le formule in Excel ho tentato un

TEXT (value; format)

con il ; invece della virgola tra i due parametri della funzione ed è andata ! Qualche santo è venuto giù...

ZooPlus.it ottimi acquisti per gli amici a quattro zampe

Posted 23. giugno 2009 14.32 in Misc

Visto che ogni tanto mi lamento degli acquisti su Internet, mi sembra giusto testimoniare anche le cose positive.

Dato che la nostra gatta non sa dosarsi le razioni di cibo (se non ci siamo tutto il giorno, alle 8.01 lei finirebbe tutta la razione giornaliera), abbiamo deciso di comprare un distributore automatico; la scelta era caduta su quelle ciotole a 4 scomparti programmabili da fare aprire a orari preimpostati e addirittura con la possibilità di registrare un messaggio vocale di chiamata ("Cleo... è pronto in tavola ciotola....").

Rapida visita nel negozio dove solitamente Silvia si rifornisce (evitando le marche non etiche come ben consigliato da Illy) e il negoziante spara "costa circa 60 euro e ci vogliono DUE SETTIMANE finchè passa il rappresentante per fare l'ordine, più un'altra per la consegna..."

Nel 2009 aspettiamo il rappresentante per ordinare qualcosa ?? Magari dopo mandiamo anche un piccione al posto del fax (visto che è un negozio di animali) ??! Tralascio i miei commenti e ci mettiamo a cercare su internet dove troviamo ben presto questo ZooPlus.it sembra fare al caso nostro: la ciotola è disponibile, a 39.90 invece che 60 con le spese di spedizione gratuite e uno sconto come "bonus di benvenuto" di 4 euro. Ordianiamo il lunedi sera e il giovedi mattina il corriere è sulla porta (la società è germanica quindi le spedizioni partono da lì).

Totale: 25 euro e 18 giorni risparmiati, altri buoni sconti per successivi acquisti e nessun rimorso se "il piccolo negozio sotto casa" soccomberà all'e-commerce...

PS per una gatta così informatica un gadget tecnologico era quello che ci voleva :-)

 

Notte delle cantine: buon vino e High ISO test

Posted 14. giugno 2009 18.09 in Fotografia

Ieri sera si è tenuta la Notte delle Cantine 2009, evento organizzato dall'Associazione Südtiroler Weinstrasse/Strada del Vino che ha visto 31 cantine della zona tra Terlano e Salorno tenere le porte aperte per una visita e una degustazione dei loro prodotti.

Con il cugino Giampaolo e amorevolmente seguiti dalle rispettive consorti (che hanno salvato i nostri punti patente) abbiamo fatto tappa a Termeno (cantine Hofstätter e Elena Walch), Caldaro (Erste & Neue con la sua bellissima cantina Puntay), Colterenzio/Cornaiano (Cantine Produttori Colterenzio) e ovviamente San Michele/Appiano (Cantina San Michele) a pochi passi da casa mia.

Per quanto riguarda l'aspetto enologico nulla di nuovo...mi sono concentrato sui bianchi (che prediligo rispetto ai rossi) cercando di mettere a frutto ciò che ho appreso ad un recente corso/seminario sui Gewürztraminer. I bianchi altoatesini sono sempre più rinomati e apprezzati anche all'estero e la strada seguita dai produttori in questi ultimi lustri (produzione di bassa quantità e alta qualità) sta dando i suoi frutti. Le visite alle cantine stile "porte aperte" sono state molto interessanti anche se nessuna mostrava le linee di produzione e imbottigliamento ma solo le cantine di stoccaggio nelle barrique o nei silos d'acciaio.

Le degustazioni si dividevano in chi faceva pagare un forfait (la cosa migliore), chi proponeva assaggi (solitamente a 1 euro l'uno, anche questa un'ottima formula) e chi bicchieri interi (da 2 a 3,5 euro). L'unica pecca secondo me era la mancanza assoluta di grissini o altro genere commestibile da abbinare agli assaggi: avrei preferito spendere qualche cosa in più ma avere a disposizione appunto uno spuntino e magari anche dell'acqua con cui sciacquare il palato.

L'evento è stato poi anche l'occasione per testare a fondo le capacità della mia Canon 5DII di lavorare ad alti ISO e di capire come si comportava in condizioni critiche. Ho scelto di escludere sia l'uso del flash, che anche del treppiedi, quindi il test field era di lavorare in condizioni spesso di quasi buio con tempi abbastanza rapidi da escludere mossi (ho sempre scattato a mano libera) e diaframmi ahimè non apertissimi (sul 24-105 e 17-40 il minimo è f4, mentre col 50 fisso ho potuto scendere molto di più fino a f1,4).

Diciamolo subito: miracoli non ne ho visti. Molti scatti sono a 3200 ISO e di rumore ce n'è ancora a pacchi. C'è da dire che io scatto esclusivamente in RAW e che sviluppo in Lightroom 2.3, condizione che non è tra le migliori nel campo del Noise Reduction (NR). Usando infatti DPP di Canon o altri plug-in commerciali come Noise Ninja, Neatimage, Dfine o Noiseware (qui un bel confronto con incluso ACR) si otterrebbero risultati sicuramente migliori.

Ma visto che non è mia intenzione modificare il mio workflow, penso che la prossima volta che mi capiterà di scattare in condizioni simili, applicherò un banale trucco: scattare in RAW+JPEG ! Il Jpeg prodotto dalla macchina infatti ha molto meno rumore del RAW con il quale tra l'altro (non molti lo sanno) NON viene applicata la Custom Function II High Iso Speed Noise Reduction qualunque sia la sua impostazione (Standard, Bassa, Alta).

Nonostante ciò non è che possa dirmi completamente deluso dai risultati. Con le vecchie analogiche non oso neppure pensare cosa sarebbe venuto fuori, idem con le mie vecchie 300D e 30D dove già a 400 ISO il rumore era maggiore. Mi fa solo incazzare Canon per il fatto che se invece di inutili 21 megapixel ne avessero tenuti 12 o al massimo 15 chissà che migliorìe si sarebbero viste...

Il punto finale comunque è che le foto le ho portate a casa, mi sono divertito e avendo la possibilità di scattare ho avuto meno tempo per bere, e il mio fegato ringrazia :-)

Inner join con due o piú campi in Linq to Sql

Posted 10. giugno 2009 09.47 in Informatica

Visto che dalle statistiche questo post sulla Left Outer Join in Linq to Sql è uno dei più letti, ne posto un altro sulla inner join a due o più condizioni (che piú che altro serve a me come reminder in futuro).

Supponiamo di avere una tabella fornitori la cui chiave sia Società+Codice e di volerla "joinare" (bleahh) con un'altra che ha la stessa chiave. Visto che la sintassi join...in...on...equals di C# 3.0 non permette l'utilizzo dell' && (and) seconda condizione si usa il "trucco" di confrontare due anonymous type uguali, ovvero:

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { s.idCompany, s.idSupplier } equals new { j.idCompany, j.idSupplier }
   select new {  j.SupplierName, s.QualifyStartDate };

Purtroppo non sempre i campi nelle due tabelle si chiamano uguali e dato che i 2 anonymous type devono invece esserlo, se non vogliamo beccarci un eccezione del tipo "the type of one of the expressions in the join clause is incorrect.  type inference failed in the call to 'join'." dobbiamo usare degli alias

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { SOC = s.idCompany, CODE = s.idSupplier } equals new { SOC = j.ErpSoc, CODE = j.ErpCode }
   select new {  j.SupplierName, s.QualifyStartDate };

Infine se nel DB i campi non sono dello stesso tipo (come era il mio caso in cui Suppliers veniva da una tabella Oracle del gestionale e SupplierInfos da una mia tabella SqlServer) bisogna castarli per renderli omogenei.

var query = from s in db.SupplierInfos
   join j in db.Suppliers on
    new { SOC = (char)s.idCompany, CODE = (int)s.idSupplier} equals new { SOC = (char)j.ErpSoc, CODE = (int)j.ErpCode }
   select new {  j.SupplierName, s.QualifyStartDate };

Leggere con ADO.NET colonne Excel miste numeri e testo

Posted 2. giugno 2009 11.45 in Informatica

Fin dai tempi dei primi DTS (Sql Server 7.0) ho sempre avuto rogne quando dovevo importare in Sql Server dati da Excel in cui nella stessa colonna ci fossero dati numerici e alfanumerici. L'esempio classico è quello del CAP in cui ci sono numeri (39100) ma anche informazioni testuali ("00100"). Se Excel pensa che la colonna sia di tipo numerico, tutti i dati di tipo stringa che poi lui incontrerà saranno considerati come "vuoti".

La stessa cosa succede se aprite un file excel in Ado.Net tramite un OleDb Provider per riempire una datatable e scorrerla (il problema non ho capito se sia di ado.net o di Jet). In questi giorni dovevo fare un programmino ad un amico importando una colonna "Taglia" che aveva la maggior parte delle informazioni numeriche (38, 39, 40, ecc) ma ogni tanto un "S", "XL", ecc. Ebbene quelle taglie di tipo stringa non c'era verso di fargliele leggere.

Il comportamento (non ho capito se di Jet o del provider ado.net) è infatti quello di scorrere le prime (per default 8) righe del foglio excel e cercare di desumere da quelle il tipo del campo. Uno penserà "metto in cima le taglie alfanumeriche e sono a posto..." nossignori, perchè viene fatta comunque una statistica sulla maggioranza dei dati, e quindi se la maggior parte dei dati sono numeri, lui si impunta a considerare la colonna come numerica.

Il primo workaround che si trova googlando è di aggiungere un IMEX=1 alle Extended Proprieties della stringa di connessione quando creiamo la OleDbConnection. Innanzittutto occhio a mettere tra apici (singoli o doppi) tutte la parte di extended properties, perchè altrimenti vi beccate una bella eccezione "Could not find installable ISAM" (e già capire la causa di questo ti fa perdere il paradiso)

Quindi:
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pippo.xls;Extended Properties='Excel 8.0;HDR=YES;IMEX=1;'";
oppure
string conn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Pippo.xls;Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";

Purtroppo però molto spesso questo non basta. Per aumentare le possibilità di avere il comportamento che ci aspettiamo (nel mio caso considerare la colonna di tipo stringa), dobbiamo cambiare due chiavi di registro e più precisamente:

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/ImportMixedTypes 

che può avere i valori "Majority Type" (che è il default e desume il tipo dalla maggioranza dei dati) o "Text" che è quello da settare se si vuole forzare il tipo.

Hkey_Local_Machine/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows

invece è un numero da 0 a 16 che indica quante righe all'inizio scansionare per determinare il tipo (quel 8 di cui parlavo all'inizio); mettendo 0 si indica di considerare le prime 16384 righe dove si spera che troveremo il primo dato testuale. Se per sfiga la prima taglia "XL" la trovassimo dopo 16385 righe sarei stato fregato.

Riassumendo; con queste impostazioni ho risolto i miei problemi
IMEX=1
ImportMixedTypes = Text
TypeGuessRows=0

Se peró volessi mettere la mia pagina che importa i dati su uno shared host ?? Non penso che Aruba (tanto per fare un nome) sia molto propensa a cambiare delle chiavi di registro solo per me...

(fonte: Joe Morrison ; potevo solo linkare il post ma non si sa mai che scompaia...)

DevCon 2009: squarci di Azure nelle clouds del mondo dev

Posted 1. giugno 2009 11.24 in Informatica

Anche quest'anno ho partecipato con molto piacere all'edizione 2009 di DevCon, conferenza tecnologica tenuta dai 4 amici di DevLeap. Paolo, Marco, Rob e Luca si sono dimostrati ancora una volta super professionali e molto preparati e seguire le loro sessioni è sempre un piacere perché difficilmente ti annoi e le demo funzionano sempre alla perfezione (cosa che non si può dire dell'ospite esterno che ha tenuto due sessioni un po' noiosette; a confermare che essere un buon speaker non è da tutti).

La prima giornata sull'architettura di una applicazione non ha riservato molte sorprese. Avendo sviluppato progetti con loro e seguendoli da molti anni, forse quella sessione saprei farla anche io :-) Certo, spaventa vedere come ogni anno il numero di progetti della solution del loro Estate Management aumenta (siamo arrivati a 85), ma posso senz'altro testimoniare che dividere un progetto nei vari strati come insegnano da tempo ha un senso e alla fine ripaga (e poi "siamo pagati per scrivere codice", cit. A.Sponza)

Ero molto curioso di saperne di più di qualche novità del futuro .Net Framework 4.0 e sono rimasto abbastanza sorpreso nel vedere che grossissime news non ce ne sono. Se il 2.0 ci aveva portato i generics e un rivoluzionario asp.net, il 3.0 mostri sacri come WPF e WCF e il 3.5 quella figata che è LINQ, non mi sembra di scorgere tra le novità del 4.0 qualcosa che "rivoluziona" il modo di programmare. Tanto meglio per gli ex-colleghi dev (per chi non lo sapesse lo sviluppo non è più il mio core business) che avranno un po' di tempo per consolidare le tecnologie attuali.

Parlando di Linq, era notizia risaputa che uno dei suoi flavour più famosi (Linq to Sql) è stato condannato se non a morte almeno a "ibernazione"; ci sarà ancora in VS2010, verrà supportato e fixato ma non sviluppato ulteriormente. Il tutto a scapito del suo fratellone maggiore Linq to Entities o meglio di Entity Framework. Devo dire che mi dispiace, perché lo ho usato abbastanza a fondo e se non perfetto è comunque un qualcosa che mi ha risolto e facilitato la scrittura di molto codice. Come ha mostrato Marco le prestazioni sono tutt'altro che scadenti; certo le prende da codice ADO.NET scritto a scalpellino, ma bisogna considerare i valori assoluti. Se mi fa 1000 transazioni al sec. invece che 10.000 di ado.net e lo uso in una intranet di 30 persone dove 1000 transazioni le facciamo a settimana :-), va più che bene. Ho paura che molti si butteranno su EF con il risultato di sparare a una mosca con un cannone. Io per i miei progetti che usano Sql CE Desktop continuerò sicuramente a usarlo.

Per la parte client ho seguito una sessione di WPF e due di Silverlight; non ci sono più dubbi che Wpf e Xaml bisogna impararli prima possibile. Windows Form è morto e chi vuole sviluppare client win32 deve per forza buttarsi su questa tecnologia che come dice Luca "è per molti ma non per tutti...". Preoccupa un po' sentire che VS2010 non ha un editor ancora all'altezza (ma c'é Blend 3 per fortuna) ma soprattutto che bisogna farsi il mazzo tanto e prepararsi a un lungo percorso di training in salita...

Sul fronte delle Applicazioni per il Web sta accadendo un qualcosa che era lecito aspettarsi: una super specializzazione degli skill necessari non solo tra la parte client (html, css, javascript, jQuery, Ajax) e quella server, ma addirittura all'interno di una stessa famiglia di tecnologie della stessa casa. Già era impossibile essere onniscenti tra Asp.Net, Php, Jsp, ecc. ma oggi solo nel mondo asp.net Microsoft abbiamo almeno 4 tecnologie (asp.net Webform, MVC, Ajax e se vogliamo i Dynamic Data) con le quali scrivere applicazioni e che è ovvio non possono essere conosciute tutte allo stesso livello. Almeno capire quale è opportuno usare di volta in volta dovrebbe però essere il minimo per un buon dev o architect. Lo spostamento verso il client (browser) di molte di queste tecnologie (pensiamo solo all'adozione "ufficiale" di jQuery all'interno di Asp.Net 4.0) fa però pensare. Se l'anno scorso l'affermazione di Luca e Rob "buttatevi su Silverlight" pareva un po' forte e rischiosa, oggi mi sento di condividerla al 100%. I pezzi di scotch che stiamo attaccando a browser, http, e compagnia bella non so quanto possano durare ancora. Ogni tanto ci vorrebbe un po' di coraggio e qualche bel colpo di spugna.

Sugli Ado.Net Data Service (aka Astoria, aka "merdoni" :-) ) posso solo riportare qualche esperienza fatta dagli altri: lasciateli dove sono e con un po' di impegno in piú usiamo WCF. A me, da quello che ho visto, hanno dato l'impressione di quelle cose che MS ogni tanto fa ma non si capisce bene perchè; mi hanno ricordato l'interrogazione di SQL Server via browser (con le select scritte nelle Url !!)... belle in demo, ma poi quanti lo usano ? 

Lo sviluppo in the clouds e la piattaforma Azure erano tra gli argomenti che piú mi incuriosivano. Per chi non sapesse di cosa si tratti, in parole povere si tratta di mettere le proprie applicazioni su un hosting remoto -così come facciamo da anni con i siti web- supportati però da una piattaforma (hardware, sistema operativo, virtualizzazione, supporto tecnico, ecc.) che ci libera da un sacco di preoccupazioni e possibili problemi. A me sembra una figata colossale, fossi un sistemista mi preoccuperei un po' di più :-) perchè ovviamente se ne va gran parte del suo lavoro, ma vuoi mettere demandare ad altri i problemi di scalablità, security, fault tolereance, backup, availibility 24/7/365 ??! Il mio unico dubbio riguarda la mentalità dei nostri imprenditori o manager... sento giá i commenti del tipo "io mettere la MIA contabilità o il mio business fuori dalle mie mura, magari non sapendo neanche in che paese, a disposizione di altri ??". A parte che 20/25 anni fa quando ho iniziato a lavorare in questo mondo questo era per molte aziende la normalità (il CED con mainframe in outsourcing... cosa cambia se i Km di distanza sono 10000 invece che 10 e se le linee sono dorsali Gbit invece che CDN a 19,2k ??), ma poi io avrei molto piú paura di un dipendente insoddisfatto che con una chiavetta mi può rubare tutto che non dei dipendenti di un centro che gestisce migliaia di clienti come me.

Purtroppo la concomitanza di altre sessioni mi ha impedito di seguirne altre 3 su future tecnologie sicuramente interessanti: l'Identity Framework Geneva (anche se ormai dopo Passport, Card Space e altri tentativi non ci metterei la mano sul fuoco che sia la volta buona), la piattaforma per lo sviluppo model-driven Oslo, e infine Dublin, l'application server per ospitare Workflow.  Ma sono sicuro che a DevCon 2010 se ne riparlerà...

PS ma la cosa piú entusiasmante di questa conferenza è stato essere per 3 giorni un dipendente della piú grande sw-house che uno possa sognare :-)