Beren.it

All that you can leave behind

Dynamic Data Entry - Un datepicker per le date

Personalizzare il controllo di editing delle date con i Dynamic Data Entity

Sappiamo tutti che uno dei formati di dato più pericolosi in assoluto è la data. Fondamentalmente perchè ognuno la scrive un pò come gli pare e piace con il problema che poi quando si va a scriverla sul DB ci possono essere spiacevoli sorprese. Nell'ambito dei Dynamic Data Entry di cui da un pò di post mi occupo per la notevole versatilità che hanno l'idea che più di tutte si è fatta largo nel mio ideale di applicazione è quella di consentirne l'inserimento e la modifica attraverso un datepicker. Dato che molti però, come il sottoscritto ;), non masticano molto JQuery magari ripiegare su una soluzione più semplice può essere di utilità ed in questo ci viene in aiuto l'Ajax Control Toolkit che potete scaricare gratuitamente qui.
Questo fantastico set di controlli oob Ajax contiene un buon Calenda Extender che fa al caso nostro. Scaricata infatti la dll ed inclusa come referenza del progetto potremo infatti usufruire di tale funzionalità.

Per implementare tale modifica dovremo dunque aprire la lista dei controlli ed, una volta individuato il controllo generico di Edit delle date aprirlo nell'editor.

Nella toolbox a sinistra selezionate il Calendar Extender e trascinatelo nel controllo a destra. Se nella toolbox a sinistra non doveste trovare il controllo significa che dovete semplicemente aggiungere la dll cliccando con in destro sulla toolbox quindi premendo "Choose items" ed infine nella finestra che si aprirà browsandola.

Una volta che avete trascinato l'extender all'interno del controllo, il gioco è praticamente fatto. Basterà infatti modificare le sue proprietà per ottenere l'effetto voluto:

  • TargetControlID: è l'ID del controllo che conterrà poi effettivamente la data che nel nostro caso è la textbox preesistente. In pratica con questa proprietà l'extender sa su quale controllo deve visualizzare il datepicker. Questa proprietà deve essere valorizzata altrimenti il datepicker non funzionerà.
  • Format: questa indica semplicemente il formato in cui verrà tradotta la data scelta nel date picker ed inserita nel controllo. Nel nostro caso nel classico formato che si usa in Italia.

Una volta concluso questo il gioco è fatto senza JQuery e con un effort ridicolo.

 

Dynamic Data Entity - Gridview Pager

Customizzare il controllo di paginazione del GridView nei Dynamic Data Entity

Una delle cose più scomode che mi è capitato di utilizzare con i Dynamic Data è il paginatore out of the box. O meglio, diciamo che la configurazione di default mi risultava davvero parecchio scomoda: avere il numero di righe di default visualizzate a 10. Troppo poche, specie se si ha uno schermo ad alta definizione e degli occhi buoni, si rischia di avere perennemente mezza pagina vuota.

Come fare allora? Mi metto a spulciare un pò il codice e mi accorgo che il tutto è assai più semplice di quanto si possa pensare. Infatti la modifica/personalizzazione interessa solamente 2 files:

  • GridViewPager.ascx è il controllo ascx che contiene la dropdown con i valori selezionabili di righe
  • List.aspx è il template di pagina di default che utilizza la gridview che viene visualizzata nelle pagine

La prima modifica in GridViewPager.ascx è opzionale nel senso che si possono cambiare i valori nella dropdown, aggiungerne di nuovi o toglierne a piacere. Il consiglio è quello di lasciare sempre il valore 10 che corrisponde al default della griglia come vedremo tra un pò. Ma in generale anche qui la libertà è massima.

Nel mio caso rimuoverò i valori 5 e 15 ed aggiungerò il 50, ma voi potete ovviamente fare come vi aggrada.
Fatto questo procediamo però con la modifica più importante cioè: dove cambiare il valore di default da quello scomodo 10 al più comodo 20? Semplicissimo: aprite il template di pagina List.aspx individuate il tag del GridView e tra gli attributi metteteci un bel PageSize=20. In questo modo:

Fatto questo con un seplice reload della pagina avrete personalizzato con facilità il numero di righe visualizzate nel paginatore della griglia. Ecco il risultato:

ASP.NET Ajax client-side framework failed to load

Errore ASP.NET Ajax client-side framework failed to load

Qualche giorno fa mi ero trovato a dover riconfigurare su una macchina nuova un'applicazione ASP.NET 4.0 che avevo inizialmente sviluppato su di un'altra. In pratica sulla vecchia macchina tutto funzionava a dovere, invece sulla nuova mi ritrovavo ad avere sempre in caricamento l'errore "ASP.NET Ajax client-side framework failed to load". In effetti tutto ciò che era Ajax nell'applicazione non funzionava più. Ho fatto così una serie di ricerche sul web ed ho trovato gli errori più assortiti e fantasiosi: da un problema al web.config, ad inserire codice custom nel routing dell'applicazione (è un app MVC) e infine modificare mille settaggi diversi in IIS. Tutto senza alcun esito.

Finalmente questa mattina mi imbatto in questo post che mi ha risolto tutti i problemi. In effetti come suggerisce il tipo, ho guardato sotto il site di IIS in cui gira l'applicazione e nella sezione Handler Mapping ho verificato che c'erano pochissime voci e nessuna su ASP.NET 4.0, di conseguenza ho fatto come consigliava lui cioè ho fatto un rerun del comando aspnet_regiis nella directory del Framework 4.0 (perchè a me lo dava con le applicazioni 4.0)

Una volta eseguita questa operazione magicamente negli Handler Mapping mi sono ritrovato tutte le voci mancanti (specie quelle su ASP.NET 4.0) e soprattutto l'errore ed i problemi ad esso correlati erano svaniti.

Smarrimento

Sei svanita
nel buio da cui sei venuta.
Hai lasciato poche tracce
e comunque sei stata brava a cancellarle,
Non mi so spiegare perchè
ancora una parte di me ti cerchi
in sogni malati
in cui persino una chat sembra la porta del paradiso.

Il senso di vuoto
nel petto
confonde il ricordo nel mito
ma senza spazio per la disperazione.

La memoria è il luogo del passato
dove prende vita il presente
e spesso, purtroppo anche il futuro.
Potrai cancellare la tua ma non certo la mia,
puoi solo annebbiarla, senza trarne guadagno alcuno
fuorchè il tuo stesso disprezzo.
Vorrei che potessi ascoltare questo grido,
perchè è la tua voce quella che sto usando.
E' la tua immagine ciò che ho nel cuore.

Forse le tante domande sospese hanno
una sola risposta con i piedi per terra,
ma sognare non costa niente quando
quando nulla hai da perdere perchè hai già perso tutto.

Rimango così afono e senza colore
nel quadro che il destino sta dipingendomi addosso
colmo solo di nulla e vuoto di te.

Ma il mio bisogno di te
è da te lontano
più di quanto il tuo cuore lo sia dalla tua mente
e dai tuoi piedi.
Niente può salvare dal tuo baratro i miei pensieri stanotte.
Nemmeno tu.

Growin On Me

I can't get rid of you
I don't know what to do
I don't even know who is growing on who
'Cos everywhere I go you're there
Can't get you out of my hair
Can't pretend that I don't care - it's not fair

I'm being punished for all my offences
I wanna touch you but I'm afraid of the consequences
I wanna banish you from whence you came
But you're part of me now
And I've only got myself to blame

You're really growing on me
(Or am I growing on you?)
You're really growing on me
(Or am I growing on you?)
Any fool can see

Sleeping in an empty bed
Can't get you off my head
I won't have a life until you're dead
Yes, you heard what I said

I wanna shake you off but you just won't go
And you're all over me but I don't want anyone to know
That you're attached to me, that's how you've grown
Won't you leave me, leave me alone

You're really growing on me
(Or am I growing on you?)
You're really growing on me
(Or am I growing on you?)
Any fool can see

You're really growing on me
(Or am I growing on you?)
You're really growing on me
(Or am I growing on you?)

Jumping into the fog

La hit dei The Wombats

Daccordo la nebbia in questo periodo non è cosa... ma questa spacca!

What a great achievement it was to get a hotel room this late
I bet they charge by the hour here
The kind of place where you should bring your own UV ray
It's not a big problem with me, love
You don't look that hygienic anyway
I'm only here because I want to twist the structure of my average day

We feel nothing so jump into the fog
You know that we hit the ground upright
We feel nothing so jump into the fog
I just hope it's your bones that shatter not mine
We feel nothing so jump into the fog
You know that we hit the ground upright
We feel nothing so jump into the fog

What a great achievement it was
To find someone who shirks such little self-restraint
I'm a non believer but I believe in these dirty little wicked games
Snakes and ladders abandoned here love
The climb's too rough to slide back down again
I'm only here because I feel the day deserves a truly sordid end

We feel nothing so jump into the fog
You know that we hit the ground upright
We feel nothing so jump into the fog
I just hope it's your brains that splatter not mine
We feel nothing so jump into the fog
You know that we hit the ground upright
We feel nothing so jump into the fog

I've made some bad decisions, I'll admit that freely
It's just that life tastes sweeter when it's wrapped in debauchery
So drop your map, drop your plans, drop that five-step program
Because there's not an ounce of faith in this leap
It's clear you feel nothing so jump into the fog with me

Jump in, jump in, jump in

Jump into the fog (repeat)

Replay

Qualche giorno fa ho comprato un vecchio CD di Samuele Bersani, in genere i suoi dischi li regalo. Questa volta il regalo me lo sono auto-fatto. La capacità che ha quell'uomo di saltare gli strati infiniti di pelle e corazza che foderano il mio cuore è stupefacente. Non c'è una parola che non ti rivolti come un calzino.

Replay è una di queste. Riesce a riconcigliarti con la tua vita, con i mille disastri combinati e le persone perse in tutti questi anni.

Dentro al replay
fra miliardi di altri ci sei
e non hai scia
luminosa d'auto
anche di periferia
come i sogni che farai
o prenderai a noleggio
quando ti addormenterai
con le scarpe sul letto
Dentro al replay
con la testa girata un po' in su
da fotografia
ci sei anche tu prima di andare via
"se rimango ancora qui
è come se morissi
e guardandomi allo specchio
ad un tratto sparissi"
Cadono le stelle e sono cieco
e dove cadono non so
cercherò, proverò, davvero
ad avere sempre su di me il profumo delle mani
riuscire a fare sogni tridimensionali
non chiedere mai niente al mondo
solo te
come una cosa che non c'è
cercando dappertutto anche in me
ti vedo
Dentro al replay
per un attimo c'ero e anche lei
ma in quel momento
qualcosa ho cancellato
si è fermato il tempo, la sua regolarità
e come se morissi
è sparita anche la luna,
è cominciata l'eclissi
Cadono le stelle
allora è vero
e io non so se ci sarò
dove andrò
non lo so se lo merito o no
se correggerò gli effetti dei miei guasti nucleari
se troverò il coraggio ti telefono domani
e più sarò lontano e più sarò da te
dimenticato e muto
come uno che non c'è
tornerò, tornerò davvero
a sentire su di me profumo delle mani
di notte io farò sogni tridimensionali
senza chiedere mai niente al mondo
neanche a te
senza chiedermi perché
ti vedo dappertutto
anche in me
ti vedo

E chissà che non riesca anch'io a correggere gli effetti dei miei guasti nucleari...

Una virgola che è un punto esclamativo

Conclusa la stagione 2010/11 della promozione di varese

Finalmente si è chiusa la stagione 2010/11 di promozione e, altrettanto finalmente, il Borsano è salvo. Purtroppo non sono bastate le 30 giornate regolari a salvarci con tutti i crismi, sono stati necessari altresì i playout per avere il lasciapassare definitivo alla prossima stagione. Playout fratricidi tra l'altro, se si pensa che abbiamo dovuto disputarli contro l'Ardor, altra squadra di busto con la qualse in regular-season avevamo un imbarazzante 0-2. Fortunatamente però il recupero di quasi tutte le defezioni ed un rinnovato spirito di gruppo ci hanno consentito di chiudere la serie sul 2-0 ribaltando immediatamente il fattore campo.

Dico finalmente, perchè questa, che per me è stata la 17ma stagione senior, è stata tra le più difficili e travagliate per i problemi fisici di vario genere che mi hanno afflitto oltre a quelli lavorativi che mi hanno condizionato la partecipazione agli allenamenti.
Tutto è bene ciò che finisce bene, si direbbe dunque. In realtà è proprio dall'atto conclusivo della stagione che vengono fuori elementi di riflessione. Nella gara conclusiva solo una virgola, unita a parecchio nervosismo e scarsa lucidità richiedono una riflessione sulla continuazione dell'attività. Forse ora è un pò presto per parlarne, ma al momento sono davvero indeciso sul dafarsi e certamente se la stagione riprendesse domani sarei più che deciso a mollare.

Rimandiamo dunque i cattivi pensieri e godiamoci questa salvezza combattuta sino alla fine. Chi vivrà vedrà!

CMS su SP2010 (parte 3) - Creazione Web Application

In questo post prenderemo confidenza con l'ambiente di Sharepoint 2010 e ad alcuni strumenti assai utili quando si deve lavorare in questo contesto. Non perderndo di mezzo quello che è il nostro obbiettivo, cioè un semplice CMS, cominciamo con l'aprire la Central Administration di SP2010. Per chi fosse un totale neofita di SP, la Central Administration è una Web Application a tutti gli effetti che consente di amministrare praticamente tutte le funzionalità e i settaggi di SP: una sorta di pannello di controllo di Windows, trasferito nel contesto di Sharepoint.

Per accedere ad essa è sufficiente premere start e ricercare sotto la Cartella dei programmi Sharepoint 2010 Products il link a Sharepoint 2010 Central Admin dopo pochi secondi una finestra del browser si aprirà e dopo aver inserito le credenziali di un utente amministratore (tipicamente quello della macchina) mostrerà proprio la web application di destinazione. Attenzione: sebbene Sharepoint 2010 quanto a browser compatibility è molto migliorato rispetto al predecessore, consiglio per di utilizzare IE 32bit (anche se la macchina che utilizzate è 64bit) per ragioni di compatibilità con alcuni controlli ActiveX che in alcuni casi vi porterebbero a perdere del tempo in fase di configurazione se utilizzati su altri browser.

Come già precisato la Central Administration è un pò il pannello di controllo di Sharepoint. Quindi l'interrogativo che resta ancora aperto è: dove e come creare la Web Application custom su cui far girare il CMS? Il nostro obbiettivo è infatti creare una Sharepoint Web Application, vale a dire un'applicazione Web che "viva" sotto il contesto di Sharepoint, cioè sia configurabile tramite la Central Admin e fruisca di tutte le funzionalità out-of-the-box di SP.
Per farlo si potrebbe semplicemente, acceddere al menu Application Management della Central Admin, ma noi invece utilizzeremo invece un tool molto potente che consente per altro un'astrazione e una robustezza considerevole soprattutto per quella che è considerata la fase di deploy. Il tool di cui sto parlando è PowerShell. L'unica accortezza che si chiede di prestare per utilizzarlo nel contesto di SP è di non aprire il classico link a PS che ad esempio si può trovare nella barra del desktop, ma quello più specifico al di sotto del menu degli Sharepoint Products. In effetti, questo PS si differisce da quell'altro per l'accesso amministrativo alle risorse di SP, che altrimenti potrebbero darvi numerosi problemi Access Denied e anche quello di fornire già tutte le funzionalità di SP senza doverle esplicitamente caricarle sostituendo di fatto l'obosleto STSADM.

Nella schermata che si aprirà, una shell a tutti gli effetti, andiamo dunque ad inserire una serie di parametri che ci torneranno utili nella creazione della web application. Partiamo innanzitutto dal comando che effettua l'operazione: New-SPWebApplication. Qui sotto sono invece riportati i parametri fondamentali che useremo a breve:

  • Name è il nome della web application
  • ApplicationPool è il nome dell'application pool che verrà creato in IIS e su cui girerà l'applicazione
  • ApplicationPoolAccount è il "managed account" con il quale girerà l'app pool
  • URL è l'url pubblico dell'applicazione
  • Port è la porta su cui girerà l'app
  • Database Name è il catalog di SQL Server che verrà creato per gestire l'applicazione da Sharepoint
  • Database Server è il nome dell'istanza di SQL Server su cui verrà generato il Catalog di cui sopra.

In realtà i parametri da utilizzare possono essere molti di più, ad esempio in questo caso utilizzero l'authentication di Windows, che è quella di default ma se volessimo utilizzare quella Claim Base dovremmo modificare alcune cose. In questa pagina di MSDN potete trovare tutto quello che vi serve anche sotto gli altri scenari possibili.
A questo punto lanciamo il batch dopo averlo customizzato :

$name = "Beren CMS"
$AppPool = "BerenCMSAppPool"
$url = "www.berencms.com"
$port = 9999
$AppPoolAccount = "XXX\Administrator"
$sp_webapp_databasename = "WSS_BerenCMS"
$sp_webapp_databaseserver = "XXX\Sharepoint"
New-SPWebApplication -Name $name -ApplicationPool $AppPool -port $port -url $url -ApplicationPoolAccount (Get-SPManagedAccount $AppPoolAccount) -DatabaseName $sp_webapp_databasename -DatabaseServer $sp_webapp_databaseserver

Purtroppo però, a meno che non abbiate già configurato un "managed Account" l'esito del batch sarà negativo:

In effetti l'errore: "No matching accounts were found" sembra indicare un problema con l'utente specificato per l'account dell'Application Pool. Dopo una breve googolata trovo che in effetti l'utente usato nell'application pool deve essere un "Managed Account". . Per creare un managed account occorre aprire la Central Admin, cliccare sulla sezione di Security e quindi Service Account.

Scorrendo la pagina clicchiamo sul link "Register new managed account" e quindi nella pagina che si aprirà introduciamo l'account che sopra abbiamo designato ad essere usato nell'Application Pool, quindi premiamo OK e quando torniamo alla pagina deglia account nella tendina troveremo anche l'account appena creato. Per maggior sicurezza lanciamo batch per verifica la bontà dell'operazione effettuata.

Ci siamo! Ora l'utente è risolto correttamente dal sistema e quindi possiamo rilanciare il primo batch di creazione della Web Application:

Nell'immagine qui sopra si può notare come al termine della creazione unbreve riepilogo mostrerà i dati della Web Application appena creata. Bene, ed ora? Abbiamo creato la Web Application ma se proviamo a raggiungerla attraverso l'url ci beccheremo un bel errore inquanto la webapplication in se per se è solo un involucro vuoto all'interno del quale va generata la SiteCollection ed in particolare il web Site che sta come root e dal quale discenderanno poi tutti i web site che possono servire. Nel prossimo post ci occuperemo della creazione della sitecollection.

Obama Bin Laden

Bin Laden? Ancora lui? Ucciso! Ma non era già morto? Da quanto, poi, non si faceva vedere? Mah... Onestamente questa settimana mi è sembrato di assistere ad uno spettacolo posticcio. Obama che dice "Il mondo da oggi è migliore!". Ma gli ha dato di volte il cervello? "Di che diavolo parla", mi è venuto da dire. Ma soprattutto in che mondo sconclusionato e depravato ci ritroviamo? Obama sembrava almeno un pochino diverso ed invece questa settimana mi è sembrato davvero la copia "abbronzata" del suo predecessore guerrafondaio.
False foto del cadavere. Il balletto, "mostriamo quelle vere", "no meglio di no". Il corpo? "Lo abbiamo buttato a mare per evitare ne facessero un mausoleo del male".
Ma è mai possibile che ci credano stupidi a tal punto?

Così, a dieci anni dalle torri gemelle, quando anche Al Qaeda è stata praticamente travolta, sorpassata, asfaltata dai moti di libertà del Maghreb, ma non solo, la Syria ne è un esempio, si ritorna a combattere lo stesso nemico invisibile di sempre. Invece di darci le prove sugli attentati, spiegazioni ad esempio su quello al Pentagono che ancora sembra più una pessima rappresentazione che un vero attentato. Invece di darci le prove sulle "armi chimiche di Saddam", invece di spiegarci questo "Bin Laden" da dove venga esattamente. Ci dicono tutti tronfi: "abbiamo vinto, il bene trionfa!".

God bless America!