implementare de interfata

   11 public class MockInterfaceOnObject<IInterface>

   12         where IInterface:class

Am vrut sa integrez backgroundworker-ul cu incarcarea din o tabela a obiectelor  – pentru a afisa intr-un grid incarcarea (nu astept pina se incarca toate …)
Prima oara am zis : ok, pare sa fie destul de usor – incarc obiectele in DoWork-ul lui si trimit evenimente la adaugarea fiecarui copil(rind) care sa le prind si … gata
Wrong…. trebuia sa imi dau seama ca evenimentele provin din alt thread decit al formei – si in consecinta trebuie sa fac begininvoke

Ok, mi-am zis – atunci de ce sa nu invoc direct ReportProgress ca sa raportez progresul operatiei si sa ma folosesc direct de evenimentele backgroundworker-ului?
Bun-dar obiectele mele sunt intr-o clasa separata- care nu stie NIMIC despre windowsforms – si e bine sa fie asa…
Care sa fie solutia?
Logic- o interfata care sa contina metodele principale din control, de genul:

   22  public interface IReportProgress

   23     {

   24         void ReportProgress(int percentProgress, object State);      

   25         void CancelAsync();

   26     }

Am zis-super, tot ce am de facut este sa fac cast de la control la interfata, sa o pasez la obiectul de incarcare si gata!
Wrong… cast de la control la interfata – acolo a fost problema adevarata…

Desi control-ul are TOATE metodele interfetei, deci TEORETIC implementeaza interfata, totusi nu se poate face cast … NASOL!

Asa ca am deschis un forum pe RONUA si , in acelasi timp, m-am apucat sa fac o clasa generica care sa rezolve problema cast-ului intre un obiect si o interfata care contine metodele obiectului.
Am ajuns la o clasa

   11 public class MockInterfaceOnObject<IInterface>

   12         where IInterface:class

cu 2 metode principale:


   18  public static T MockObject<T>()

   19             where T:class

care intoarce un obiect NOU care il mosteneste pe T(backgroundworker) si implementeaza interfata IInterface – se foloseste cind vreti sa creati un obiect nou

   

   25 public static IInterface MockInterface(object obj)

care construieste un obiect nou ce are un constructor ce primeste ca argument obiectul trimis si implementeaza interfata facind apel la functiile corespunzatoare obiectului trimis – se foloseste cind obiectul deja exista , are anumite proprietati setate si vreti sa il folositi.

Nu am putut folosi metoda 1 pentru a face new pe backgroundworker -nu ca nu ar fi compilat, dimpotriva… Dar design-time de la WindowsForms se incapatina sa dea eroare.

Asa ca am folosit 2, cu ceva de genul

   70 MockInterfaceOnObject<IReportProgress>.MockInterface(backgroundWorker1)

      

Si a mers OK
Pe RONUA somalezu a dat inca o solutie, cu Real Proxy care pare sa fie interesanta. O sa o studiez. Pina atunci , iata codul:

using System;

using System.Collections.Generic;

using System.Text;

using System.CodeDom.Compiler;

using System.Reflection;

using Microsoft.CSharp;

using System.IO;

 

namespace MockInterface

{

    public class MockInterfaceOnObject<IInterface>

        where IInterface:class

    {

        private static Type TypeInterface()

        {

            return typeof(IInterface);

        }

        public static T MockObject<T>()

            where T:class

        {

            return ObjectWithInterface(typeof(T), GenerateInheritance(typeof(T)), null) as T;           

        }

        public static T MockObject<T>(T obj)

           where T : class

        {

            return ObjectWithInterface(typeof(T), GenerateEncapsulation(typeof(T)), obj) as T;

        }

        public static IInterface MockInterface(Type t)

        {

 

 

            return ObjectWithInterface(t, GenerateInheritance(t), null) as IInterface;

 

 

        }

        public static IInterface MockInterface(object obj)

        {

            return ObjectWithInterface(obj.GetType(), GenerateEncapsulation(obj.GetType()), obj) as IInterface;

        }

 

 

        private static string CodeBase(string pathfile)

        {

            if (pathfile == null)

                return null;

 

            if (pathfile.IndexOf(“file:///”) == 0)

                pathfile = pathfile.Substring(“file:///”.Length);

 

            return pathfile;

        }

 

        private static string CodeBase(Assembly a)

        {           

            return CodeBase(a.CodeBase);

 

        }

        public static object ObjectWithInterface(object Existing)

        {

            return null;

        }

        public static object ObjectWithInterface(Type t,string Code,params object[] args)

        {

 

            CSharpCodeProvider cs = new CSharpCodeProvider();

            CompilerParameters cp = new CompilerParameters();

            cp.GenerateExecutable = false;

            cp.GenerateInMemory = true;

            cp.ReferencedAssemblies.AddRange(new string[] { CodeBase(t.Assembly), CodeBase(TypeInterface().Assembly) });

            foreach (AssemblyName a in t.Assembly.GetReferencedAssemblies())

            {

 

                string pathfile = CodeBase(a.CodeBase);

                if (pathfile != null && (!cp.ReferencedAssemblies.Contains(pathfile)))

                    cp.ReferencedAssemblies.Add(pathfile);

 

            }

 

 

            CompilerResults cr = cs.CompileAssemblyFromSource(cp, new string[1] { Code });

            if (cr.Errors.Count > 0)

            {

                CompilerError ce = cr.Errors[0];

                throw (new ArgumentException(“Can not compile file : “ + ce.ErrorText + ” Line:” + ce.Line));

            }

            return Activator.CreateInstance(cr.CompiledAssembly.GetExportedTypes()[0],args);

        }

 

        private static string GenerateInheritance(Type t)

        {

 

            StringBuilder sb=new StringBuilder();

            sb.AppendLine(“namespace “ + t.Namespace);

            sb.AppendLine(“{“);

            sb.AppendLine(“public class My” + t.Name + ” : “ + t.Name + “,” + TypeInterface().FullName);

            sb.AppendLine(“{“);

            sb.AppendLine(“}”);

            sb.AppendLine(“}”);

            return sb.ToString();

        }

        private static string GenerateEncapsulation(Type t)

        {

 

            StringBuilder sb = new StringBuilder();

            sb.AppendLine(“namespace “ + t.Namespace);

            sb.AppendLine(“{“);

            sb.AppendLine(“public class My” + t.Name + ” : “  + TypeInterface().FullName);

            sb.AppendLine(“{“);

            sb.AppendLine(“private “ + t.Name + ” m_obj;”);

            sb.AppendLine(“public My” + t.Name + “(“ + t.Name + ” obj){“);

            sb.AppendLine(“m_obj = obj;”);

            sb.AppendLine(“}”);

            foreach (MethodInfo mi in TypeInterface().GetMethods())

            {

                bool isvoid  = (mi.ReturnType== typeof(void));

                string returntype = mi.ReturnParameter.ParameterType.FullName;

                if (isvoid)

                    returntype = “void”;

 

                sb.AppendLine(“public “ + returntype + ” “ + mi.Name + “(“);

                sb.AppendLine(” “);

                string strParams = ” “;

                foreach(ParameterInfo pi in mi.GetParameters())

                {

                    sb.Append(pi.ParameterType.FullName + ” “ + pi.Name  + “,”);

                    strParams += pi.Name +“,”;

                }

 

                strParams = strParams.Substring(0, strParams.Length – 1);//remove ,

                sb.Length =sb.Length-1;//remove ,

 

                sb.AppendLine(“)”);

                sb.AppendLine(“{“);

                if (!isvoid)

                    sb.AppendLine(“return “);

 

                sb.AppendLine(” m_obj.” +  mi.Name + “(“ + strParams + “);”);

                sb.AppendLine(“}”);

            }

 

            sb.AppendLine(“}”);

            sb.AppendLine(“}”);

 

            return sb.ToString();

        }

 

 

    }

}

( si nu stiu cind o sa ma obisnuiesc sa il si comentez…)

catavencu, dragos manac, aere de superioritate si un site

Iar catavencu cu iar Linux… Sa citez citeva chestii:

“Desi Linux suporta foarte multe componente hardware, situatia in cazul
laptopurilor este un pic mai complicata, fiind vorba de combinatii mai
rare si mai exotice de componente speciale.”
Sigur ca da…. daca un Linux-ist inrait spune ca este “un pic
mai complicata”, sigur pentru un utilizator mediu este “foarte
complicata”  – puneti pariu?

Proba practica( daca nu gasiti pe site-uri daca laptopul e suportat)
este sa instalezi pe CD distributii Knoppix sau Kanotix si “bootati
distributia si observati in ce masura va functioneaza toate
componentele”
Imi aduc aminte de prima mea instalare de Linux – in care , cu un CD de
la o carte de la teora (RedHat parca era pe CD) am stat 7 seri pina sa
gasesc unde si ce linie sa pun sa imi mearga placa de
sunet.Am fost foarte mindru dupa aceea – pina mi-am dat seama ca, in
loc sa stau cu orele sa fac asta singur, mai bine puneam Windows, jucam
sah, ieseam la plimbare sau faceam orice altceva imi trecea prin cap –
placa de sunet trebuia sa mearga… Dar ok – pentru cine are timp de
pierdut….

Iar finalul este reusit:
“Mult succes(oare de ce ne ureaza succes? nu ar trebui sa mearga din prima ?, nota mea)
si sa va bucurati de momentele in care diversi va intreaba uimiti:”Dar
ce Windows ai tu pe laptop?” – iar voi sa le puteti raspunde
inteligent:Lasa…”
Din acest final m-am convins din nou cui se adreseaza Linux-ul – oamenilor care raspund inteligent la o intrebare  cu “Lasa…”

Si hai sa ii fac si eu reclama: si-a facut site, www.manac.ro ,dar ghinion : tot la http://dragosh.bloghost.ro/ ne redirecteaza (btw:  Daca il cautati la rnc ,o sa aveti detalii despre cum s-a inregistrat…)

Oh , Dragos, e chiar asa complicat, dupa ce ai lansat simplissimo, sa faci un blog pe Linux?
Se baga cineva sa facem impreuna acelasi lucru, dar pe ASP.NET? Cu demo-uri,cu tot ce trebuie? Deja m-am gindit cum ar trebui adaptate StarterKit-urile… si poate facem si un ClickOnce de raportare.

Iar articolul lui Iaru, despre diacritice in Apple si in Windows- am dat din cap resemnat- desi parca diacriticile sunt suportate bine pe XP( dar s-ar putea sa ma insel….si nu am timp sa studiez problema)

dilema veche si pe mina cu am lasat democratia

Acest “am lasat” face toti banii… deus otiosus…

In Cine moşteneşte electoratul Alianţei? Cristian Ghinea si Alina Mungiu au dreptate:”Alina Mungiu-Pippidi spunea că cine o are pe Macovei la viitoarele alegeri cîştigă electoratul dreptei.”

Magdalena Boiangiu citeaza un cinic din International Herald Tribune:
La ce bun să ai puterea, dacă nu o foloseşti pentru a obţine mai multă putere?

Alina Mungiu discuta, cu amaraciune, despre Democraţie pentru nesimţiţi:
“Dacă cineva sub 35 de ani citeşte acest articol şi are timp de
dedicat unei activităţi voluntare în interes public, să îmi scrie. Dacă
vrea doar să-mi comunice păreri, să nu îmi scrie. Citesc sute de
e-mail-uri pe zi şi nu mă mai interesează decît oamenii capabili şi de
altceva decît de promovarea propriei cariere.”
Daca o puteti ajuta, ajutati-o

Mi-a placut solutia lui Brecht citata de Radu Cosasu:

„Soluţia“ lui, Brecht a formulat-o într-un poem scris după 17 iunie
1953, cînd cei din Berlinul de Est s-au revoltat împotriva Guvernului
comunist:
După revolta din 17 iunie

Secretarul Uniunii Scriitorilor

A împrăştiat pe Aleea Stalin manifeste

Din care reieşea că poporul

A trădat încrederea partidului

Şi că numai prin muncă îndoită

Ar mai putea s-o recîştige.

Nu ar fi fost mai simplu

Ca Guvernul să suspende poporul

Şi să aleagă un altul?

C. G.(Cristian Ghinea, presupun) face reclama la www.democratiya.com/

Citind articolul lui Andrei MANOLESCU despre Părinţii plecaţi  nu m-am putut impiedica sa ma gindesc la mine, care sunt plecat 10 1/2 ore pe zi(minim : 8 1/2 ore servici, 1 ora dus, 1 ora intors) de acasa… si doar simbata duminica ma revansez fata de copiii mei

newslinkuri de martie

Pentru pasionatii de CSS
 53 CSS-Techniques You Couldn’t Live Without


The .NET Micro Framework

Cum sa faci save/restore la diagramele din SQL Server 2005
http://www.codeproject.com/dotnet/ScriptDiagram2005.asp

Un fisier reg pentru find-ul din XP, sa ia in considerare si fisierele cu extensie necunoscuta
http://www.sellsbrothers.com/tools/#Filter_Files_With_Unknown_Extensions_For_XP

Cum sa executi mai multe IE de pe aceeasi masina
http://www.quirksmode.org/browsers/multipleie.html
(eu as ramine, totusi , la Virtual PC)

No Regrets: Pick Play Over Work

The 50 Most Important People on the Web

La ce va pricepeti cel mai bine?
Microsoft Skills Assessments

refactoring

Am terminat cartea de Refactoring de Martin Fowler
(multumesc de 2 ori, Somalezule!)

Ce mi-a placut cel mai mult:

Introduce Null Object
 
if (customer == null) plan =
BillingPlan.basic();
else plan = customer.getPlan();
 
 
 
Ron Jeffries
We first started using the null
object pattern when Rich Garzaniti found
that lots of code in the system
would check objects for presence before
sending a message to the object. We
might ask an object for its person,
then ask the result whether it was null.
If the object was present, we
would ask it for its rate. We were doing this
in several places, and the
resulting duplicate code was getting
annoying.
So we implemented a missing-person object that answered a zero
rate
(we call our null objects missing objects). Soon missing person knew
a
lot of methods, such as rate. Now we have more than 80
null-object
classes
 



Separate Domain from Presentation
 
If you have a grid, create a class to represent the rows on the grid. Use a
collection on
the domain class for the window to hold the row domain
objects.
 

( asta cu griudul nu o faceam intotdeauna- se potriveste cu ce zicea Lhotka: ok to duplicate fields, not ok to duplicate behaviour)

for each, list si predicate

Am avut ieri de selectat dintr-o lista de carti (aflate intr-un fisier txt) cele care ma intereseaza – mai bine spus, de scos cele care nu ma intereseaza – si trimis lista inapoi .
La inceput, am inceput sa fac normal:

   30             string[] lines = File.ReadAllLines(@”C:\lista.txt”);

   31             foreach (string line in lines)

   32             {

   33                 if (line.ToLower().IndexOf(“java”) > 0)

   34                     continue;

   35 

   36                 if (line.ToLower().IndexOf(“autocad”) > 0)

   37                     continue;

   38 

   39                 if (line.ToLower().IndexOf(“cisco”) > 0)

   40                     continue;

   41 

   42                 l.Add(line);

   43             }

   44             string strNewFile = @”C:\lista1.txt”;

   45             if (File.Exists(strNewFile))

   46                 File.Delete(strNewFile);

   47 

   48             File.WriteAllLines(strNewFile, l.ToArray());

   49

   50             System.Diagnostics.Process.Start(strNewFile);

( de aici se vede clar ca am scos java, cisco , si altele …)

Apoi – am inceput sa gindesc – si sa imi aduca aminte ca exista ceea ce se numeste Predicate

Asa ca am ajuns la urmatorul text :

   28         static Predicate<string> NotInStringFirstTry(string x)

   29         {

   30 

   31             return new Predicate<string>(

   32                     delegate(string line)

   33                     {

   34 

   35                         if (x == null && line == null)

   36                             return false;

   37                         if (x == null)

   38                             return true;

   39                         if (line == null)

   40                             return true;

   41                         return (line.ToLower().IndexOf(x.ToLower()) < 0);

   42                     }

   43                     );

   44         }

   45         static void Main(string[] args)

   46         {

   47             string[] lines = File.ReadAllLines(@”C:\lista.txt”);

   48 

   49             List<string> l = new List<string>();

   50             l.AddRange(lines);

   51 

   52 

   53             l = l.FindAll(NotInStringFirstTry(“java”));

   54             l = l.FindAll(NotInStringFirstTry(“cisco”));

   55             l = l.FindAll(NotInString(“autocad”));

   56 

   57             string strNewFile = @”C:\lista1.txt”;

   58             if (File.Exists(strNewFile))

   59                 File.Delete(strNewFile);

   60 

   61             File.WriteAllLines(strNewFile, l.ToArray());

   62 

   63             System.Diagnostics.Process.Start(strNewFile);

   64         }

Nu numai ca e mai compact – e si mai simplu de inteles …

Iar la a 3-a gindire mi-am dat seama ca fac prea multe iteratii in array – asa ca m-ar ajuta o singura functie:

   29 static Predicate<string> NotInString(params string[] x)

   30         {

   31 

   32             return new Predicate<string>(

   33                     delegate(string line)

   34                     {

   35 

   36                         if (x == null && line == null)

   37                             return false;

   38                         if (x == null)

   39                             return true;

   40                         if (x.Length == 0)

   41                             return true;

   42                         if (line == null)

   43                             return true;

   44                         foreach (string word in x)

   45                         {

   46                             bool b = (line.ToLower().IndexOf(word.ToLower()) > -1);

   47                             if (b)

   48                                 return false;

   49                         }

   50 

   51                         return true;

   52                     }

   53                     );

   54         }

   55 

   56         static void Main(string[] args)

   57         {

   58             string[] lines = File.ReadAllLines(@”C:\lista.txt”);

   59 

   60             List<string> l = new List<string>();

   61             l.AddRange(lines);

   62             l = l.FindAll(NotInString(“java”, “cisco”, “autocad”));

   63 

   64             string strNewFile = @”C:\lista1.txt”;

   65             if (File.Exists(strNewFile))

   66                 File.Delete(strNewFile);

   67

   68             File.WriteAllLines(strNewFile, l.ToArray());

   69

   70             System.Diagnostics.Process.Start(strNewFile);

   71         }

Plina de peripetii, programarea asta … Daca aveti o alta sugestie, astept sa imi spuneti
( codul a fost copiat cu ajutorul CSAH)
http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/

angajatori in IT – frustrare revarsata

Acest blog este unul in care imi revars frustrarea fata de anumiti angajatori. De ce acum? Pentru ca m-am saturat:

    1. de oameni care zic “am un job nemaipomenit” – dupa care, dupa citva timp, incep sa spuna -eu sunt doar un intermediar, nu eram eu

    2. de angajatori care au emailul la gmail sau la un site care are doar o pagina – iar la click apare doar emailul (oh, inainte nu era nici asta)

    3. de angajatori care considera ca TU ar trebui sa fii fericit sa vii la ei -daca se poate pe degeaba , si mai bine -ei sa faca banii si tu sa te alegi cu ONOAREA de a lucra la asa proiect

    4. de angajatori care considera ca proiectele adevarate sunt doar intr-un limbaj …

    5. de angajatori care iti spun : cum, in partea cealalta era mai ieftin halatul
Am fost odata la un interviu de PM si mi s-a spus, textual : Dar nu ar fi cinstit fata de ceilalti PM un asemenea salariu …La care le-am replicat: Dar v-am spus eu ca ma intereseaza cit au ei?
   

Oh – si daca vreti un anunt profesionist, cititi aici
http://ronua.ro/CS/forums/permalink/14617/14617/ShowThread.aspx#14617

Si alt punct in plus, pe care il apreciez: a dat si salariul -asta ca sa nu piarda si el , si candidatii timpul degeaba….

cotidianul si lectii de respiratie de Anne Tyler

O carte interesanta , despre o mama la mijlocul vietii, care cauta sa “indrepte” lucrurile asa cum le vede ea- si mai mult le incurca(de buna credinta, totusi) din cauza ca nu ia in seama dorintele celorlalti. Ar fi fost superba daca al doilea capitol, in loc sa continue povestirea cu ceea ce gindea sotul ei, ar fi repovestit primul capitol din punctul lui de vedere…

Dar merita citita!