giovedì 19 aprile 2012

Debug remoto con visual studio 2005 - 2008 - 2010 -- " No symbols have been loaded for this document "

Vi è mai capitato di eseguire un debug di un'applicazione installata su di un altra macchina che non sia la vostra di dev?? Penso che sia capitato a tutti! Non è un'operazione complicata MSDN ha una guida abbastanza dettagliata su tutto ciò che ci serve per iniziare : http://msdn.microsoft.com/it-it/library/bt727f1t(v=vs.100).aspx  . Aggiungo solo un piccolo link che può essere utile: http://www.microsoft.com/download/en/details.aspx?id=475 è il link delle componenti di debug remoto in formato msi; decisamente più comodo che cercare nelle directory di visual studio i componenti necessari.

In questo post non mi soffermerò su come eseguire il debug remoto ma sull'errore più comune che può capitare eseguendolo.

Generalmente presi dalla disperazione stiamo usando il debugger in no authentication mode e finalmente vediamo l'elenco dei processi che stanno girando sulla macchina da debuggare; agganciamo quello che ci serve ed ecco che appena proviamo a mettere un break point appare il fatidico:  "No symbols have been loaded for this document". Evitate di perdere tempo a provare a caricare i simboli a mano; la soluzione seppur poco documentata è semplice: dovete ricreare un ambiente di debug remoto che vi permetta di utilizzare il transport di tipo Default. Spiego passo passo

Debuggare codice managed su una macchina remota: 

  1. Controllare di avere pubblicato anche il file pdb che contiene i simboli di debug insieme al file che contiene il processo da debuggare (basta compilare in modalità debug ed i simboli saranno generati automaticamente).
  2. Mettere se possibile la macchina remota a dominio
  3. Inserire il proprio utente tra gli utenti della macchina remota nel gruppo administrator
  4. Eseguire remote debug monitor sulla macchina remota e, cliccando su options, settare i permessi necessari alla connessione dell'utente remoto che effettuerà il debug
  5. Dalla macchina di dev, una volta cliccato Debug --> Attach process, inserire l'indirizzo del server di debug remoto che generalmente è nel seguente formato DOMINIO\UTENTE@NOMEPC
  6. Selezionare il processo che vogliamo debuggare ed iniziare il debug
E' molto importante utilizzare l'autenticazione di windows e non selezionare "No Authentication (native only)" in quanto essendo i simboli di debug pdb sulla macchina remota questi devono essere accessibili da un utente con i permessi di lettura sulla cartella che contiene il processo da debuggare.

Se selezionerete No Authentication potrete solo debuggare il codice usando il decompiler e a meno che non vi piaccia decodificarvi il binario non la vedo una buona idea!!


giovedì 3 novembre 2011

Installare un NAT usando IpTables e Ubuntu Server

Ciao, esco momentaneamente dal mondo .NET per fare un salto su linux. Mi è capitato di dover installare un NAT per gestire una rete di macchine virtuali su ambiente linux, passato lo spavento iniziale (sono sistemista MS), mi sono buttato su Ubuntu Server e dopo un po di litigi con i settaggi del raid software e del bootloader (ne parlerò in un altro post) avevo il mio server OpenSSH installato e funzionante! A questo punto è tutto semplicissimo! Vediamo i 4 passaggi necessari a creare il NAT:

  • Configurazione delle schede di rete

Innanzitutto ci servono 2 schede di rete, la prima eth0 sarà collegata alla rete interna, la seconda eth1 al modem o al dispositivo che ci connette a internet. Eseguendo il seguente comando modificate il file interfaces in modo che sia simile alla configurazione sottostante.

sudo nano /etc/network/interfaces

# The loopback network interface
auto lo
iface lo inet loopback
 # The primary network interface
auto eth0
iface eth0 inet static
address 15.13.11.5 #indirizzo del Nat sulla rete locale
netmask 255.255.255.0
broadcast 15.13.11.255
# Secondary network interface
auto eth1
iface eth1 inet static
address 192.168.1.2 #indirizzo del Nat sulla rete del modem
gateway 192.168.1.1 #indirizzo del modem
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255

  • Configurazione di IpTables

Ora tramite questi due comandi abilitiamo la funzionalità di NAT di IpTables
sudo iptables -P FORWARD ACCEPT
sudo iptables --table nat -A POSTROUTING -o eth1 -j MASQUERADE
ricordo che la porta eth1 è quella collegata al modem !

  • Salvataggio configurazione in modo che venga eseguita ad ogni riavvio
IpTables al riavvio del pc non salva la sua configurazione quindi il nat non funzionerebbe per salvare le modifiche aggiungiamo i comandi precedenti al file "/etc/rc.local"
sudo nano /etc/rc.local 
ed a fine file inseriamo i comandi al punto precedente
  • Apertura porte sul Nat
Per redirigere il traffico da un indirizzo esterno su di una macchina all'interno della rete locale usiamo il port forwarding, in iptables basta eseguire questo comando:
sudo iptables -t nat -A PREROUTING -p tcp -i eth1  --dport 8446 -j DNAT --to x.x.x.x:8446
in questo esempio abbiamo inviato il traffico che arriva dalla porta esterna 8446 sull'indirizzo x.x.x.x alla porta 8446

Questo è tutto! Alla prossima!

martedì 25 ottobre 2011

CSS3 Gradients (parte II)

Si torna a parlare di gradienti CSS3, e in questa occasione vi propongo due "hack" per avere soluzioni alternative o simili in Internet Explorer.
Nel primo articolo sui gradienti di CSS3 vi ho mostrato la sintassi per i browser che hanno piena compatibilità con i CSS-gradients:
.gradient-background {
   /* fallback */
   background-color: #333;
   background-image: url(images/gradient-background.png); 
   /* Safari 4+, Chrome 1+ */
   background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#333), to(#999));
   /* Safari 5.1+, Chrome 10+ */
   background-image: -webkit-linear-gradient(#333, #999); 
   /* Firefox 3.6+ */
   background-image: -moz-linear-gradient(#333, #999);
   /* Opera 11.10+ */
   background-image: -o-linear-gradient(#333, #999);
}
Come ci fa sapere When can I use..., Internet Explorer inizierà a supportare la proprietà dalla versione 10 (disponibile in versione beta), sempre con un prefisso (-ms), come funziona ora per gli altri major browser. Nel frattempo, da IE5.5 in avanti, si possono utilizzare i soliti filtri propriertari, che però potrebbero non renderizzare bene in quanto spesso vanno in conflitto con altre proprietà (come i bordi arrotondati, provare per credere).
.gradient-background {
   /* IE 5.5+ */
   filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#333333', EndColorStr='#999999'); /* IE6–IE9 */
   ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#333333', EndColorStr='#999999'); /* IE7 */
}
Questa soluzione è molto annoying (fastidiosa?), per cui ho cercato un modo diverso per avere lo stesso effetto, o quasi, e che sia compatibile con anche le altre versioni.
.gradient-background {
   /* IE 9+ */
   box-shadow:inset 0 50px 100px #000;
}
Se tutto va bene, con Internet Explorer 9+ dovreste vedere una sfumatura simile a quella vista sugli altri browser. Non è lo stesso effetto, ma qualcosa di simile, un "hack" a tutti gli effetti. Questa soluzione però è molto utile quando si deve fare un bottone, magari con i bordi arrotondati, dove il risultato si vede con uno style "eye candy".

lunedì 24 ottobre 2011

Geolocalizzazione HTML5 - Precisione e refresh della posizione

Continuando con i post sulla geolocalizzazione, spiegherò come utilizzare le interfacce stabilite dal W3C nelle specifiche HTML5 sulla precisione e sul refresh della posizione in caso di utilizzatori in movimento.
Entrambe le specifiche sono passate come parametro alla chiamata del metodo .getPosition
riportiamo le specifiche W3C
   void getCurrentPosition(in PositionCallback successCallback,
                           in optional PositionErrorCallback errorCallback,
                           in optional PositionOptions options);
ed andiamo ad analizzare il parametro PositionOptions
da specifiche questo è formato da tre proprietà:
  boolean enableHighAccuracy;
  long timeout;
  long maximumAge;

Proviamo a descriverle:

enableHighAccuracy Si occupa di richiedere al dispositivo di attivare il sistema di geolocalizzazione più preciso presente(generalmente GPS)
timeout Indica il tempo massimo(in millisecondi) di attesa tra la chiamata js e la ricezione della posizione nel caso in cui questo tempo venga superato viene generato un errore di tipo TIMEOUT
maximumAge Indica la validità di una posizione in millisecondi prima che parta una nuova richiesta verso il dispositivo; questo parametro può essere comodo nel caso di sistemi di navigazione.

Ricordatevi che HTML5 non è ancora uno standard quindi non tutte le funzionalità qui descritte potrebbero essere disponibilit in tutti i browser!

Geolocalizzazione con Modernizr !

In questo post descrivo come è semplice attivare la geolocalizzazione tramite la libreria Modernizr

il tutto inizia con questa chiamata
if (Modernizr.geolocation) {
  navigator.geolocation.getCurrentPosition(showCurrentLocation,errorHandler);
}
else {
  alert("Your Browser does not support GeoLocation.");
}

in questo modo Modernizr controlla se il nostro browser supporta la geolocalizzazione. Ora basta creare una funzione di callback per stampare la nostra posizione. Nello specifico ho utilizzato jquery per impostare il valore di due span e stamparvi le coordinate.
    function showCurrentLocation(position) {
        latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
        $("#latitude").text("  "+position.coords.latitude);
        $("#longitude").text(" "+position.coords.longitude);
    }
    function errorHandler(error) {
        alert("Errore nel recuperare la posizione codice: " + error.code + ",Descrizione: " + error.message);
    }

Salvare lo stato di jqueryui sortable

Ciao a tutti! Dopo un sacco di tempo torno a pubblicare articoli!!! In questo post parlerò di come serializzare e deserializzare lato server un controllo <ul><li> gestito tramite il plugin di jquery UI Sortable.
Questo plugin serve per rendere ordinabili degli elementi all'interno di un elenco sfruttando il drag and drop; il problema principale è che l'ordinamento avviene tramite Javascript e quindi lato client. Per mantenere le modifiche lato server e salvarle su di un database ci serviremo dell'evento update di sortable http://jqueryui.com/demos/sortable/ che ci permetterà tramite una chiamata ajax di mandare l'ordine degli elementi al server.
Iniziamo con la definizione di una classe di base (per comodità ho usato entityframework) e del controller mvc che si occuperà della gestione della chiamata ajax:
public class Sortable{
public int id{get;set;}
public int position {get;set;}
public string text {get;set;}
}


Create il seguente metodo nel controller che preferite nel mio esempio sarà dentro ad HomeController
public void SetData(string pages){
            var context = new Entities();
            var rows=pages.Split("&".ToCharArray());
            int count = 1;
            foreach (string row in rows)
            {
                int id = Convert.ToInt32(row.Split("=".ToCharArray())[1]);
                var data = (from c in context.Sortables where c.id == id select c).Single();
                data.position = count;
                context.SaveChanges();
                count++;
            }
        }

Questo codice si occupa di deserializzare la stringa passata come parametro post; il parametro pages ha un formato simile al seguente :"page[]=1&page[]=2" il nostro deserializzatore non farà altro che splittare la stringa in parti page[]=id  in modo che con un succesivo split riusciremo ad avere l'id dell'elemento che compone l'elenco ed ad aggiornarne la posizione sul database tramite questa parte di codice che sfrutta linq to entities
int count = 1;
            foreach (string row in rows)
            {
                int id = Convert.ToInt32(row.Split("=".ToCharArray())[1]);
                var data = (from c in context.Sortables where c.id == id select c).Single();
                data.position = count;
                context.SaveChanges();
                count++;
            }
nell'esempio ho usato la variabile count per tenere traccia della posizione attuale dell'elemento.
Passiamo ora alla parte jquery - client
Per generare l'elenco utilizzerò un ViewData riempito con una lista di oggetti chiamati Sortable che vengono generati dal seguente metodo del controller Home
public ActionResult Index()
        {
            var context = new Entities();
            var data = (from c in context.Sortables select c ).OrderBy(c=>c.position).ToList();
            ViewData["data"] = data;
            return View();
        }
Adesso che abbiamo i dati, soffermiamoci sulla parte di generazione del nostro elenco tramite razor engine e capiamo in che posizione viene messo l'id dell'elemento recuperato dal database:
    @foreach (SortableDiv.Models.Sortable itm in List)ViewData["data"]) {

  • X@itm.id
  • }

Segue infine la parte di jquery che si occupa di applicare il metodo sortable
         $('.sortable').sortable({
             handle: 'span',
             opacity: '0.6',
             update: function(event, ui) {
                 $.post("Home/SetData", { pages: $('#Ul1').sortable('serialize') }); 
                    }

         });

la parte che ci interessa per questo post è la seguente
update: function(event, ui) {
 $.post("Home/SetData", { pages: $('#Ul1').sortable('serialize') }); 
}
nello specifico la chiamata a .sortable('serialize') che genera la stringa di cui abbiamo parlato in precedenza

lunedì 27 giugno 2011

CSS3 gradients

Back in the time of Web 2.0, everyone was amazed by the trends of using gradients.
Now, instead of using images, we can use CSS3 to create backgrounds (and not only! just wait and see).
The gradient at the left can be achieved by the following declaration:
.gradient-background {
   /* fallback */
   background-color: #333;
   background-image: url(images/gradient-background.png); 
   /* Safari 4+, Chrome 1+ */
   background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#333), to(#999));
   /* Safari 5.1+, Chrome 10+ */
   background-image: -webkit-linear-gradient(#333, #999); 
   /* Firefox 3.6+ */
   background-image: -moz-linear-gradient(#333, #999);
   /* Opera 11.10+ */
   background-image: -o-linear-gradient(#333, #999);
}
There are some problems with Internet Explorer, of course, but we can use filters and other options to make it work (there's a fallback image in that case anyway).
If you are looking for a fast answer, I send you to the Ultimate CSS gradient generator; if you are looking for a full guide, then go to the CSS-Tricks guide.
How am I willing to complete what is already done? The answer in the next acticle!