giovedì 4 febbraio 2010

C:\WINDOWS\system32\ctfmon.exe "Ma che cosa è?"

Parliamo giusto per qualche attimo ... che non fa male.

Qusto eseguibile E' DI MICROSOFT, ma ha un gemello detto anche il virus della "pen Drive" o "Chiavetta".
Più o meno l'abbiamo contratto tutti o se l'abbiamo non lo sappiamo.
Prendete la vostra penna usb infilatela nella vostra presa usb... e sbirciate se vi trovate un autorun.inf....
L'avete trovato, bene ... non troppo, ma bene.. ora apritelo con il NOTEPAD, non eseguitelo, editatelo,
e dentro troverte una zozzeria simile a

[autorun]
shellexecute=Recycled\ctfmon.exe
shell\Open(&0)\command=Recycled\ctfmon.exe
shell=Open(&0)

Come noterete .. "ctfmon.exe" è molto uguale a "ctfmon.exe" ma non sono la stessa cosa...
Il primo è un brillante Trojan il secondo è .. (suspance) un componente aggiuntivo di Office 2003
perfettamente INUTILE ai più.

C:\WINDOWS\system32\ctfmon.exe Questo ragazzaccio serve per l'input alternativo, che può essere
Riconoscimento Scrittura..
Sintesi e riconoscimento vocale..

Come sostengo può essere importante per chi ha dei deficit, ma dato che ms l'installa di default
supponendo che siamo tutti possibili portatori di Deficit... tuttavia non ti dice che lo fa....

La situazione finale è tristemente la seguente...
apri word ne parte uno ( che rimane appeso )
apri excel ne parte un'altro .. ( che strano ma vero rimane appeso )
apri outlook e caso strano (perchè usare uno di quelli appesi ) te ne apre un'altro che fa sempre bene...

Morale se aprite in un giorno 20 documenti vi trovate 20 ctfmon.exe...

Potete fare una cosa semplici crearvi una Restriction POLICY per evitare che parta... m alla fine vi ritrovate
l'event viewer pieno di zozzerie..

Oppure rimuoverlo
per il virus .. la cosa è semplice.. formattate la chiavetta.. e svuotate il cestino del pc e puf non ha persitenza...
Più che altro c'e' da tirarlo giù via Taskmanager...

per l'applicazione ms .... ci vuole un po di più, ma è semplice..
1) teskmanager e tirate giù tutti ctfmon ..
2) pannello di controllo / installazione applicazioni / Microsoft Office 2003
3) Scegliere "Cambia"
4) Aggiungi/Rimuovi caratteristiche
5) Fleggare Personalizzazione avanzata applicazioni
6) da Personalizzazione avanzata Espandere Microsoft Office

a questo punto cercate tutto quello che è inerente alla sintesi per il riconoscimento vocale o per gli input alternativi...
In più vi conviene rimuovere... il traduttore dal francese, dallo spagnolo, dal tedesco e tutte le altre lingue di cui
non avete bisogno ..


7) esegui / regedit
8) rimuovere da HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\ Ctfmon.exe
9) esegui / regsvr32 /u msctf.dll

Fatto abbiamo finito ...


lunedì 1 febbraio 2010

Wrappare che passione...

Dato che mi sarebbe tornato comodo crearmi un piccolo manager di sessione.. mi sono wrappato tutta la session.

Non mi ha dato di volta il cervello.. anche se ai più potrebbe sembrare. Per una questione di comodo mi trovo
a dover condividere quest'oggetto un po qua e un po la in un web application, e dato che non so e non posso
sapere chi o come aggiungerà elementi o chi o come li rimuoverà me la wrappo in toto, e poi mi occuperò di
aggiungere qualche metodo specializzato per la gestione in modo che chi aggiunge o toglie lo faccia come dico
IO !!

caso contrario sono dati "persi" o senza persistenza ..

cmq dato che potrebbe servire..

using System;
using System.Data;
using System.Collections;
using System.Configuration;
using System.Collections.Specialized;
using System.Web;
using System.Web.SessionState;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Life20.Commons
{
public class wrSession
{
private HttpSessionState _xSession = null;

#region Public Properties
public int CodePage
{
get { return _xSession.CodePage; }
}

public HttpSessionState Contents
{
get { return _xSession.Contents; }
}

public HttpCookieMode CookieMode
{
get { return _xSession.CookieMode; }
}
public int Count
{
get { return _xSession.Count; }
}

public bool IsCookieless
{
get { return _xSession.IsCookieless; }
}

public bool IsNewSession
{
get { return _xSession.IsNewSession; }
}

public bool IsReadOnly
{
get { return _xSession.IsReadOnly; }
}

public bool IsSynchronized
{
get { return _xSession.IsSynchronized; }
}

public NameObjectCollectionBase.KeysCollection Keys
{
get { return _xSession.Keys; }
}

public int LCID
{
get { return _xSession.LCID; }
}

public SessionStateMode Mode
{
get { return _xSession.Mode; }
}

public string SessionID
{
get { return _xSession.SessionID; }
}

public HttpStaticObjectsCollection StaticObjects
{
get { return _xSession.StaticObjects; }
}

public object SyncRoot
{
get { return _xSession.SyncRoot; }
}

public int Timeout
{
get { return _xSession.Timeout; }
set { _xSession.Timeout = value; }
}
#endregion

#region Builder
public wrSession(HttpSessionState crSession)
{
_xSession = crSession;
}
#endregion

#region Public Methods
public void Add(string _Name, object value )
{
_xSession.Add(_Name, value);
}

public void Abandon()
{
_xSession.Abandon();
}

public void Clear()
{
_xSession.Clear();
}

public void CopyTo(Array array, int index)
{
_xSession.CopyTo(array, index);
}

public override bool Equals(object obj)
{
return _xSession.Equals(obj);
}

public IEnumerator GetEnumerator()
{
return _xSession.GetEnumerator();
}

public override int GetHashCode()
{
return _xSession.GetHashCode();
}

public new Type GetType()
{
return _xSession.GetType();
}

public void Remove(string Name)
{
_xSession.Remove(Name);
}

public void RemoveAll()
{
_xSession.RemoveAll();
}

public void RemoveAt(int index)
{
_xSession.RemoveAt(index);
}

public override string ToString()
{
return _xSession.ToString();
}
#endregion
}
}


questa è la base.. senza naturalmente le mie specializzazioni...

venerdì 29 gennaio 2010

hover su input button (mozilla compatible).

Si sono tonico in quest'inizio 2010...

Partiamo dalle cose semplici IE supporta l'hover sui button ? no. Mozilla supporta gli hover sui button ? ancora no.

C'e' tuttavia una comoda tips per poterci riuscire e per aver un bell'effetto.

Create un div e popolatelo di bottoni..
poi applicate questi stili...

.MainDiv input
{
border :0;
}
.MainDiv input[type="button"]:hover
{
border :0;
color :white;
height :30px;
width :215px;
display :block;
text-align :left;
font-size :15px;
}
.MainDiv input[type="button"]
{
border :0;
color :#6A6A6A;
height :30px;
width :215px;
display :block;
text-align :left;
font-size :15px;
}
MainDiv è chiaramente il DIV ...
input è la radice dei button..
input[type="button"] ( chiamiamola estensione del tipo ... ) è il bottone.

Funziona abbastanza bene, è possibile applicare anche un background e shiftarlo

[Serializable] quando il problema si pone.

Come risolvere un problema che apparentemente non esiste??
Nel creare un web custom control può accadere che per puro caso vi imbattiate nel dover realizzare un
div che contiene una serie di bottoni, popolati "per comodo" o "per mera complicazione" tramite una lista
tipizzata.

public class Item
{
private string _itemName;
private string _itemValue;

public string itemName {get ; set ;}
public string itemValue {get ; set ;}
}

public class ItemDataProvider
{
private List _items = new List();

public List Items {get; set;}

public ItemDataProvider()
{
// tutto il codice necessario per eseguire il fill di _items
}
}

Per finire...
[DefaultProperty("Text")]
[ToolboxData("<{0}:ItemViewer runat=server>")]
public class ItemViewer : WebControl
{
[Category("Data")]
public List Items {get; set;}
}

Create la pagina.. aggiungete il controllo, un po sale un po di pepe...
E puf vi beccate una bella Eccezzione !!!

Del tipo che Item non è contrassegnata come serializable....


Bhe che dire se cercate qua e la qualcuno vi dirà che manca l'attributo alla proprieta del controllo web
qualcuno che manca l'attributo alla lista..
io vi levo ogni dubbio..

MANCA ALLA CLASSE ENTITY...

[Serializable]
public class Item
{
private string _itemName;
private string _itemValue;

public string itemName {get ; set ;}
public string itemValue {get ; set ;}
}

e fatto .. !!!

venerdì 22 gennaio 2010

SelectedIndexChanged doppio ...

Ma brava mamma microsoft... AJAXTOOLKIT di stoca... !! Questa volta mi avete fatto arrabbiare e tanto... si perchè il potenziale danno sarebbe stato bello grosso.

La stituazione è semplice
a) In una web application aggiungete la reference al AjaxToolKit, bene bravi...
b) aggiungete un web form ( bravissimi )
c) ora aggiungete un update panel
d) aggiungete quindi al upPanle una grid ( fatto? )
e) aggiungete una commandField ( tipo un select command )
f) ed ora gestite sia l'evento di SelectedIndexChanged o il RowCommand o entrambi.
g) e per concludere mettete due simpatici break nel primo e/o nel secondo evento ...

Che cosa ottenete ???
che entrambi gli eventi si scatenano due volte....

Supponete che RowCommand si debba gestire un insert... che cosa potrebbe succedere ??
che al posto di una insert te ne infila due...

BENE .. e tutto questo è documentato ?? PARE di si .. ma non nel toolkit e non sul sito di MS,
che per altro conferma il problema.. ma non suggerisce una vera soluzione... arg..

E quindi ci pensiamo ancora una volta noi .. rassegnati e con le palle a terra..

if (Session[this.ID + "_justDone"] == null)
{
.... codice di gestione dell 'evento a vostra scelta...
Session[this.ID + "_justDone"] = 1;
}
else
{
Session[this.ID + "_justDone"] = null;
}

bello ne'?? mmmm un capo lavoro ... e meno male che sono in test... e meno male che me ne
sono accorto !!

Per altro pare che fra noi developers italiani questo "successone" ancora non si sia verficato...
cmq io lo documento e preparatvi a gestirlo !!

dimenticavo è possibile che tutti gli oggetti che generano postback siano soggetti al double Fire... !!


ambhe'

giovedì 21 gennaio 2010

Domain Driven o MVC

Due mondi apparentemente differenti, due mondi quasi completamente distinti.
Eppure il Domain Driven, trae le sue radici proprio dal MVC, lo estende e parecchio, anche se in un certo senso lo circoscrive.

Il concetto basilare del MVC, è creare un forte disaccopiamento fra dati, la logica e chi li presenterà, questo non è del tutto perso nel D.D.D. anzi l'estensione nasce proprio nel concetto di Anti Corruption, dove un proxy di derivazione Design pattern, non fa altro che "switchare" da un "Provider" ad un Altro ma che fa le stesse cose.
Verosimilmente un cluster termine già più conosciuto.

Appaiono concetti Nuovi come l'Aggregazione o Coesione, questo perchè in D.P. un entity è solo un entity, mentre in D.D.D, un entity può essere vista come un utente, che deve accedere ad un certo numero di funzionalità ( Nb si parla di Facade... o qualcosa di non troppo distante).

Appare il concetto di Confine, un qualcosa di sottile che delimita lo spazio del dominio, conecetto che in mvc non era proprio presente... e forse non era nemmeno necessario. Però per soluzioni in D.D.D. è necessario imporre o impostare un limite.
Per questo concetto però potrebbe essere necessario almeno un esmpio.

In Mvc la soluzione può essere costituita da più progetti come un sito web e varie dll, o una windows application e varie dll, in D.D.D una soluzione può essere l'insieme di applicazioni presenti in un azienda che hanno come punto d'ingresso l'utente di LDAP...

Ora non è difficile comprendere perchè serve un confine...

A tale proposto si parla di Domain Layer ( simile business Logic ) ma è il punto in cui il software vive.

Si parla di immutabilità, oggetti che possono essere osservati che possono avere iterazione con altri oggetti, ma che non cambiano il loro stato.

Tuttavia si parla di Ubiquty Languages ... già perchè in programmazione ( da sempre ) si cerca di dare a tutti una regola nella definizione delle "cose". In D.D.D il concetto è forte e persistente dato che la vastità di una soluzione può essere considerevole...
E' di estrema importanza che tutti si parli "nella stessa lingua e degli stessi argomenti chiamandoli sempre con il loro nome". E va da se che anche nella stesura del codice si debba sempre mantenere chiaro il contesto.

E i test su architetture simili ??

Già in D.D.D si parla tanto anche di Test Driven, una metodologia che consente di scrivere codice
in base anche ai test che dovranno essere fattti.

Certo Mvc è "fondatore" della buona programmazione "D.D.D." estente quanto di meglio c'era e in parte lo migliora

Tag Form dimensionabile...

Tristemente mi sono accorto di qualche nuovo limite ... alla facciazza di Yoda "tentare no fare e riuscire si"... caro Yoda
tentare ha il suo bel perchè CREDIMI.

Nella maggior parte dei casi quando si realizza un sito, è buona norma studiare il layout su una pagina di test, per vedere
se va. Se non lo fate, credetemi è giunto il momento di farlo...

Seguite questo banale esempio

a)create una pagina html semplice semplic che abbia un lay out simle al seguente



Per fare cio vi servono

questi stili
.main {width:100%; height:100%;background:white;}
rappresenta tutta l'area

.header{width:100%;height:100px ;background:red;}
rappresenta la zona rossa

.left {width:200px; height:100%;background:yellow;float:Left;}
rappresenta la zona gialla

.right{height:100%; background:green;}
rappresenta la zona verde


html
head
style quanto sopra /style
/head
body
div class="main"
div class="header" /div
div class="left" /div
div class="right" /div
/div
/body
/html

E puf .. ecco che abbiamo la nostra pagina... fatta e perfetta.

b) Ora torniamo sulla pagina di visual studio...

E nella migliore delle ipotesi otteniamo questo ... Tutto condensato in malo modo...

Da che cosa dipende ?? nella maggior parte dei casi i limiti sono imposti dal validatore, che implica delle costrizioni
a livello di interpretazione. Ossia i brws quando incappano in una pagina con validatore applicano delle regole precise
statiche a come dovrà essere interpretato il file. Quindi chiusure di tag stili e tanto tanto altro.

MA ... non è il nostro caso...

il nostro nemico è il Tag Form.. che tutti snobbiamo ... perchè apparentemente sappiamo che è un qualcosa di
emblematicamente inesitente, ma non è così. Anzi occupa spazio ed è pericolosamente invasivo.

provate ad aggiungere alla vostra paginetta di test il succccitato tag..


html
head
style quanto sopra /style
/head
body
form
div class="main"
div class="header" /div
div class="left" /div
div class="right" /div
/div
/form
/body
/html


e otterrete l'immagine sopra (quella schiacciata... )
Per visual studio (vb/c#) la soluzione è molto semplice.. ma "rischiosa" se come nella maggior parte dei casi il
form E' TUTTA LA PAGINA, allora vi troverete bene, se non benissimo a compiere il breve gesto di
aggiungre

form{width:100%; height:100%;}

al vostro foglio di stile.... e se avete risolto... bhe fatevi i complimenti perchè avete scoperto qualcosa di nuovo.

( ma come czz si fa a indentare il codice in sto chiodo di blog??? ) saluti !!