28 octombrie 2011

Executii ciclice in PL/SQL

Se da un tabel student cu campurile:

nr_mat | nume | grupa | medie | bursa

Numerele matricole vor fi introduse consecutiv.

1) Setare bursa pt toti studentii dupa formula:

media < 6 => bursa = 0
media < 7 => bursa = media*100
media < 8 => bursa = media*120
media < 9 => bursa = media*150
media < 10 => bursa = media*200
media = 10 => bursa = media*250


declare
nr_mat_s number(2);
media_s number(10,2);
bursa_s number(4,2);
contor number(3):=1;
begin

LOOP
select nr_mat, medie, bursa into nr_mat_s, media_s, bursa_s
from student
where nr_mat = contor;

if media_s < 6 then
update student set bursa = 0 where nr_mat = nr_mat_s;
elsif media_s < 7 then
update student set bursa = medie*100 where nr_mat = nr_mat_s;
elsif media_s < 8 then
update student set bursa = medie*120 where nr_mat = nr_mat_s;
elsif media_s < 9 then
update student set bursa = medie*150 where nr_mat = nr_mat_s;
elsif media_s < 10 then
update student set bursa = medie*200 where nr_mat = nr_mat_s;
else
update student set bursa = medie*250 where nr_mat = nr_mat_s;
end if;

contor:=contor+1;
EXIT WHEN CONTOR = 11;
END LOOP;

EXCEPTION
WHEN NO_DATA_FOUND then
dbms_output.put_line('Nicio modificare');
END;
/


2) Pt fiecare grupa, adaugati 10% la bursa studentilor cu media >= 8, dar numai daca media grupei din care fac parte >= 7.60

declare
nr_mat_s number(2);
media_s number(10,2);
bursa_s number(4,2);
medie_grupa number(10,2);
grupa_s varchar2(5);
contor number(3):=1;
begin

LOOP
select nr_mat, medie into nr_mat_s, media_s
from student
where medie>=8 AND nr_mat = contor AND grupa IN
(select tabel.g
from
(select grupa g, avg(medie) a
from student
group by grupa) tabel
where tabel.a > 8
);

update student set bursa = bursa*1.1 where nr_mat = nr_mat_s;

contor:=contor+1;
EXIT WHEN CONTOR = 11;
END LOOP;

EXCEPTION
WHEN NO_DATA_FOUND then
dbms_output.put_line('Nicio modificare');
END;
/

3) Pentru fiecare student, afisati o linie de raport cu coloanele:

nr_mat | nume | grupa | medie | medie_grupa | bursa | obs
obs:
medie < 5 => obs = "Repetent"
medie = 10 => obs = "Sef de promotie"

set serveroutput on;

declare
nr_mat_s number(2);
medie_s number(10,2);
bursa_s number(15,2);
medie_grupa number(10,2);
grupa_s varchar2(5);
nume_s varchar2(30);
avg_s number(10,4);
obs varchar2(30);
contor number(3):=1;

begin
dbms_output.put_line(
rpad('Nr_mat',6) || rpad('Nume', 20) || rpad('Grupa', 5) || rpad('Medie', 10) ||
rpad('Medie_grupa', 11) || rpad('Bursa', 10) || rpad('Obs', 20)
);

LOOP
select s.nr_mat, s.nume, s.grupa, s.medie, tabel.a, s.bursa into nr_mat_s, nume_s, grupa_s, medie_s, avg_s, bursa_s
from student s, (select grupa g, avg(medie) a
from student
group by grupa) tabel
where s.grupa = tabel.g AND contor = s.nr_mat;

if medie_s < 5 then obs := 'Repetent';
elsif medie_s = 10 then obs := 'Sef promotie';
else obs := '-';
end if;

dbms_output.put_line(
rpad(to_char(nr_mat_s), 6) || ' ' || rpad(nume_s, 20) || ' ' || rpad(grupa_s, 5) || ' ' ||
rpad(to_char(medie_s), 10) || ' ' || rpad(to_char(avg_s), 11) || ' ' || rpad(to_char(bursa_s), 10) || ' ' ||
rpad(obs,20)
);

contor := contor + 1;
EXIT WHEN CONTOR = 11;
END LOOP;

EXCEPTION
WHEN NO_DATA_FOUND then
dbms_output.put_line('Nicio modificare');
END;
/

Performantele calculatoarelor paralele

Parametrii sunt:
* speed-up: S(n) = T(1)/T(n)
* eficienta: E(n) = S(n)/n
* redundanta: R(n) = O(n)/O(1) // O(n) = nr de operatii efectuate pt n procesoare
* utilizare: U(n) = R(n)*E(n)
* calitate: Q(n) = S(n)*E(n)/R(n)

Relatii importante:
1/n <= E(n) <= U(n) <= 1
0 <= Q(n) <= S(n) <= n

Simulare pentru:
T(1) = n^2
T(n) = 6*n^2/(n+5)
O(1) = n^2-1
O(n) = n^2+n*log(n)

program sursa (Matlab)

CRC is back!

Despre calculul CRC am mai scris si aici.
Dar de data asta am calculat mult mai explicit (babeste);


Pe scurt, avem doua programe numite Generator si Verifier (~ Sender si Receiver din foto)
* Generatorul ia ca input, de la tastatura, un sir de biti de m caractere numit "Data" si un sir de biti de (n+1) caractere, numit Divisor. Sirul de biti este simulat in C++ cu un string ale carui valori sunt 1 si 0 (dar nefacandu-se verificarea inputului);
* Lui Data i se ataseaza n biti de 0, si se "imparte" la Divisor (important, divizorul trebuie sa aiba primul si ultimul bit de 1).
* Impartirea nu este una normala ci una numita "Modulo 2 Division" (link) de unde ne intereseaza restul, care devine CRC. Am implementat-o pur si simplu babeste, asa cum se face pe hartie (dar asta nu inseamna ca e si usor de inteles...);
* Datei initiale i se va atasa acest CRC, servit ca output intr-un fisier, alaturi de Divisor, pe randul doi. Asta este ceea ce face Generator;
* Verifier ia din acelasi fisier Data si Divisor si le imparte unul la altul (in acelasi mod);
* Daca restul este 0, datele au fost transmise corect de la "sender" la "receiver", altfel exista erori.
* Pentru simularea erorii, intervine programul Alter, care intrand in fisierul scris de Generator, inverseaza random un bit din Data (oricare dar nu cel mai semnificativ); daca se ruleaza Verifier, rezultatul va fi eroare.

Programele se pot descarca de aici.

20 octombrie 2011

Concepte de baza in IOS-ul routerelor


Pornind de la aceasta configuratie:

* Informatii despre versiunea de IOS, viteza procesorului, dimensiunea NVRAM, nr si tipul interfetelor existente:

in dynagen:
start Penny
telnet Penny

in Penny:
enable
show version
show running-config

* Configurarea routerelor cu nume si adresa ip (ex. pt Penny):
configure terminal
hostname Penny
interface 1/0
ip address 191.105.157.1 255.255.255.0
no shutdown

* Salvarea configuratiei curente:
copy running-config startup-config

* Configurarea unui echipament pt a putea fi accesat prin telnet, cu username si parola. Parola de enable sa fie secreta si salvata ca md5.
configure terminal
enable secret parola
username bumblebee password bumble

* Configurarea unui banner (mesaj de intampinare)
configure terminal
banner motd * Entering router... * &

* Afisare toate pachetele primite de router in timp real
debug ip packet
configure terminal
do ping google.com

12 octombrie 2011

Dynamips / Dynagen in Ubuntu

Dynagen este un emulator folosit pentru simularea mai profunda/reala a unor retele conectate prin routere Cisco.

INSTALARE DYNAMIPS/DYNAGEN IN UBUNTU:

sudo apt-get install dynamips
sudo apt-get install dynagen

Presupunem ca vrem sa implementam aceasta topologie:

La scrierea fiecarui fisier de configurare, trebuie sa rulam imaginea reala de IOS (sistemul de operare al routerelor Cisco), care se poate descarca de aici (daca aveti cont pe curs.cs) sau de aici (torrent). Binarul trebuie inclus la "image".

FISIER DE CONFIGURARE:

[localhost]

[[3640]]

image = /home/anna/Desktop/c3640-js.bin

ram = 160

[[router R1]]

model = 3640

slot0 = NM-4E

slot1 = NM-4T

E0/0 = R3 E0/0

E0/1 = s1 1

[[router R3]]

model = 3640

slot0 = NM-4E

E0/0 = R1 E0/0

E0/1 = R4 E0/0

E0/2 = R5 E0/0

E0/3 = R2 E0/0

[[router R2]]

model = 3640

slot1 = NM-4T

slot0 = NM-1E

E0/0 = R3 E0/3

[[router R5]]

model = 3640

slot1 = NM-4T

slot0 = NM-1E

E0/0 = R3 E0/2

[[router R4]]

model = 3640

slot0 = NM-4E

slot1 = NM-4T

E0/0 = R3 E0/1

E0/1 = s1 2

[[ETHSW s1]]

1 = access 1

2 = access 2

Acest fisier trebuie sa aiba extensia .net
RULARE

In consola:

dynamips -H 7200 &
dynagen task.net

In continuare se poate afisa configuratia creata:

list

Pentru fiecare router, modelul ales este 3640.

Slot0 si slot1 exprima prima cifra din notatia E0/x (Ethernet slot 0, portul x) sau S1/y (serial slot 1, port y).

Tipurile sloturilor pot fi: NM-4E (Ethernet cu 4 porturi), NM-4T (seriala cu 4 porturi), NM-1E (Ethernet cu un port), etc.

Pentru interfetele unui router, se asigneaza routerul la care se face conexiunea si interfata acestuia, iar in cazul unui switch legaturilor li se asigneaza tipul lor (access) si VLAN-ul (1,2).