Risipa de key_press | Programare

Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Risipa de key_press | Programare - Programare .Net | Tehnici de programare | Tutoriale | Lectii si exemple

Ce “php chart library” mi se potriveste?

Vreau sa construiesc o aplicatie web in php care, la un moment dat, presupune desenarea unor grafice. In aplicatie or sa fie si cateva bannere (sau adwords), din cauza asta nu am gasit nici o librarie gratuita. Toate librariile sunt gratis pana cand incasezi primul leu din aplicatie.

Din acest motiv postez aici in speranta ca cineva imi poate recomanda o librarie php care sa imi deseneze grafice simple. Nu ma intereseaza facilitati de tip animatie, flash etc. Ceea ce ma intereseaza pe mine e sa aiba posibilitatea de a desena grafice de baza, pe care sa le pot atat randa cat si exporta in format png sau jpg.

Si inca o conditie: trebuie sa fie simplu de instalat, invatat si folosit – sunt “super-incepator” in php.

Vre-o sugestie?

log4net

Log4net este o biblioteca open-source folosiat de programatorii in .Net pentru afisarea/inregistrarea informatiilor legate de aplicatia la care lucreaza. Este utila pentru identificarea problemelor prin crearea unor inregistrari la runtime. Log4net nu influenteaza performanta. Este suportat de mai multe framework-uri si are un mecanism simplu pentru inregistrarea informatiilor catre mai multe tipuri de surse: consola, fisier, buffer de memorie, etc. Exista 5 nivele sau 5 categorii de informatii: Debug, Information, Warnings, Error, Fatal.

Destinatia unde va ajunge informatia pe care o dorim inregistrata se numeste Appender. Configurarea acestuia se face intr-un fisier XML, ca in exemplul urmator:

<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
    <log4net>
      <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
        <layout type="log4net.Layout.PatternLayout">
          <param name="Header" value="[Header]\r\n" />
          <param name="Footer" value="[Footer]\r\n" />
          <!-- data (%d), timp (%t), nivel (%p), nume logger (%c), mesaj (%m)-->
          <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
        </layout>
      </appender>
      <!--Appender-ul radacina in care specificam nivelul de informatii si appender-ul folosit-->
      <root>
        <level value="INFO" />
        <appender-ref ref="ConsoleAppender" />
      </root>
    </log4net>
  </startup>
</configuration>

Un cod simplu pentru care functioneaza logger-ul este acesta:

using System;
using log4net;
using log4net.Config;

namespace LogTest
{
    class Program
    {
        //se declara si se creeaza logger-ul
        private static readonly ILog Logger = LogManager.GetLogger(typeof(Program));

        static void Main(string[] args)
        {
            //initializarea log4net
            BasicConfigurator.Configure();

            //exemplu
            Logger.Debug("Informatii despre depanare.");
            Logger.Error("Informatii despre erori.");

            Console.ReadLine();
        }
    }
}

Log4net se poate descarca de pe logging.apache.org.

DotNetZip

Exista pe codeplex o biblioteca ce poate fi descarcata si folosita in mod gratuit si care permite arhivarea/dezarhivarea fisierelor si directoarelor. DotNetZip poate crea, citi, extrage sau actualiza arhive .zip.

Un exemplu de cod pentru crearea unui arhive in cadrul unui scenariu de backup:

using System;
using Ionic.Zip;

namespace ZipFolder
{
    class Program
    {
        static void Main(string[] args)
        {
            string applicationFolderPath = @"C:\Marius";

            try
            {
                Console.WriteLine(String.Format("Se incearca crearea unui backup pentru fisierele din directorul- {0}", applicationFolderPath));
                using (var zip = new ZipFile())
                {
                    zip.AddDirectory(applicationFolderPath);
                    zip.Save(applicationFolderPath + "\\Backup.zip");
                    Console.WriteLine(String.Format("Backup efectuat cu succes. Arhiva: {0} ", zip.Name));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Eroarea la arhivarea fisierelor de backup" + ex.Message);
            }

            Console.ReadLine();
        }
    }
}

O singura instanta a aplicatiei

Presupunem ca ne dorim ca aplicatia la care lucram sa ruleze intr-o singura instanta. Pentru a nu permite utilizatorilor sa creeze mai mult de o instanta pentru aplicatie, vom folosi clasa Mutex din namespace-ul System.Threading. Clasa Mutex permite accesul exclusiv la o resursa partajata intre mai multe procese, pentru un singur thread. Acest lucru diferentiaza obiectele Mutex fata de obiectele Monitor.

using System;
using System.Threading;
using System.Windows.Forms;

namespace SingleInstance
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool createdNew = false;

            //numele unic al aplicatiei
            Mutex mutex = new Mutex(true, "SingleInstamce", out  createdNew);

            if (createdNew)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            else
            {
                MessageBox.Show("Aplicatia este deja pornita");
            }
        }
    }
}

Samsung Omnia si syncronizarea

Am primit de la munca un telefon care ruleaza windows phone 7.5 si am vrut sa imi copiez contactele din vechiul meu Nokia n97 in noul telefon. M-am gandit sa fac aceasta operatie prin intermediul Outlook: sincronizez n97 cu Outlook apoi vin cu samsung si fac acelasi lucru!

Intre n97 si outlook sincronizarea a mers perfect, aplicatia ovi store si-a facut treaba simplu si eficient. In cateva minute aveam toate contactele salvate in Outlook. Am deconectat batranul nokia si am conectat mult mai tanarul Samsung Omnia. Windowsul meu (7) instalat in calculator a detectat telefonul si a inceput sa instaleze driverele corespunzatoare – m-as fi mirat sa fie probleme tocmai la drivere! In timpul instalarii driverelor am fost intrebat daca vreau sa instalez zune. Am downloadat si instalat acest program. Am sperat ca acest zune sa imi permita sincronizarea intre calculator (outlook) si telefon. Din pacate sincronizarea nu s-a referit la contacte (outlook) ci numai la muzica, filme si poze, deci…. neinteresant. Pana in momentul acesta nu am gasit o cale de a pune contactele din outlook in telefon.

Ceea ce telefonul stie sa faca e sa se sincronizeze cu un cont de gmail (m-am mirat ca stie asa ceva). Solutia, pe care o mai aman, deocamdata, in speranta ca o sa gasesc ceva ce mi s-ar parea logic si normal sa existe, adica sincronizare intre outlook si telefonul mobil, este o mare bila neagra pentru Microsoft, de la care ma asteptam sa aiba macar un minim de comunicare intre produsele proprii.

Adaugarea unui nod la sfarsitul listei inlantuite

Sa se adauge un nod la sfarsitul unui liste inlantuite.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Inserarea unui element se poate face la inceputul, la sfarsitul listei sau dupa un anumit nod, deja existent. Inserarea unui element la sfarsitul listei necesita verificarea conditiei pentru lista vida, parcurgerea acesteia si legarea elementului.

Rezolvarea in C#

Adaugarea unui nod la inceputul listei inlantuite

Sa se adauge un nod la inceputul unui liste inlantuite.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Inserarea unui element se poate face la inceputul, la sfarsitul listei sau dupa un anumit nod, deja existent. Inserarea unui element la inceputul listei este cazul cel mai simplu: se aloca nodul listei, se leaga de primul nod, care se va repozitiona.

Rezolvarea in C#

Lista simplu inlantuita

Sa se creeze o lista simplu-inlantuita din 3 noduri.

Analiza Programului
Listele simplu inlantuite sunt structuri de date dinamice, care, spre deosebire de vectori, nu sunt alocate ca blocuri de memorie omogene, ci ca elemente separate de memorie. Fiecare nod va contine adresa urmatorului nod si informatia utila. In acest mod, accesul la elementele listei se va face secvential.

Pentru crearea unei liste simplu inlantuite:
cream primul nod p;
cream celelalte noduri prin legarea fiecaruia de ultimul nod creat.

Rezolvarea in C#

Special folders

In crearea unor functionalitati este nevoie de accesarea directoarelor cu caracter special din Windows: Desktop, Documents, Favorites, Music, Videos, Fonts, Programs, Startup, Windows, Program Files, etc.

            //Windows special folders
            foreach (var value in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                Console.WriteLine(value);
            }

Caile catre aceste directoare se pot afla astfel:

            foreach (Environment.SpecialFolder folder in Enum.GetValues(typeof(Environment.SpecialFolder)))
            {
                var path = Environment.GetFolderPath(folder);

                Console.WriteLine(path);
            }

Aceste cai nu trebuie “hard-coded” pentru ca ele difera in functie de versiunea sistemului de operare si utilizatorul le poate schimba.