This shows you the differences between two versions of the page.
uso:laboratoare:new:06-auto:practical [2019/11/05 16:21] razvan.deaconescu [01. Alias-uri] |
uso:laboratoare:new:06-auto:practical [2019/11/07 10:33] (current) adrian.zatreanu [02. One liners] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Exerciții ===== | ===== Exerciții ===== | ||
- | Accesați subdirectorul ''support/'' pentru exercițiile de laborator. Sunt și tutoriale (deja făcute / rezolvate) și exerciții. Tutorialele au rolul de a vă acomoda cu diferitele comenzi iar exercițiile sunt parte practică efectivă. | + | Accesați subdirectorul ''~/uso-lab/06-auto/support/'' pentru exercițiile de laborator. Sunt și tutoriale (deja făcute / rezolvate) și exerciții. Tutorialele au rolul de a vă acomoda cu diferitele comenzi iar exercițiile sunt parte practică efectivă. |
Realizați exercițiile în ordine. De la secțiunea 7 faceți echipe de 2-3 persoane, sub coordonarea asistentului și lucrați împreună la rezolvarea exercițiilor. | Realizați exercițiile în ordine. De la secțiunea 7 faceți echipe de 2-3 persoane, sub coordonarea asistentului și lucrați împreună la rezolvarea exercițiilor. | ||
Line 14: | Line 14: | ||
<code> | <code> | ||
- | $ xdg-open . | + | xdg-open . |
- | $ xdg-open http://google.com | + | xdg-open http://google.com |
- | $ xdg-open ../07-extend-scripts/convert/Orar1CA.xls | + | xdg-open ../07-extend-scripts/convert/Orar1CA.xls |
</code> | </code> | ||
Line 47: | Line 47: | ||
Pentru a converti fișierul ''acl.svg'' în fișierul ''acl.png'' folosim comanda: | Pentru a converti fișierul ''acl.svg'' în fișierul ''acl.png'' folosim comanda: | ||
<code> | <code> | ||
- | $ inkscape --export-png=acl.png acl.svg | + | inkscape --export-png=acl.png acl.svg |
</code> | </code> | ||
În urma comenzii a apărut fișierul ''acl.png''. Verificăm conversia corectă folosind alias-ul ''go'' creat anterior: | În urma comenzii a apărut fișierul ''acl.png''. Verificăm conversia corectă folosind alias-ul ''go'' creat anterior: | ||
<code> | <code> | ||
- | $ go acl.png | + | go acl.png |
</code> | </code> | ||
- | Pentru a realiza conversia **tuturor** fișiereleor din directorul curent folosim one liner-ul: | + | Pentru a realiza conversia **tuturor** fișierelor din directorul curent folosim one liner-ul: |
<code> | <code> | ||
- | $ for i in *.svg; do inkscape --export-png=$(basename "$i" .svg).png "$i"; done | + | for i in *.svg; do inkscape --export-png=$(basename "$i" .svg).png "$i"; done |
</code> | </code> | ||
Line 83: | Line 83: | ||
Vrem să redenumim toate fișierele cu extensia ''.c'' ca să avem prefixul ''uso_'' în nume. Pentru aceasta folosim one liner-ul: | Vrem să redenumim toate fișierele cu extensia ''.c'' ca să avem prefixul ''uso_'' în nume. Pentru aceasta folosim one liner-ul: | ||
<code> | <code> | ||
- | for i in *.c; do mv "$i" uso_"$i".c; done | + | for i in *.c; do mv "$i" uso_"$i"; done |
</code> | </code> | ||
După această comandă, vor apărea fișiere redenumite. | După această comandă, vor apărea fișiere redenumite. | ||
Line 90: | Line 90: | ||
<code> | <code> | ||
rm *.c | rm *.c | ||
- | cp src/*.c | + | cp src/*.c . |
</code> | </code> | ||
Line 101: | Line 101: | ||
Rulăm următoarele comenzi pentru a genera o parolă de 16 caractere și pentru a afișa PID-urile proceselor utilizatorului ''student'': | Rulăm următoarele comenzi pentru a genera o parolă de 16 caractere și pentru a afișa PID-urile proceselor utilizatorului ''student'': | ||
<code> | <code> | ||
- | $ tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 | + | tr -dc 'a-zA-Z0-9~!@#$%^&*_()+}{?></";.,[]=-' < /dev/urandom | fold -w 32 | head -n 1 |
- | $ ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2 | + | ps -ef | grep student | tr -s ' ' | cut -d ' ' -f 2 |
</code> | </code> | ||
Aceste acțiuni le putem realiza și folosind comenzi dedicate și opțiunile lor, fără a fi nevoie de trecerea prin operatorul ''|'' (//pipe//): | Aceste acțiuni le putem realiza și folosind comenzi dedicate și opțiunile lor, fără a fi nevoie de trecerea prin operatorul ''|'' (//pipe//): | ||
<code> | <code> | ||
- | $ pwgen -y 16 1 | + | pwgen -y 16 1 |
- | $ ps -u student -o pid --no-header | + | ps -u student -o pid --no-header |
</code> | </code> | ||
Line 183: | Line 183: | ||
MAVRODIN I. Andrei,315CC,9,7,6.4 | MAVRODIN I. Andrei,315CC,9,7,6.4 | ||
MANEA A. Mihail-Alin,315CC,7,6.75,6.22 | MANEA A. Mihail-Alin,315CC,7,6.75,6.22 | ||
- | ASĂVOAEI P. Cătălin,315CC,8,6.75,7 | + | |
</code> | </code> | ||
Line 331: | Line 331: | ||
Accesați subdirectorul ''09-args/'' din directorul laboratorului. | Accesați subdirectorul ''09-args/'' din directorul laboratorului. | ||
+ | |||
+ | === Orar === | ||
+ | |||
+ | Intrați în directorul ''timetable/''. Scriptul ''download'' descarcă orarele din anul universitar curent semestrul 1. Rulați scriptul pentru a-l testa: | ||
+ | <code> | ||
+ | ./download | ||
+ | </code> | ||
+ | Va descărca fișierele pentru orar în format ''.xls''. | ||
+ | |||
+ | **Exercițiu**: Creați un script numit ''solution'' care primește două argumente: primul este anul universitar, altul este semestrul și descarcă orarele pentru acel an universitar și pentru acel semestru de pe site-ul de orare: http://acs.pub.ro/~cpop/ | ||
+ | |||
+ | Rularea fără argumente a scriptului ''solution'' ar trebui să afișeze un mesaj de forma: | ||
+ | <code> | ||
+ | $ ./solution | ||
+ | Usage: ./solution <academic-year> <semester> | ||
+ | Example: ./solution 2017_2018 sem1 | ||
+ | </code> | ||
+ | |||
+ | === Medie === | ||
+ | |||
+ | Intrați în directorul ''average/''. | ||
+ | |||
+ | Scriptul ''compute'' calculează media la a doua notă pentru **toți** studenții din fișierul ''../../04-regex/students.csv'': | ||
+ | <code> | ||
+ | $ ./compute | ||
+ | Average: 6.72 | ||
+ | </code> | ||
+ | |||
+ | **Exercițiu**: Creați un script numit ''solution'' care primește ca argument un nume de grupă și calculează media doar pentru aceștia. Un exemplu de rulare este | ||
+ | <code> | ||
+ | $ ./solution 314CC | ||
+ | Average: 7.56 | ||
+ | </code> | ||
==== 10. Înlocuiri de șiruri ==== | ==== 10. Înlocuiri de șiruri ==== | ||
Accesați subdirectorul ''10-replace/'' din directorul laboratorului. | Accesați subdirectorul ''10-replace/'' din directorul laboratorului. | ||
+ | |||
+ | Fișierul ''template_reader.c'' conține template-ul unui fișier C. În acest fișier construcția ''__TEMPLATE__'' trebuie înlocuită cu un "mesaj secret". Acest mesaj este generat dintr-un șir în care fiecare literă este înlocuită cu valoarea sa ASCII din care scădem valoarea ''0x41'' (în hexazecimal). Pentru a face înlocuirea folosim scriptul ''generate'': | ||
+ | <code> | ||
+ | ./generate | ||
+ | </code> | ||
+ | În urma rulării scriptului ''generate'' a fost creat fișierul ''reader.c'' pornind de la fișierul ''template_reader.c''. Acum putem compila fișierul folosind fișierul ''Makefile'' cu ajutorul comenzii: | ||
+ | <code> | ||
+ | make | ||
+ | </code> | ||
+ | În urma rulării comenzii ''make'' a rezultat executabilul ''reader'' pe care îl putem acum lansa: | ||
+ | <code> | ||
+ | ./reader | ||
+ | </code> | ||
+ | |||
+ | Parcurgeți scriptul ''generate'' și înțelegeți-l. Acolo unde aveți nelămuriri, adresați-vă asistentului. | ||
==== 11. Dezvoltare de exerciții cu scripting ==== | ==== 11. Dezvoltare de exerciții cu scripting ==== | ||
Accesați subdirectorul ''11-practical/'' din directorul laboratorului. | Accesați subdirectorul ''11-practical/'' din directorul laboratorului. | ||
+ | |||
+ | În fiecare dintre cele 3 subdirectoare aveți niște provocări. Fiecare provocare are un fișier ''flag'' care conține un mesaj ascuns. Va trebuie să "descifrați" acel mesaj. Ca să întelegeți cum a fost generat acel mesaj ascuns, vedeți scriptul ''encode''. Scriptul encode este scriptul folosit pentru generarea fișierului ''flag'' pornind de la un mesaj inițial (pe care trebuie să îl aflați). | ||
+ | |||
+ | **Exercițiu**: Alegeți o provocare (sau mai multe) și creați un script ''decode'' care decodifică mesajul ascuns în fișierul ''flag'' și afișează mesajul inițial. | ||
+ | |||
+ | **Exercițiu**: Gândiți-vă voi la o provocare și creați pentru aceasta scriptul ''encode'' și ''decode'' și fișierele auxiliare. | ||
==== 12. Shell vs Python ==== | ==== 12. Shell vs Python ==== | ||
- | Accesați subdirectorul ''12-shell-vs-python/'' din directorul laboratorului. | + | Accesați subdirectorul ''12-shell-vs-python/'' din directorul laboratorului. Vrem să vedem cum se compară scripturi scrise în shell față de scripturi scrise în Python. |
+ | |||
+ | Scriptul ''generate'' este un script shell pe care l-am folosit în secțiunea 10. Scriptul ''generate.py'' are aceeași funcționalitate, dar scris în Python, iar mesajul inițial este citit din fișieru ''in''. | ||
+ | |||
+ | <note important> | ||
+ | În general, pentru acțiuni simple, folosim shell scripting. Pentru prelucrări de date și acțiuni mai complexe, este recomandat să folosim un limbaj de scripting mai puternic, precum Python. | ||
+ | </note> | ||