duminică, 20 iunie 2010

Clase

Clasele sunt niste intrumente foarte folositoare si distractive care fac programarea mai simpla si mai frumoasa. Ele fac parte din limbajele orientate pe obiect.
O clasa trebuie sa contina Date Membre (instante - sunt variabile) si Metode Membre (sunt functii si proceduri). Acestea trebuie sa fie precedate de modificatori de acces.
Modificatorii de acces sunt:
  • private - nu permite accesul la membrii clasei
  • protected - permite accesul la membrii clasei numai din clasele derivate
  • public - permite accesul la membrii clasei din afara ei  
In cadrul metodelor membre trebuie sa exista un constructor si un destructor pentru fiecare clasa. Dupa cum numele le spune, este usor de inteles ce fac fiecare.
In randurile urmatoare aveti trei exemple de clase scrise in 3 limbaje de programare: C++, PHP si Python.


C++
In exemplul urmator veti vedea ca nu am specificat un modificator de acces pentru datele membre. Am facut asta pentru ca in C++ faptul ca nu exista un modificator de acces inaintea unui grup de membrii se considera implicit modificatorul private. Astfel, datele membre au modificatorul protected, iar metodele au modificatorul public.

O alta particularitate este faptul ca nici constructorul si nici destructorul nu returneaza un tip.

#include "stdafx.h"
#include <iostream> 
using namespace std;

 //clasa Eroare folosita pentru exceptie
class Eroare
{
     char* mesaj;
public:
     //constructorul clasei: pune mesajul mesaj_e
     //in data membra mesaj
     Eroare(char* mesaj_e):mesaj(mesaj_e){}
     char* eroare()
    {
          return this->mesaj;
    }
};


//clasa Produse
class Produse
{
     //datele membre
     char* nume;
     int cantitate, pret;
     //metodele membre
public:
     //consructorul clasei
     Produse(char* nume_n, int cantitate_n, int pret_n)
     {
           this->nume = nume_n;
           this->cantitate = cantitate_n;
           this->pret = pret_n;
     }
     //metoda Vinde
     void Vinde(int cantitate_v)
    {
          //aruncarea exceptiei daca cantitatea din stoc e prea mica
          if(this->cantitate < cantitate_v)
          {
                 throw Eroare("Nu aveti produse suficiente.");
          }
          this->cantitate = this->cantitate - cantitate_v;
     }

     //destructorul clasei
    ~Produse();
};

//partea de test
  int main()
{
     //initializarea clasei si a numarului de produse pe care le vindem
     Produse *instrument;
     instrument = new Produse("chitara", 5, 320);
     int nrProduseDeVazare = 7;


    //incercam sa vindem, iar daca nu reusim, returnam mesajul
    //pe care l-am aruncat in metoda Vinde() prin intermediul exceptiei
    try {
         instrument->Vinde(nrProduseDeVazare);
    } catch(Eroare& e) {

          cout<<e.eroare()<<endl;
    } 


   return 0;
}



PHP
In PHP toti membrii trebuie sa aiba inaintea lor un modificator de acces. Dar, dupa cum se vede in exemplu, lucrurile sunt un pic mai simple si mai rapide decat la C++.

//clasa Produse
class Produse
{
    //datele membre ale clasei, nu pot fi accesate din afara clasei
    protected $nume, $cantitate, $pret;
    //metodele clase, pot (public) sau nu pot(protected) fi accesate din afara clasei
    //constructorul clasei
    public function __construct($nume_n, $cantitate_n, $pret_n)
    {
          $this->nume = $nume_n;
          $this->cantitate = $cantitate_n;
          $this->pret = $pret_n;
    }
    //metoda Vinde
    public function vinde($cantitate_v)
   {
          //aruncarea exceptiei daca cantitatea din stoc este prea mica
          if($this->cantitate < $cantitate_v)
          {
                  throw new Exception('Nu aveti produse suficiente.');
          }
          $this->cantitate = $this->cantitate - $cantitate_v;
    }
    //destructorul clasei
    public function __destruct() {}
}

//partea de test
//initializarea clasei si a numarului de produse pe care dorim sa le vindem
$instrument = new Produse("chitara", 5, 320);
$nr_produse_de_vanzare = 7;

//incercam sa vindem, iar, daca nu reusim, returnam mesajul pe care l-am aruncat in metoda vinde
try {
      $instrument->vinde($nr_produse_de_vanzare);
} catch (Exception $e) {
      echo 'Eroare: ', $e->getMessage(), "\n";
}



Python

Python prin natura lui e "altfel". Are si el un constructor, __init__, respectiv un destructor, __del__, dar ceea ce ii lipseste sunt modificatorii de acces. In Python toti membrii unei clase sunt public implicit si nu se poate schimba asta. Totusi, o regula intre programatorii Python spune ca in cazul in care un membru apare de forma _nume acesta sa fie considerat protected, chiar daca in realitate e tot public.

#clasa Eroare care va fi o exceptie
class Eroare(Exception):
      def __init__(self, mesaj_e):
           self.mesaj = mesaj_e

#clasa Produse
class Produse:
      #constructorul clasei in cadrul caruia se definesc datele membre
      def __init__(self, nume_n, cantitate_n, pret_n):
          self.nume = nume_n
          self.cantitate = cantitate_n
          self.pret = pret_n
      #metoda Vinde
      def vinde(self, cantitate_v):
          #aruncarea exceptiei daca cantitatea din stoc e prea mica
          if(self.cantitate < cantitate_v):
                raise Eroare('Nu sunt produse suficiente.')
          self.cantitate = self.cantitate - cantitate_v

#partea de test
#initializarea clasei si a numarului de produse pe care le vindem
instrument = Produse('chitara', 5, 320)
nrProduseDeVanzare = 7

#incercam sa vindem, iar, daca nu reusim, afisam mesajul pe care l-am
#trimis prin clasa Eroare.
try:
      instrument.vinde(nrProduseDeVanzare)
except Eroare as e:
       print 'Eroare: ', e.mesaj
       raise

marți, 15 iunie 2010

Python 2.6, Django si Wamp pe Windows

Cu cateva zile in urma am incercat ore intregi sa configurez Python in asa fel incat sa pot scrie aplicatii web. Ar fi fost foarte rapid si usor daca as fi stiut exact ce trebuie de la inceput.


Python 2.6 si programarea pe web

Daca pentru aplicatiile ce ruleaza printr-un simplu dublu-click e usor de instalat si configurat Python, pentru aplicatiile web lucrurile devin un pic mai complicate. In primul rand, pentru a programa rapid si eficient, e nevoie de un framework. Eu am ales Django pentru ca are o documentatie foarte buna pe site. Imediat dupa asta e nevoie de o baza de date cu care Python sa interactioneze. Eu am ales MySQL datorita obisnuintei de a folosi PHP si MySQL. Problema e ca Python nu stie sa interactioneze cu bazelele de date, deci e nevoie de un modul care sa ii explice ce si cum. Apoi apare problema rularii si testarii aplicatiilor. Pentru asta Django ofera un server care e foarte simplu de folosit, insa nu poate fi folosit intr-un proiect adevarat. Drept urmare, trebuie folosit un server pentru productie. Apache e potrivit. Pentru a nu imi bate capul cu mai multe instalari si configurari, m-am gandit ca ar fi bine sa folosesc tot Wamp si pentru Python la fel cum il folosesc pentru PHP.


Cea mai buna combinatie pe care am gasit-o intre versiuni a fost: Python 2.6, MySQL-Python 1.2.3c,  Django 1.2 si versiunea de Wamp care are Apache 2.2.10 si MySQL 5.1.


Python si Environment variables (primele setari)

Pentru a putea parcurge mai usor Quick Start-ul din cadrul documentatiei de pe site-ul Django, trebuie sa puteti accesa intr-un mod cat mai simplu Python IDLE. In ajutor vine Windows-ul cu asa numitele variabile de mediu (Environment variables).

Ceea ce trebuie sa se intample e ca atunci cand se scrie python in terminalul de comenzi MS-DOS (adica in Command Prompt) sa se deschida interpretorul Python. In caz contrar, de fiecare data cand apare in exemple ceva de genul python django-admin.py va trebui scris de genul c:/Python26/python.exe django-admin.py si e destul de incomod.

Deci, dupa ce s-a instalat Python, dati click-dreapta pe My Computer, apoi urmati calea Properties->Advanced->Environment Variables

Aici trebuie sa apara o fereastra cu doua liste: User variables si System variables.

User variables 1: Dati click pe New, apoi in casuta Variable name scrieti python cu litere mici, iar in casuta Variable value scrieti calea catre python.exe . In cazul meu, D:\Python26\python.exe. 

User variables 2: Tot la User Variables, adaugati o noua variabila. Deci, click pe New, apoi la Variable name scrieti PYTHONPATH cu litere mari, iar la Variable value scrieti ceva de forma asta D:\Python26;D:\Python26\DLLs;D:\Python26\LIB;D:\Python26\LIB\LIB-TK

System variables: Aici cautati Path in lista, daca nu o gasiti, atunci creati variabila. Daca o gasiti, atunci click pe Edit, iar la Variable value la sfarsit adaugati calea catre directorul Python. In cazul meu calea e D:\Python26; .

In unele cazuri, pentru a duce la bun sfarsit configurarea, e nevoie de un restart.

In timp ce setati variabilele de mediu, trebuie sa fiti foarte atenti la partitie si numele directorului.

Dupa ce ati terminat, pentru a testa, deschideti consola de comenzi MS-DOS (ori de la Start->Programs->Accessories->Command Prompt ori de la Start->Run->cmd) si scrieti python apoi dati enter. Daca variabilele de mediu au fost create corect, atunci se va deschide interpretorul Python si puteti scrie ceva de genul print "salut", altfel va da eroarea 'python' is not recognized as an internal or external command, operable program or batch file. Deci, fiti foarte atenti la setarea variabilelor de mediu pentru a nu va da batai de cap.


Django - instalare

Django trebuie sa se instaleze foarte usor fara niciun fel de probleme. Aveti grija doar sa se dezarhiveze corect.

Sa presupunem ca ati dezarhivat Django in folderul C:/Django-1.2.1. Deschideti terminalul de comenzi MS-DOS (command prompts). In mod normal pe ultima linie scrie ceva de forma C:/Documents and Settings/Administrator . Scrieti cd \ pentru a merge in directorul radacina (adica in C:/) sau d: ori e: in cazul in care ati dezarhivat Django in D:/Django-1.2.1, respectiv E:/Django-1.2.1. Apoi scrieti cd django-1.2.1 pentru a intra in directorul Django-1.2.1.  Acum dati comanda python setup.py install pentru a instala Django. Daca ati instalat corect Python si ati setat bine variabilele de mediu, nu trebuie sa dea nicio eroare.


Wamp - instalare

Wamp se instaleaza foarte usor, cu Next, Next, Next si Finish. Trebuie instalat inainte de a trece la pasul urmator pentru ca modulul MySQL va avea nevoie de MySQL 5.1 care se instaleaza odata cu WAMP.


MySQL-Python 1.2.3c - instalare

Deoarece Python nu stie sa interactioneze cu bazele de date aveti nevoie de un modul care sa ii spuna cum sa faca asta.  Eu am ales MySQL-Python 1.2.3c pentru ca e singurul modul care mi-a mers. Desi acum exista MySQL 5.2, eu nu am gasit un modul pentru python functional pentru versiunea 5.2. Nu incercati sa instalati modulul din linia de comanda, o sa dea multe erori pentru ca are nevoie de tot felul de lucruri instalate in sistem si nu merita. In schimb, cautati pachetul de instalare, care e un fisier .exe, si instalati-l simplu dand Next, Next, Next si Finish.

Pentru a testa daca functioneaza dupa instalare, deschideti python din terminalul de comenzi si tastati import MySQLdb exact asa cum am scris eu cu litere mari si mici. Daca nu da nicio eroare, inseamna ca totul e bine.


Din acest moment puteti parcurge documentatia Django fara nicio problema. Mai departe voi explica ce trebuie facut ca Apache sa invete sa foloseasca Python la fel ca PHP.


Wamp si mod WSGI - configurare Apache

Desi Apache vine cu o serie de module folositoare, nu aduce si un modul dedicat lui Python. Din fericire Google e un mare fan Python dupa cum se vede in lista cu sponsori. Drept urmare, daca dati o cautare dupa mod wsgi veti gasi modulul chiar pe unul din site-urilor Google. Descarcati ultima versiune a modului care se potriveste cu Apache 2.2 si Python 2.6. O data descarcat fisierul .so, redenumiti-l in mod_wsgi.so si mutati-l in ...\wamp\bin\apache\Apache2.2\modules , in cazul meu locatia exacta e C:\wamp\bin\apache\Apache2.2.10\modules. 

Dati click pe iconita Wamp de langa ceas si parcurgeti meniul astfel: Apache->httpd.conf. Apare in fisier text deschis cu Notepad. Cautati o lista in care liniile incep cu LoadModule, iar la sfarsitul ei, pe linie noua, adaugati: LoadModule wsgi_module modules/mod_wsgi.so .

Atentie: in codul care urmeaza stergeti liniutele de dupa si dinaintea semnelor mai mic, respectiv mai mare.

Apoi cautati mai jos:

<-Directory "cgi-bin"->
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
<-/Directory->

Odata gasit, adaugati sub el:

#PYTHON
<-Directory "calea_catre_directorul_cu_proiecte"->
     AllowOverride None
     Options None
     Order allow,deny
     Allow from all
<-/Directory->

In cazul meu calea_catre_directorul_cu_proiecte este: d:/Python26/web/ .

Mai ramane un singur lucru de adaugat in httpd.conf. La sfarsitul textului pe linie noua scrieti: WSGIScriptAlias / "calea_catre_directorul_cu_proiecte/proiect/django.wsgi" . In cazul meu arata asa: WSGIScriptAlias / "D:/Python26/web/mysite/django.wsgi" . Daca proiectul pe care l-ati creat cu django-admin.py se numeste site_despre_prajituri atunci in loc de proiect (deci mysite in cazul meu) o sa scrieti site_despre_prajituri .

Dupa cum ati vazut, calea duce catre un fisier cu numele django.wsgi. Trebuie sa creati fisierul asta. Mergeti in folderul proiectului, in cazul meu D:/Python26/web/mysite/ , si creati fisierul django.wsgi. Deschideti-l cu un editor (poate fi Notepad sau un editor pentru limbaje de programare, in niciun caz nu puteti folosi Word sau Writer) si puneti urmatorul text in el apoi salvati:

import os, sys
sys.path.append('calea_catre_directorul_cu_proiecte')
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

In loc de mysite puneti numele proiectului pe care l-ati creat. Dupa cum am spus, poate fi site_despre_prajituri in loc de mysite. Sa fiti atenti doar sa pastrati .settings . Iar calea_catre_directorul_cu_proiecte in cazul meu, dupa cum am mai spus, este d:/Python26/web/ .


Gata

Tot ce mai trebuie sa faceti e sa restartati serverul Apache. Puteti face asta dand click pe iconita Wamp de langa ceas si apoi click pe Restart All Services sau Apache->Service->Restart Service.

Primul mesaj

Salut!
  Sunt Nicu si am creat pagina asta pentru a usura instalarea unor programe sau module. De altfel o sa pun si exemple de programe sau o sa explic unele concepte.
  De ce Ninigomi? Pentru ca Minimo este deja folosit de Mozilla.