Diferență între revizuiri ale paginii „PC Laborator 1”

De la WikiLabs
Jump to navigationJump to search
 
(Nu s-au afișat 36 de versiuni intermediare efectuate de alți 5 utilizatori)
Linia 1: Linia 1:
 
= Obiective =
 
= Obiective =
  
În urma parcurgerii acestui laborator veți fi capabili:
+
În urma parcurgerii acestui laborator veți fi capabili să folosiți comenzi de bază în sistemul de operare Linux.
 
 
* să folosiți comenzi de bază în sistemul de operare Linux;
 
* să scrieți și compilați programe simple în limbajul C;
 
* să utilizați programul Make pentru a compila automat programele scrise.
 
  
 
= Sistemul de operare [https://en.wikipedia.org/wiki/Linux Linux] - programe =
 
= Sistemul de operare [https://en.wikipedia.org/wiki/Linux Linux] - programe =
  
Majoritatea utilizatorilor de Windows pornesc de la premisa că Linux este greu de folosit și că nu pot rula programele cu care sunt obișnuiți în Windows. Cu toate că există, într-adevăr unele aplicații care nu sunt portate și nu pot fi rulate în Linux (cum ar fi o mare parte din jocuri precum și unele platforme foarte specifice de simulare și sinteză), majoritatea aplicațiilor sunt disponibile în Linux. Următoarea listă prezintă alternative ale aplicațiilor tradiționale, care pot fi rulate în Linux:
+
Majoritatea utilizatorilor de Windows pornesc de la premisa că Linux este greu de folosit și că nu pot rula programele cu care sunt obișnuiți. Cu toate că există, într-adevăr, unele aplicații care nu pot fi rulate (cum ar fi o mare parte din jocuri precum și unele platforme foarte specifice de simulare și sinteză), majoritatea aplicațiilor sunt disponibile în Linux. Următoarea listă prezintă alternative ale aplicațiilor tradiționale:
  
* browser web: Google Chromium Browser (Chrome), Mozilla Firefox
+
* browser web: Google Chromium Browser (Chrome), Mozilla Firefox, Opera
 
* player video: VLC Media PLayer
 
* player video: VLC Media PLayer
 
* editor foto: Inkscape, Gimp
 
* editor foto: Inkscape, Gimp
 
* suită office: LibreOffice (alternativă la Microsoft Office), Microsoft Office 365 - online, Google Docs - online
 
* suită office: LibreOffice (alternativă la Microsoft Office), Microsoft Office 365 - online, Google Docs - online
* real time messenger: Pidgin
+
* real time messenger: Pidgin, Skype, Hangouts (online)
 
* medii de dezvoltare software: Netbeans, Eclipse, Code::Blocks, IntelliJ
 
* medii de dezvoltare software: Netbeans, Eclipse, Code::Blocks, IntelliJ
* procesare de semnal: Octave (alternativă la Matlab)
+
* procesare de semnal: Matlab, Octave (alternativă la Matlab)
 
+
* sinteză și simulare de circuite digitale: Xilinx ISE, Xilinx Vivado, Altera Quartus
Pentru anumite programe, este de asemenea posibilă rularea acestora într-un emulator de Windows, numit wine.
 
  
 +
Pentru anumite programe, este de asemenea posibilă rularea acestora într-un emulator de Windows, numit <code>wine</code>.
 +
Exista si alternativa de a instala <code>Windows Subsystem for Linux</code> (WSL1 sau WSL2) in Windows 10 (https://docs.microsoft.com/en-us/windows/wsl/install-win10)
 
== Instalare de programe ==
 
== Instalare de programe ==
  
Instalarea unui program in Linux se face foarte ușor, cu o singură comandă (dacă aplicația este în baza de date a distribuției). Spre exemplu, pentru a instala GNU Octave:
+
Instalarea unui program in Linux se face foarte ușor, cu o singură comandă (dacă aplicația este în baza de date a distribuției). Spre exemplu, pe o distribuție din familia Debian (Debian, Ubuntu, Mint, etc.), pentru a instala GNU Octave:
  
 
  sudo apt-get install -y octave
 
  sudo apt-get install -y octave
Linia 34: Linia 31:
 
= Linux [https://en.wikipedia.org/wiki/Bash_(Unix_shell) Bash] =
 
= Linux [https://en.wikipedia.org/wiki/Bash_(Unix_shell) Bash] =
  
Noțiunile legate de utilizarea și administrarea sistemului de operare Linux sunt necesare și obligatorii pentru un inginer electronist. În afară de faptul că Linux este un OS open-source stabil și sigur, atractivitatea lui vine în special din posibilitatea de a automatiza procese prin scrierea de scripturi în limbaje de scripting puternice și din faptul că este cel mai răspândit sistem de operare folosit pentru dispozitive embedded. În continuare se vor prezenta noțiuni și comenzi necesare pe parcursul laboratorului de Programarea Calculatoarelor.
+
'''<span style="color: green">Daca nu aveti nicio distribuitie de Linux instalata, puteti folosi pentru acest laborator terminalul online de aici: https://cocalc.com/doc/terminal.html</span>
 +
Noțiunile legate de utilizarea și administrarea sistemului de operare Linux sunt necesare și obligatorii pentru un inginer electronist. În afară de faptul că Linux este un sistem de operare ''open-source'' stabil și sigur, atractivitatea lui vine în special din posibilitatea de a automatiza procese prin scrierea de scripturi în limbaje de scripting puternice și din faptul că este cel mai răspândit sistem de operare folosit pentru dispozitive ''[https://en.wikipedia.org/wiki/Embedded_system embedded]''. În continuare se vor prezenta noțiuni și comenzi necesare pe parcursul laboratorului de Programarea Calculatoarelor.
  
 
Pentru a obține informații legate de utilizarea unei comenzi, în terminalul (consola) Linux se poate da comanda <code style="color: green">man <comanda></code> pentru a deschide manualul la pagina comenzii respective. Odată deschis, se poate naviga cu săgețile sus/ jos și pagina se închide cu tasta 'q'.  
 
Pentru a obține informații legate de utilizarea unei comenzi, în terminalul (consola) Linux se poate da comanda <code style="color: green">man <comanda></code> pentru a deschide manualul la pagina comenzii respective. Odată deschis, se poate naviga cu săgețile sus/ jos și pagina se închide cu tasta 'q'.  
Linia 44: Linia 42:
 
* '''pracsis01''' reprezintă numele calculatorului (host name) și care ar trebui să fie unic în rețea; în lipsa acestuia va apărea '''localhost''';
 
* '''pracsis01''' reprezintă numele calculatorului (host name) și care ar trebui să fie unic în rețea; în lipsa acestuia va apărea '''localhost''';
 
* '''~/Desktop''' reprezintă directorul curent și este urmat de caracterul '$'
 
* '''~/Desktop''' reprezintă directorul curent și este urmat de caracterul '$'
 
  
 
<div class="regula">'''<font color="red">Atenție:</font>''' Linux este '''CASE-SENSITIVE''', asta înseamnă că se face diferența între literele mari și mici, și în cadrul comenzilor, și în cadrul numelor de fișiere/ directoare.</div>
 
<div class="regula">'''<font color="red">Atenție:</font>''' Linux este '''CASE-SENSITIVE''', asta înseamnă că se face diferența între literele mari și mici, și în cadrul comenzilor, și în cadrul numelor de fișiere/ directoare.</div>
  
 +
Pentru un tutorial mai detaliat, ce descrie un număr mai mare de comenzi, puteți vizita http://linuxcommand.org
  
 
== Structura de directoare in Linux ==
 
== Structura de directoare in Linux ==
  
Toate fișiere și directoarele în Linux sunt plasate într-o ierarhie de tip arbore, unde directorul din vârf se numește rădăcină (''root'') și este reprezentat prin caracterul ''slash'' (/). Conținului unui director rădăcină arată în felul următor:
+
Toate fișierele și directoarele în Linux sunt plasate într-o ierarhie de tip arbore, unde directorul din vârf se numește rădăcină (''root'') și este reprezentat prin caracterul ''slash'' (/).  
  
[[Fișier:Linux_dir.gif]]
+
Structura de directoare și fișiere în Linux este descrisă în detaliu [http://www.tecmint.com/linux-directory-structure-and-important-files-paths-explained/ aici].
  
 
În cadrul laboratorului de PC, vom lucra în interiorul directorului personal al utilizatorului ''student'', care este implicit <code style="color: blue">/home/student</code> (''slash'' este separatorul de cale în Linux, analog cu ''backslash'' din Windows).
 
În cadrul laboratorului de PC, vom lucra în interiorul directorului personal al utilizatorului ''student'', care este implicit <code style="color: blue">/home/student</code> (''slash'' este separatorul de cale în Linux, analog cu ''backslash'' din Windows).
Linia 60: Linia 58:
  
 
== Instrucțiuni pentru lucrul cu sistemul de fișiere ==
 
== Instrucțiuni pentru lucrul cu sistemul de fișiere ==
 +
 +
=== Aflarea directorului curent (pwd) ===
 +
 +
Directorul curent se vede în mod normal în prompt, dar în cazul în care acest prompt nu este vizibil sau a fost modificat, sau directorul curent trebuie utilizat în cadrul unui script, comanda care îl afișează pe acesta pe ecran este <code style="color: green">pwd</code> (Print Working Directory).
 +
 +
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> pwd'''
 +
  '''/home/student/Desktop'''
  
 
=== Navigare între directoare (cd) ===
 
=== Navigare între directoare (cd) ===
Linia 80: Linia 85:
  
 
Această comandă va eșua dacă directorul specificat nu există, sau nu aveți acces la el sau la unul directoarele părinte.
 
Această comandă va eșua dacă directorul specificat nu există, sau nu aveți acces la el sau la unul directoarele părinte.
 
  
 
<div class="regula">'''Observație:''' Pentru a vă întoarce cu un nivel mai sus în ierarhia de directoare, se poate folosi ”..” în loc de numele directorului. De exemplu:</div>
 
<div class="regula">'''Observație:''' Pentru a vă întoarce cu un nivel mai sus în ierarhia de directoare, se poate folosi ”..” în loc de numele directorului. De exemplu:</div>
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cd ../Desktop/../Desktop/../../student/Desktop'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cd ../Desktop/../Desktop/../../student/Desktop'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> '''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> '''
 
=== Aflarea directorului curent (pwd) ===
 
 
Directorul curent se vede în mod normal în prompt, dar în cazul în care acest prompt nu este vizibil sau a fost modificat, sau directorul curent trebuie utilizat în cadrul unui script, comanda care îl afișează pe acesta pe ecran este <code style="color: green">pwd</code> (Print Working Directory).
 
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> pwd'''
 
  '''/home/student/Desktop'''
 
  
 
=== Crearea unui director (mkdir) ===
 
=== Crearea unui director (mkdir) ===
  
Pentru a crea un director inexistent, se folosește comanda <code style="color: green">mkdir</code> (MaKe DIRectory) specificând numele directorului care se vrea creat:
+
Pentru a crea un director se folosește comanda <code style="color: green">mkdir</code> (MaKe DIRectory) specificând numele directorului care se vrea creat:
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~ $</span> mkdir work'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~ $</span> mkdir work'''
 
Această comandă poate eșua dacă nu aveți acces la directorul părinte, dacă directorul părinte nu există, sau dacă directorul care se dorește creat există deja. Pentru a crea un director în situația în care directorul părinte nu există, se poate utiliza fanionul <code style="color: green">-p</code>:
 
Această comandă poate eșua dacă nu aveți acces la directorul părinte, dacă directorul părinte nu există, sau dacă directorul care se dorește creat există deja. Pentru a crea un director în situația în care directorul părinte nu există, se poate utiliza fanionul <code style="color: green">-p</code>:
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mkdir -p ~/work/pc/F/group1/ion/lab1'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mkdir -p ~/work/pc/F/group1/ion/lab1'''
  
=== Ștergerea unui director gol (rmdir) ===
+
=== Ștergerea unui fisier sau a unui director (rm) ===
 
 
Pentru a șterge un director gol, se poate folosi comanda <code style="color: green">rmdir</code> (ReMove Directory):
 
 
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mkdir test'''
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> rmdir test'''
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> '''
 
 
 
Dacă directorul nu este gol, atunci se va genera o eroare:
 
 
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mkdir -p test/test2'''
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> rmdir test'''
 
  '''rmdir: failed to remove ‘test’: Directory not empty'''
 
 
 
În acest caz, se poate folosi fanionul <code style="color: green">-p</code> pentru a șterge o ierarhie de directoare:
 
 
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> rmdir -p test/test2'''
 
 
 
Sau comanda <code style="color: green">rm -r</code> (vezi mai jos).
 
 
 
=== Ștergerea unui fisier sau recursiv, a unui director (rm) ===
 
  
 
Pentru a șterge un fișier, un director gol, sau un director care conține alte fișiere sau subdirectoare, se poate folosi comanda <code style="color: green">rm</code> (ReMove) cu diferite fanioane:  
 
Pentru a șterge un fișier, un director gol, sau un director care conține alte fișiere sau subdirectoare, se poate folosi comanda <code style="color: green">rm</code> (ReMove) cu diferite fanioane:  
Linia 150: Linia 127:
 
=== Afișarea unui fișier în consolă (cat) ===
 
=== Afișarea unui fișier în consolă (cat) ===
  
Pentru a vedea conținutul unui fișier text (cum ar fi o sursă C sau un makefile) fără a deschide fișierul pentru editare, se poate utiliza comanda <code style="color: green">cat</code> (conCAT):
+
Pentru a vedea conținutul unui fișier text (cum ar fi o sursă C sau un 'makefile') fără a deschide fișierul pentru editare, se poate utiliza comanda <code style="color: green">cat</code> (conCAT):
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cat /etc/hostname'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cat /etc/hostname'''
 
   '''pracsis01'''
 
   '''pracsis01'''
Linia 165: Linia 142:
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cp /etc/hostname ~/Desktop/myhostname'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cp /etc/hostname ~/Desktop/myhostname'''
 
* copiatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>):
 
* copiatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>):
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cp -r ~/Desktop /tmp/.'''
+
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> cp -r ~/Desktop /tmp'''
 
<div class="regula">'''Observație:''' Această comandă a copiat directorul Desktop al utilizatorului curent în directorul tmp din rădăcină.</div>
 
<div class="regula">'''Observație:''' Această comandă a copiat directorul Desktop al utilizatorului curent în directorul tmp din rădăcină.</div>
 
* copiatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>), schimbându-i numele:
 
* copiatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>), schimbându-i numele:
Linia 179: Linia 156:
 
* mutatul unui fișier dintr-un director în altul, schimbându-i numele:
 
* mutatul unui fișier dintr-un director în altul, schimbându-i numele:
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv /etc/hostname ~/Desktop/myhostname'''
 
   '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv /etc/hostname ~/Desktop/myhostname'''
* mutatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>):
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv -r ~/Desktop /tmp/.'''
 
* mutatul unui director, recursiv, în alt director (se folosește fanionul <code style="color: green">-r</code>), schimbându-i numele:
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv -r ~/Desktop /tmp/MyDesktop'''
 
 
= Scrierea, compilarea și executarea unui program în C =
 
 
== Editarea fișierului sursă ==
 
 
În cadrul laboratorului de PC, vom edita programele C într-un editor simplu de text, pentru a ne obișnui cu procesul de compilare și depanare a programelor. Editoarele de text care pot fi folosite sunt:
 
* în mod text (din consolă): nano, mcedit, vim
 
* în mod grafic: kate, gedit, notepad++
 
 
Fișierele C sunt fișiere text în care se scrie programul.
 
 
== Generarea fișierului executabil ==
 
 
Din fișierul sursă, se genereaza fișierul executabil în mai multe etape, conform schemei de mai jos:
 
 
[[Fișier:c_executable_generation.svg]]
 
 
Compilatorul de C pe care îl vom folosi se numește [https://gcc.gnu.org/ GNU Compiler Collection] (sau scurt, gcc). Acesta, de fapt, nu este doar compilator, ci este un toolchain complet pentru generarea de fișiere executabile din fișiere surse C. Acesta poate face doar o parte din, sau toate etapele din schema de mai sus, în funcție de fanioanele utilizate. O parte din fanioanele posibile pentru '''gcc''' sunt (pentru lista completă studiaţi pagina de manual pentru GCC - man gcc):
 
 
{| class="wikitable"
 
! Opțiune !! Efect
 
|-
 
| <code style="color: green">-o</code> nume_fișier || Numele fișierului de ieşire va fi nume_fişier. În cazul în care această opțiune nu este setată, se va folosi numele implicit (pentru fișiere executabile: a.out - pentru Linux).
 
|-
 
| <code style="color: green">-I</code> cale_către_fișiere_antet || Caută fișiere antet și în calea specificată.
 
|-
 
| <code style="color: green">-L</code> cale_către_biblioteci || Caută fișiere bibliotecă și în calea specificată.
 
|-
 
| <code style="color: green">-l</code> nume_bibliotecă || Link-editează biblioteca nume_bibliotecă. '''Atenție!!!''' nume_bibliotecă nu este întotdeauna același cu numele fișierului antet prin care se include această bibliotecă. Spre exemplu, pentru includerea bibliotecii de funcții matematice, fișierul antet este math.h, iar biblioteca este m.
 
|-
 
| <code style="color: green">-W</code> tip_warning || Afișează tipurile de avertismente specificate (Pentru mai multe detalii <code style="color: green">man gcc</code> sau <code style="color: green">gcc –help</code>). Cel mai folosit tip este all. Este indicat ca la compilarea cu <code style="color: green">-Wall</code> să nu apară nici un fel de avertismente.
 
|-
 
| <code style="color: green">-c</code> || Compilează și asamblează, dar nu link-editează. Generează fișiere obiect, cu extensia .o.
 
|-
 
| <code style="color: green">-S</code> || Se oprește după faza de compilare, fară să asambleze. Rezultă cod assembler în fișiere cu extensia .s.
 
|-
 
| <code style="color: green">-E</code> || Se oprește după faza de preprocesare, fară să compileze. Rezultă cod C în fișiere cu extensia .c.
 
|-
 
| <code style="color: green">-O</code> [0-3] || Setează nivelul de optimizare, o valoare numerică între 0 și 3, 0 fiind fără optimizare (viteză de execuție minimă, dimensiune mare a executabilului, timp de compilare mic, cod ușor de depanat), iar 3 fiind optimizare maximă (viteză de execuție maximă, dimensiune mare a codului, mai mare decât la nivelul 2 datorită operațiunii de ''loop unrolling'', timp de compilare mare, cod greu de depanat).
 
|-
 
| <code style="color: green">-g</code> || Adaugă simboluri de debug în executabil, fără de care depanarea nu este posibilă. Mai multe despre instrumentele de debug în laboratoarele următoare.
 
|}
 
 
 
În continuare vom prezenta cateva exemple:
 
* generarea directă a unui executabil numit '''hello''', dintr-un singur fișier sursă, '''hello.c''', utilizând biblioteca standard:
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc hello.c -o hello'''
 
* generarea directă a unui executabil numit '''hello''', dintr-un singur fișier sursă, '''hello.c''', utilizând biblioteca standard și biblioteca '''math''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc hello.c -o hello -lm'''
 
* generarea directă a unui executabil numit '''hello''', din două fișiere sursă, '''hello1.c''' și '''hello2.c''', utilizând biblioteca standard:
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc hello1.c hello2.c -o hello'''
 
* generarea unui fișier obiect, numit '''hello.o''', dintr-un fișier sursă numit '''hello.c''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc -c hello.c -o hello.o'''
 
* generarea unui fișier obiect, numit '''hello.o''', din două fișiere sursă, '''hello1.c''' și '''hello2.c''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc -c hello1.c hello2.c -o hello.o'''
 
* generarea unui executabil numit '''hello''', din două fișiere obiect, '''hello1.o''' și '''hello2.o''', utilizând biblioteca standard și biblioteca '''math''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc hello1.o hello2.o -o hello -lm'''
 
* generarea unui fișier cu cod de asamblare, numit '''hello.s''', dintr-un fișier sursă numit '''hello.c''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc -S hello.c -o hello.s'''
 
* generarea unui fișier cu cod de asamblare, numit '''hello.s''', dintr-un fișier sursă numit '''hello.c''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc -S hello.c -o hello.s'''
 
* generarea unui fișier sursă preprocesat, numit '''hello_pre.c''', dintr-un fișier sursă numit '''hello.c''':
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc -E hello.c -o hello_pre.c'''
 
 
== Executarea programului ==
 
 
Pentru a executa un program sau script în consola Linux, numele fișierului se precede cu caracterele <code style="color: green">./</code> :
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> gcc hello.c -o hello'''
 
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> ./hello'''
 
 
= Compilarea automată a multiple surse - Makefiles =
 
 
Dezvoltarea unei aplicații în limbajul C implică multe iterații de tip design - dezvoltare - depanare - integrare. La fiecare modificare a sursei, pentru a putea rula aplicația, codul trebuie recompilat. Odată cu creșterea numărului de linii de cod și a fișierelor sursă, timpul necesar operației de generare a executabilului (build) crește și el, până în punctul în care durează zeci de minute. Aceasta este în special o problemă când dezvoltarea se face pe microcontroler. Se evidențiază următoarele probleme:
 
* Dacă o sursă este modificată, ea trebuie recompilată prin rescrierea în consolă a comenzii de compilare. Această comandă poate fi foarte lungă, datorită multiplelor biblioteci și fanioane folosite, prin urmare este incomod de scris de fiecare dată. Este deci nevoie de o soluție pentru a predefini comanda de compilare și a o rula fără efort de fiecare dată.
 
* Dacă o aplicație este formată din multe fișiere sursă, compilarea tuturor acestor fișiere durează. În practică, se cere doar compilarea surselor care s-au modificat și apoi rularea operației de link-editare a fișierelor obiect în fișierul executabil (compilarea este operația care consumă cel mai mult timp din tot procesul de build). Este deci nevoie de un sistem care să detecteze care surse s-au modificat, apoi să le compileze strict pe acelea.
 
 
Exisă mai multe sisteme de build care rezolvă aceste probleme, dar de departe cel mai folosit în practică este utilizarea aplicației <code style="color: green">make</code>, și configurarea acesteia prin Makefiles.
 
 
== Anatomia unui Makefile - rețete de fișiere ==
 
 
Scrierea unui Makefile este extrem de simplă și se bazează pe ideea de rețetă: pentru a genera un fișier <code style="color: blue">destination</code>, este nevoie de unul sau mai multe fișiere sursă <code style="color: blue">sourceA, sourceB, sourceC, ...</code> și de o comandă <code style="color: green">command</code> care să genereze fișierul A din B, C, D, ... Această rețetă se scrie într-un fișier cu numele <code style="color: green">Makefile</code> în felul următor:
 
<syntaxhighlight lang="make">
 
destination: sourceA sourceB sourceC ...
 
  [tab]  command
 
</syntaxhighlight>
 
 
 
<div class="regula">'''<font color="red">Atenție:</font>''' Fișierele Makefile sunt sensibile la spații! Nu aveți voie să puneți linii goale decât între rețete, și nu aeți voie să plasați spații la începutul liniei. În plus, comenzile care trebuie rulate pentru generarea fișierului trebuie obligatoriu precedate de un caracter TAB, acesta nu se poate înlocui cu spații.</div>
 
 
De exemplu, o rețetă care să genereze un executabil numit <code style="color: green">hello</code> dintr-o sursă C numită <code style="color: blue">hello.c</code> se scrie în felul următor:
 
<syntaxhighlight lang="make">
 
hello: hello.c
 
gcc hello.c -o hello
 
</syntaxhighlight>
 
 
Pentru a face build-ul, se rulează simplu comanda <code style="color: green">make</code>, care va rula automat prima rețetă din fișier. Dacă vrem să specificăm care rețetă este rulată, atunci numele ei urmează comenzii '''make''': <code style="color: green">make hello</code>.
 
 
Mai departe, dorim să mai definim o rețetă care să șteargă fișierele generate (să facă curat). Vom numi această rețetă <code style="color: green">clean</code>. Această rețetă nu generează un fișier (nu vrem să creăm un fișier numit <code style="color: green">clean</code>), astfel această rețetă este una falsă, care se declară PHONY:
 
 
<syntaxhighlight lang="make">
 
hello: hello.c
 
gcc hello.c -o hello
 
 
.PHONY: clean
 
clean:
 
rm -f hello
 
</syntaxhighlight>
 
 
Putem acum oricând să ștergem fișierul generat rulând comanda <code style="color: green">make clean</code>.
 
  
Regulile după care se execută o rețetă sunt următoarele:
+
* mutatul unui director, recursiv, în alt director (nu este necesar un fanion suplimentar ca la copy):
# Dacă numele rețetei NU este un fișier generat de către comandă, atunci acel target e PHONY, cum este <code style="color: green">clean</code>. În cazul acesta, comanda se rulează de fiecare data cand se face rețeta.
+
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv ~/Desktop /tmp'''
# Dacă numele rețetei ESTE un fișier dar lista de surse lipseste, atunci comanda se ruleaza doar daca fișierul nu există.
+
* mutatul unui director, recursiv, în alt director, schimbându-i numele (nu este necesar un fanion suplimentar ca la copy):
# Dacă numele rețetei ESTE un fișier și lista de surse există, comanda se rulează doar dacă fișierul nu există SAU dacă oricare din surse e mai nouă decat fișierul.
+
  '''<span style="color: green">student@pracsis01</span> <span style="color: blue">~/Desktop $</span> mv ~/Desktop /tmp/MyDesktop'''
# Dacă pentru oricare din sursele unei rețete există o altă rețetă care îl generează, atunci se rulează automat întâi acea rețetă, indiferent dacă sursa există sau nu. Dacă fișierul sursă NU există și nu există nici o rețetă care să îl genereze, atunci aplicația '''make''' va genera o eroare: '''No rule to make target'''.
 
 
 
== Optimizări ==
 
 
 
Când se scrie o rețetă, numele fișierelor sursă și/ sau a fișierui destinație se poate schimba în timpul dezvoltării aplicației. Dacă acestora apare și în comenzile din rețetă, trebuie avut grija ca noile nume să fie modificate peste tot unde apar. De exemplu, dacă Makefile-ul de mai sus, dorim să modificăm numele sursei din <code style="color: blue">hello.c</code> în <code style="color: green">byebye.c</code>, trebuie modificat în două locuri:
 
 
 
<syntaxhighlight lang="make">
 
hello: byebye.c
 
gcc byebye.c -o hello
 
 
 
.PHONY: clean
 
clean:
 
rm -f hello
 
</syntaxhighlight>
 
 
 
Astfel, se poate face o optimizare. Există două scurtături care pot fi folosite pentru numele fișierului destinație (<code style="color: green">$@</code>) și pentru lista de fișiere sursă (<code style="color: green">$^</code>):
 
 
 
<syntaxhighlight lang="make">
 
hello: byebye.c
 
gcc $^ -o $@
 
 
 
.PHONY: clean
 
clean:
 
rm -f hello
 
</syntaxhighlight>
 
 
 
Un alt avantaj este acela că dacă executabilul <code style="color: green">hello</code> va trebui generat din două fișiere sursă, noul fișier nu trebuie adăugat decât în lista de surse, nu și în comandă, lista propagându-se automat datorită lui <code style="color: green">$^</code>:
 
 
 
<syntaxhighlight lang="make">
 
hello: byebye.c hello.c
 
gcc $^ -o $@
 
 
 
.PHONY: clean
 
clean:
 
rm -f hello
 
</syntaxhighlight>
 
  
 
= Exerciții =
 
= Exerciții =
 
+
# Tastati comanda '''man ls'''. Ce observati? Incercati '''man''' si pentru alte comenzi din aceasta lucrare.
== Bash ==
 
 
 
 
# Navigați până în directorul personal al user-ului ''student''.
 
# Navigați până în directorul personal al user-ului ''student''.
 
# Creați un director numit '''work'''.
 
# Creați un director numit '''work'''.
Linia 347: Linia 173:
 
# Vizualizați lista de fișiere din directorul curent.
 
# Vizualizați lista de fișiere din directorul curent.
 
# Vizualizați conținutul fișierului din directorul curent.
 
# Vizualizați conținutul fișierului din directorul curent.
# Faceți o copie a fișierului '''text.txt''' numită '''test2.txt'''.
+
# Faceți o copie a fișierului '''test.txt''' numită '''test2.txt'''.
 
# Mutați fișierul '''test2.txt''' în directorul /home/student/work/PC/seriaF/grupa''N''/''nume''/lab2
 
# Mutați fișierul '''test2.txt''' în directorul /home/student/work/PC/seriaF/grupa''N''/''nume''/lab2
 
# Schimbați directorul curent în /home/student/work/PC/seriaF/grupa''N''/''nume''/lab2.
 
# Schimbați directorul curent în /home/student/work/PC/seriaF/grupa''N''/''nume''/lab2.
Linia 353: Linia 179:
 
# Vizualizați conținutul fișierului din directorul curent.
 
# Vizualizați conținutul fișierului din directorul curent.
 
# Ștergeți directorul /home/student/work
 
# Ștergeți directorul /home/student/work
 
== GCC ==
 
<ol>
 
<li>Deschideți un editor de text.</li>
 
<li> Scrieți într-un fișier nou următorul cod C
 
<syntaxhighlight lang="c">
 
#include <stdio.h>
 
 
int main(){
 
    printf("Hello PC Lab!\n");
 
    return 0;
 
}
 
</syntaxhighlight>
 
</li>
 
<li>Salvați fișierul în directorul /home/student/work/PC/seriaF/grupa''N''/''nume''/lab1 cu numele '''source.c''' (directorul va trebui refăcut)</li>
 
<li>Navigați în consolă în directorul /home/student/work/PC/seriaF/grupa''N''/''nume''/lab1</li>
 
<li>Compilați fișierul sursă într-un executabil numit '''main'''</li>
 
<li>Executați programul.</li>
 
<li>Ștergeți fișierul '''main'''.</li>
 
<li>Generați un fișier obiect, din fișierul '''source.c''', numit '''source.o'''</li>
 
<li>Generați un executabil numit '''main''', din fișierul obiect.</li>
 
<li>Executați programul.</li>
 
<li>Generați un fișier cu cod asamblare, numit '''source.s''', din fișierul sursă.</li>
 
<li>Afișați pe ecran conținutul fișierului '''source.s'''</li>
 
<li>Generați un fișier cu cod C preprocesat, numit '''source_pre.c''', din fișierul sursă.</li>
 
<li>Afișați pe ecran conținutul fișierului '''source_pre.c'''</li>
 
<li>Afișați pe ecran conținutul fișierului '''source.o'''. Explicați comportamentul.</li>
 
</ol>
 
 
== Makefiles ==
 
 
# Scrieți un Makefile cu două rețete:
 
#* una care să genereze executabilul '''main''' din sursa '''source.c'''
 
#* una care să șteargă fișierul generat.
 
# Rulați comanda '''make clean''' și verificați că executabilul a fost șters.
 
# Rulați comanda '''make''', verificați că programul a fost compilat și rulați-l.
 
# Rulați comanda '''make''' din nou. Ce observați?
 
# Modificați fișierul sursă ca în loc de '''Hello PC Lab!''' să afișeze pe ecran '''Makefiles are awesome!''' (nu uitați să salvați fișierul după modificare).
 
# Rulați din nou comanda '''make''' și apoi executați programul.
 
# Modificați '''Makefile''' astfel încât să genereze executabilul dintr-un fișier obiect, iar fișierul obiect să fie generat din fișierul sursă.
 
  
 
= Exerciții pentru acasă =
 
= Exerciții pentru acasă =
  
# Instalați Virtualbox și descărcați mașina virtuală conform instrucțiunilor de pe Moodle (dacă vă simțiti curajoși, puteți instala Linux direct pe calculator, [http://linux.about.com/od/howtos/ss/How-To-Dual-Boot-Windows-81-And-Linux-Mint.htm în paralel cu Windows], sau înlocuindu-l).
+
# Instalați Virtualbox și descărcați mașina virtuală conform instrucțiunilor de pe pagina de wiki a laboratorului (dacă vă simțiti curajoși, puteți instala Linux direct pe calculator, [http://linux.about.com/od/howtos/ss/How-To-Dual-Boot-Windows-81-And-Linux-Mint.htm în paralel cu Windows], sau înlocuindu-l).
 
# Refaceți exercițiile din laborator pe propriul calculator.
 
# Refaceți exercițiile din laborator pe propriul calculator.

Versiunea curentă din 7 octombrie 2020 12:45

Obiective

În urma parcurgerii acestui laborator veți fi capabili să folosiți comenzi de bază în sistemul de operare Linux.

Sistemul de operare Linux - programe

Majoritatea utilizatorilor de Windows pornesc de la premisa că Linux este greu de folosit și că nu pot rula programele cu care sunt obișnuiți. Cu toate că există, într-adevăr, unele aplicații care nu pot fi rulate (cum ar fi o mare parte din jocuri precum și unele platforme foarte specifice de simulare și sinteză), majoritatea aplicațiilor sunt disponibile în Linux. Următoarea listă prezintă alternative ale aplicațiilor tradiționale:

  • browser web: Google Chromium Browser (Chrome), Mozilla Firefox, Opera
  • player video: VLC Media PLayer
  • editor foto: Inkscape, Gimp
  • suită office: LibreOffice (alternativă la Microsoft Office), Microsoft Office 365 - online, Google Docs - online
  • real time messenger: Pidgin, Skype, Hangouts (online)
  • medii de dezvoltare software: Netbeans, Eclipse, Code::Blocks, IntelliJ
  • procesare de semnal: Matlab, Octave (alternativă la Matlab)
  • sinteză și simulare de circuite digitale: Xilinx ISE, Xilinx Vivado, Altera Quartus

Pentru anumite programe, este de asemenea posibilă rularea acestora într-un emulator de Windows, numit wine. Exista si alternativa de a instala Windows Subsystem for Linux (WSL1 sau WSL2) in Windows 10 (https://docs.microsoft.com/en-us/windows/wsl/install-win10)

Instalare de programe

Instalarea unui program in Linux se face foarte ușor, cu o singură comandă (dacă aplicația este în baza de date a distribuției). Spre exemplu, pe o distribuție din familia Debian (Debian, Ubuntu, Mint, etc.), pentru a instala GNU Octave:

sudo apt-get install -y octave
Observație: Pentru a putea instala o aplicație, este nevoie de acces de tip administrator de sistem. Acest lucru se poate face în două moduri:
  • execuția unei comenzi de către un utilizator care are drept de administrator, folosind comanda sudo;
  • execuția comenzii de către utilizatorul root, care este un cont cu acces nelimitat la toate resursele sistemului; ATENȚIE: Folosiți contul root doar pentru operații de administrare de sistem și deconectați-vă imediat ce ați terminat. Nu dați acces root decât persoanelor în care aveți încredere.

Linux Bash

Daca nu aveti nicio distribuitie de Linux instalata, puteti folosi pentru acest laborator terminalul online de aici: https://cocalc.com/doc/terminal.html Noțiunile legate de utilizarea și administrarea sistemului de operare Linux sunt necesare și obligatorii pentru un inginer electronist. În afară de faptul că Linux este un sistem de operare open-source stabil și sigur, atractivitatea lui vine în special din posibilitatea de a automatiza procese prin scrierea de scripturi în limbaje de scripting puternice și din faptul că este cel mai răspândit sistem de operare folosit pentru dispozitive embedded. În continuare se vor prezenta noțiuni și comenzi necesare pe parcursul laboratorului de Programarea Calculatoarelor.

Pentru a obține informații legate de utilizarea unei comenzi, în terminalul (consola) Linux se poate da comanda man <comanda> pentru a deschide manualul la pagina comenzii respective. Odată deschis, se poate naviga cu săgețile sus/ jos și pagina se închide cu tasta 'q'.

Odată deschis terminalul, prompt-ul de comandă arată de cele mai multe ori în felul următor:

  student@pracsis01 ~/Desktop $ 

Acesta este format din următoarele componente:

  • student reprezintă numele utilizatorului curent și este urmat de caracterul '@' (at);
  • pracsis01 reprezintă numele calculatorului (host name) și care ar trebui să fie unic în rețea; în lipsa acestuia va apărea localhost;
  • ~/Desktop reprezintă directorul curent și este urmat de caracterul '$'
Atenție: Linux este CASE-SENSITIVE, asta înseamnă că se face diferența între literele mari și mici, și în cadrul comenzilor, și în cadrul numelor de fișiere/ directoare.

Pentru un tutorial mai detaliat, ce descrie un număr mai mare de comenzi, puteți vizita http://linuxcommand.org

Structura de directoare in Linux

Toate fișierele și directoarele în Linux sunt plasate într-o ierarhie de tip arbore, unde directorul din vârf se numește rădăcină (root) și este reprezentat prin caracterul slash (/).

Structura de directoare și fișiere în Linux este descrisă în detaliu aici.

În cadrul laboratorului de PC, vom lucra în interiorul directorului personal al utilizatorului student, care este implicit /home/student (slash este separatorul de cale în Linux, analog cu backslash din Windows).

Observație: Calea până la directorul personal este prescurată în Linux prin caracterul ~ . Astfel, ~ este echivalent cu /home/student iar ~/Desktop este echivalent cu /home/student/Desktop. În plus, directorul personal al altor utilizatori poate fi construit folosind caracterul ~ și numele utilizatorului. De exemplu ~admin reprezintă calea până la directorul personal al utilizatorului admin: /home/admin.

Instrucțiuni pentru lucrul cu sistemul de fișiere

Aflarea directorului curent (pwd)

Directorul curent se vede în mod normal în prompt, dar în cazul în care acest prompt nu este vizibil sau a fost modificat, sau directorul curent trebuie utilizat în cadrul unui script, comanda care îl afișează pe acesta pe ecran este pwd (Print Working Directory).

  student@pracsis01 ~/Desktop $ pwd
  /home/student/Desktop

Navigare între directoare (cd)

Navigarea către un director anume se face folosind comanda cd (Change Directory). Comanda cd poate fi folosită în următoarele moduri:

  • navigarea către o cale absolută, care începe cu slash:
  student@pracsis01 ~ $ cd /home/student/Desktop
  student@pracsis01 ~/Desktop $
  • navigarea către o cale relativă, care nu începe cu slash și care depinde de directorul curent:
  student@pracsis01 ~ $ cd Desktop
  student@pracsis01 ~/Desktop $
  • navigarea către directorul personal (home directory), prin apelarea comenzii fără alți parametri:
  student@pracsis01 ~/Desktop $ cd
  student@pracsis01 ~ $
  • navigarea către calea anterioară (util când e nevoie să alternați între două directoare), folosind parametrul -:
  student@pracsis01 ~/Desktop $ cd
  student@pracsis01 ~ $ cd -
  student@pracsis01 ~/Desktop $ cd -
  student@pracsis01 ~ $

Această comandă va eșua dacă directorul specificat nu există, sau nu aveți acces la el sau la unul directoarele părinte.

Observație: Pentru a vă întoarce cu un nivel mai sus în ierarhia de directoare, se poate folosi ”..” în loc de numele directorului. De exemplu:
  student@pracsis01 ~/Desktop $ cd ../Desktop/../Desktop/../../student/Desktop
  student@pracsis01 ~/Desktop $ 

Crearea unui director (mkdir)

Pentru a crea un director se folosește comanda mkdir (MaKe DIRectory) specificând numele directorului care se vrea creat:

  student@pracsis01 ~ $ mkdir work

Această comandă poate eșua dacă nu aveți acces la directorul părinte, dacă directorul părinte nu există, sau dacă directorul care se dorește creat există deja. Pentru a crea un director în situația în care directorul părinte nu există, se poate utiliza fanionul -p:

  student@pracsis01 ~/Desktop $ mkdir -p ~/work/pc/F/group1/ion/lab1

Ștergerea unui fisier sau a unui director (rm)

Pentru a șterge un fișier, un director gol, sau un director care conține alte fișiere sau subdirectoare, se poate folosi comanda rm (ReMove) cu diferite fanioane:

  • pentru a șterge un fișier:
   student@pracsis01 ~/Desktop $ rm program.c
  • pentru a șterge un director, se folosește fanionul -r:
  student@pracsis01 ~/Desktop $ mkdir test
  student@pracsis01 ~/Desktop $ rm test
  rm: cannot remove ‘test’: Is a directory
  student@pracsis01 ~/Desktop $ rm -r test
Atenție: Flag-ul -r va șterge tot conținutul directorului, indiferent ce conține acesta, folosiți-l cu mare atenție.

Afișarea conținutului directorului curent (ls)

Pentru a vedea conținutul directorului curent se poate utiliza comanda ls (LiSt):

  student@pracsis01 ~/Desktop $ ls
  chromium-browser.desktop  C-Lion.desktop  netbeans-8.0.2.desktop Xilinx XPS 14.7.desktop

Pentru a vedea detalii despre fiecare fișier sau director, se poate folosi flag-ul -l. Comanda ls -l este atât de utilizată încât în anumite distribuții (Debian/ Ubuntu) are un alias: ll.

  student@pracsis01 ~/Desktop $ ls -l
  total 44
  -rwxr-xr-x  1 student student 12591 Jun  2 16:44 chromium-browser.desktop
  -rwxr-xr-x  1 student student   136 Aug 20 16:59 C-Lion.desktop
  -rwxr-xr-x  1 student student   261 Jul  9 16:09 netbeans-8.0.2.desktop
  -rwxr-xr-x  1 student student   162 Aug 25 13:38 Xilinx XPS 14.7.desktop

Afișarea unui fișier în consolă (cat)

Pentru a vedea conținutul unui fișier text (cum ar fi o sursă C sau un 'makefile') fără a deschide fișierul pentru editare, se poate utiliza comanda cat (conCAT):

  student@pracsis01 ~/Desktop $ cat /etc/hostname
  pracsis01

Copiatul unui fișier sau director (cp)

Pentru a copia un fișier sau director, se poate utiliza comanda cp (CoPy). În cea mai simplă formă, comanda cp are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:

  • copiatul unui fișier dintr-un director în altul:
  student@pracsis01 ~/Desktop $ cp /etc/hostname ~/Desktop/
  • copiatul unui fișier dintr-un director în directorul curent:
  student@pracsis01 ~/Desktop $ cp /etc/hostname .
Observație: În timp ce .. reprezintă directorul părinte, . reprezintă directorul curent.
  • copiatul unui fișier dintr-un director în altul, schimbându-i numele:
  student@pracsis01 ~/Desktop $ cp /etc/hostname ~/Desktop/myhostname
  • copiatul unui director, recursiv, în alt director (se folosește fanionul -r):
  student@pracsis01 ~/Desktop $ cp -r ~/Desktop /tmp
Observație: Această comandă a copiat directorul Desktop al utilizatorului curent în directorul tmp din rădăcină.
  • copiatul unui director, recursiv, în alt director (se folosește fanionul -r), schimbându-i numele:
  student@pracsis01 ~/Desktop $ cp -r ~/Desktop /tmp/MyDesktop

Mutatul unui fișier sau director (mv)

Pentru a muta un fișier sau director, se poate utiliza comanda mv (MoVe). Analog cu copy, în cea mai simplă formă, comanda mv are doi parametri: sursa și apoi destinația, obligatoriu în această ordine. Această comandă se poate folosi în mai multe feluri:

  • mutatul unui fișier dintr-un director în altul:
  student@pracsis01 ~/Desktop $ mv /etc/hostname ~/Desktop/
  • mutatul unui fișier dintr-un director în directorul curent:
  student@pracsis01 ~/Desktop $ mv /etc/hostname .
  • mutatul unui fișier dintr-un director în altul, schimbându-i numele:
  student@pracsis01 ~/Desktop $ mv /etc/hostname ~/Desktop/myhostname
  • mutatul unui director, recursiv, în alt director (nu este necesar un fanion suplimentar ca la copy):
  student@pracsis01 ~/Desktop $ mv ~/Desktop /tmp
  • mutatul unui director, recursiv, în alt director, schimbându-i numele (nu este necesar un fanion suplimentar ca la copy):
  student@pracsis01 ~/Desktop $ mv ~/Desktop /tmp/MyDesktop

Exerciții

  1. Tastati comanda man ls. Ce observati? Incercati man si pentru alte comenzi din aceasta lucrare.
  2. Navigați până în directorul personal al user-ului student.
  3. Creați un director numit work.
  4. În directorul work creați următoarele structuri de directoare:
    • PC/seriaF/grupaN/nume/lab1
    • PC/seriaF/grupaN/nume/lab2
  5. Schimbați directorul curent în /home/student/work/PC/seriaF/grupaN/nume/lab1.
  6. Dați comanda echo Acesta este primul meu fisier text > test.txt
  7. Vizualizați lista de fișiere din directorul curent.
  8. Vizualizați conținutul fișierului din directorul curent.
  9. Faceți o copie a fișierului test.txt numită test2.txt.
  10. Mutați fișierul test2.txt în directorul /home/student/work/PC/seriaF/grupaN/nume/lab2
  11. Schimbați directorul curent în /home/student/work/PC/seriaF/grupaN/nume/lab2.
  12. Vizualizați lista de fișiere din directorul curent.
  13. Vizualizați conținutul fișierului din directorul curent.
  14. Ștergeți directorul /home/student/work

Exerciții pentru acasă

  1. Instalați Virtualbox și descărcați mașina virtuală conform instrucțiunilor de pe pagina de wiki a laboratorului (dacă vă simțiti curajoși, puteți instala Linux direct pe calculator, în paralel cu Windows, sau înlocuindu-l).
  2. Refaceți exercițiile din laborator pe propriul calculator.