In principal, despre .NET, VB6. C#,VB.NET, ASP.NET Apoi despre programare si multe alte chestii ... de programare.

Subscribe RSS   Mini tools List

sâmbătă, martie 31, 2007

refactoring
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

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)

Post page: http://serviciipeweb.ro/iafblog/2007/03/31/refactoring.aspx

Weblog post by 'admin' on 'refactoring'

Categories:.NET;carti;programare

vineri, martie 30, 2007

for each, list si predicate
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

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/





Post page: http://serviciipeweb.ro/iafblog/2007/03/30/for+Each+List+Si+Predicate.aspx

Weblog post by 'admin' on 'for each, list si predicate'

Categories:.NET;programare

joi, martie 29, 2007

angajatori in IT - frustrare revarsata
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

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....

Post page: http://serviciipeweb.ro/iafblog/2007/03/28/angajatori+In+IT+Frustrare+Revarsata.aspx

Weblog post by 'admin' on 'angajatori in IT - frustrare revarsata'

Categories:discutii;programare

duminică, martie 25, 2007

De ce C++ si nu C# ?
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

Pentru ca nu vreau sa poluez Ronua, am decis sa pun aici intrebarea
De ce C++ si nu C# ?

Raspunsuri posibile:
1. Pentru ca proiectele adevarate sunt in C++
2. Pentru ca poate sa te confunde lumea cu un programator prost - caci asa sunt cei mai multi in C#

Are cineva alte motive de adaugat?

Post page: http://serviciipeweb.ro/iafblog/2007/03/25/De+Ce+C+Si+Nu+C.aspx

Weblog post by 'admin' on 'De ce C++ si nu C# ?'

Categories:programare

Microsoft Listed as Most Secure OS
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

Saptamina trecuta , in Catavencu, Dragos iar zicea de faptul ca virusii Windows nu merg pe Linux. Nici nu e nevoie -au propriile lor probleme.Nu am cautat in mod special,dar am citit azi despre Microsoft Listed as Most Secure OS 

Aici gasiti un rezumat al studiului Symantec in care se arata ca timpul de raspuns al MS e mai rapid decit al RedHat(21 zile fata de 58).
Ca sa nu fac ca Dragos, trebuie mentionat ca numarul de probleme a fost mai mare la MS decit la RedHat pe probleme mari, dar mai bine pe probleme medii

Si, cum e normal, probleme provin de la aplicatiile Web incorporate:

Alfred Huger, vice president of engineering for Symantec Security Center, said the real problem is with Web applications, where two-thirds of all vulnerabilities are found.


Post page: http://serviciipeweb.ro/iafblog/2007/03/24/Microsoft+Listed+As+Most+Secure+OS.aspx

Weblog post by 'admin' on 'Microsoft Listed as Most Secure OS '

Categories:programare

sâmbătă, martie 24, 2007

Programarea in .NET - partea a 14-a Salvare XML si Executare de operatii asincrone in Windows Forms
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

De ce taskuri asincrone ? In ideea ca , intr-o aplicatie Windows(si chiar ASP.NET) , operatiile lungi ar trebui sa fie executate de catre alt thread, urmind ca aplicatia sa poata sa mai afiseze ceva utilizatorulu in tot acest timp ( fie si un buton pe care scrie „apasa ca sa intrerupi operatia asta lunga ..."). De pilda, in aplicatia noastra, daca avem mai mult de 100 de Publisher-i si vrem sa ii vedem pe toti – ar trebui incarcati intr-un nou thread.

 

Ne ocupam mai intii de o aplicatie Windows Forms si pe urma de ASP.NET

Un thread nu e greu de pornit. Hai sa vedem un exemplu:

System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(StartAction));

            t.Start("obiect transmis");

 

 

public void StartAction(object o)

        {

            string s = o.ToString();

            System.Threading.Thread.Sleep(5000);

            //executa actiunea

            //trimite text

            if (this.InvokeRequired)

            {

                this.Invoke((MethodInvoker)delegate()

                 {

                     this.Text = s;

                 });

                //sau

                //this.Invoke(new MethodInvoker(evenimentfaraparametri());

                //this.Invoke(new EventHandler(btnDiscounts_Click));

                //this.BeginInvoke(new EventHandler(eveniment cu parametri));

            }

            else

                this.Text = s;

        }

 

 

Totusi, exista o problema – dintr-un thread nu se pot accesa DIRECT controale din alt thread – si de aceea avem instructiunea this. Invoke .Diferenta intre this.Invoke si este this.BeginInvoke aceea ca prima instructiune asteapta rezultatul actiunii, pe cind a doua doar executa si se intoarce imediat sa execute codul ramas.

 

De aceea exista controlul numit BackgroundWorker – care asigura ca , din evenimentul propriu generat, sa accesezi orice obiect de pe forma. O sa facem acest lucru pentru salvarea in XML a colectiei de Publisher-i in format XML.

.NET are o forma usoara de a salva o colectie/clasa in format XML , salvindu-i proprietatile.

Vom utiliza modalitatea cea  mai usoara de a face acest lucru

Marcam clasa Publisher si clasa colectie ColPublisher cu atributul de   [Serializable] :

 

[Serializable]

    public class ColPublisher : System.Collections.ObjectModel.KeyedCollection<string,Publisher>

 

[Serializable]

    public class Publisher

 

Acum o sa facem serializarea obiectului Publisher:

#region Serializer

        /// <summary>

        /// instanta pentru lazy load

        /// </summary>

        private static XmlSerializer m_Serializer;

        /// <summary>

        /// serializator pentru obiectul publisher

        /// </summary>

        private static XmlSerializer Serializer

        {

            get

            {

                if (m_Serializer == null)

                    m_Serializer = new XmlSerializer(typeof(Publisher));

 

                return m_Serializer;

            }

        }

 

        /// <summary>

        /// salveaza obiectul ca XML

        /// </summary>

        [XmlIgnore]

        public string XML

        {

            get

            {

                StringBuilder sb = new StringBuilder();

                EncodingStringWriter sw = new EncodingStringWriter(sb, Encoding.Default);

                XmlTextWriter xtw = new XmlTextWriter(sw);

                Serializer.Serialize(xtw, this);

                return sb.ToString();

 

 

            }

        }

        /// <summary>

        /// recreeeaza un Publisher dintr-un string XML

        /// </summary>

        /// <param name="XML">string care contine tot </param>

        /// <returns></returns>

        public static Publisher FromXML(string XML)

        {

            StringReader sr = new StringReader(XML);

            return Serializer.Deserialize(sr) as Publisher;

        }

       

miercuri, martie 21, 2007

iarasi teste free pe Brainbench
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

La pagina
 
Sunt teste de

 
Pentru cei pasionati, aveti si English Vocabulary,Personality Assessment, si altele.
Perioada limitata....

Post page: http://serviciipeweb.ro/iafblog/2007/03/21/iarasi+Teste+Free+Pe+Brainbench.aspx

Weblog post by 'admin' on 'iarasi teste free pe Brainbench'

Categories:.NET;programare

marți, martie 20, 2007

Avantajele Dataset/DataTable
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/

Am descoperit, cu uimire, virtutile Dataset si DataTable. Sunt extraordinare pentru proiecte one-shot!

Am avut de facut o integrare intre SQL SERVER, MySQL si ORACLE(date care trebuiau verificate, mapate, schimbate, vazut diferente, grupate, etc)

Dataset-ul s-a dovedit a fi unealta perfecta pentru join-uri intre tabele, pentru filtrari si altele.

Admiratia mea pentru OO a mai scazut un pic – pentru ca – chiar si cu CodeSmith – tot era destul de greu de scris asa ceva.

 

Post page: http://serviciipeweb.ro/iafblog/2007/03/20/Avantajele+DatasetDataTable.aspx

Weblog post by 'admin' on 'Avantajele Dataset/DataTable '

Categories:.NET;programare

sâmbătă, martie 17, 2007

Tutorial .NET - p13 - Log-area operaţiilor cu log4net
Va rog sa folositi acest URL NOU de la
http://serviciipeweb.ro/iafblog/


In orice aplicaţie este bine sa ţinem evidenta operaţiilor făcute de utilizator( ce a modificat sau chiar ce a văzut). In acest scop putem folosi fie mecanismul de trace din .net,  fie o soluţie proprie, fie Logging and Instrumentation Application Block(http://msdn2.microsoft.com/en-us/library/ms998162.aspx), fie log4net(http://logging.apache.org/log4net/

 

Vom utiliza in acest exemplu log4net .El suporta log-area operaţiilor in felurite moduri – in fişier, baza de date, email, telnet si multe altele.

Downloadati versiunea 1.2.10 de la adresa http://logging.apache.org/log4net/downloads.html si sa începem configurarea aplicaţiei. Copiaţi conţinutul folder-ului log4net-1.2.10\bin\net\2.0\debug in C:\Book\sharedDll si sa începem modificarea proiectului Windows pentru a înregistra ce a făcut utilizatorul

 

Deschidem Book.sln si deschidem App.Config. Acolo scriem următoarele imediat sub configuration:

  <configSections>

    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>

  </configSections>

  <log4net>

    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">

      <File value="Log4Net.log"/>

      <AppendToFile value="true"/>

      <rollingStyle value="Composite"/>

      <maximumFileSize value="1MB"/>

      <maxSizeRollBackups value="10"/>

      <datePattern value="yyyyMMdd"/>

      <layout type="log4net.Layout.PatternLayout">

        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n"/>

      </layout>

    </appender>

    <root>

      <level value="Debug"/>

      <appender-ref ref="RollingLogFileAppender"/>

    </root>

  </log4net>

 

 

După cum se vede, folosim RollingLogFileAppender ( adică un fişier a cărui denumire va fi diferita in fiecare zi după modelul datePattern ) de tipul Composite(daca depaseste  maximumFileSize atunci se creează un nou fişier in ziua respectiva).

 

Sa adăugam referinţa proiectului nostru (BookWin) dll-ul log4net.dll din sharedDll .Avem de făcut următoarele in Program.cs :

In funcţia Main scriem prima linie:

log4net.Config.XmlConfigurator.Configure();

apoi adăugam următorul membru in clasa Program:

public static readonly log4net.ILog logger = log4net.LogManager.GetLogger("RollingLogFileAppender");

 

Haide sa scriem in fişier de cite ori un utilizator adaugă un nou Publisher.

In frmPublisherAdd.cs, la evenimentul private void btnAdd_Click(object sender, EventArgs e) vom adăuga codul de log-are:

if (Program.logger.IsDebugEnabled)

                Program.logger.Debug("Adaugat publisher cu numele:" + p.Name);

 

Cam atit e de făcut. Acum rulaţi proiectul, adaugaţi un Publisher, si o sa vedeţi un fişier log4Net.log in care scrie următoarele:

 

<data> [1] DEBUG RollingLogFileAppender Adaugat publisher cu numele:newpub

 

 

E interesant la log4Net ca puteţi adăuga mai mulţi appender-i, astfel ca , de pilda, sa trimită si email de cate ori o modificare e făcuta.

 Observatie 1:

Pentru aplicatia Web, modificarile in Web.Config sunt aceleasi - iar in global.asax trebuie pusa linia urmatoare:

 void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup      
        log4net.Config.XmlConfigurator.Configure();   
    }

Observatie 2:

In loc sa punem codul in fiecare pagina de Web si Windowspe salvare, mai bine punem in fiecare cod de "salvare" al obiectelor- de pilda in public void Save()

Lectura obligatorie: documentaţia de log4net...

 

Post page: http://serviciipeweb.ro/iafblog/2007/03/17/Tutorial+NET+P13+Logarea+Opera%c5%a3iilor+Cu+Log4net.aspx

Weblog post by 'admin' on 'Tutorial .NET - p13 - Log-area operaţiilor cu log4net'

Categories:.NET;programare;tutoriale

 
Acest blog s-a mutat la http://www.serviciipeweb.ro/iafblog/