This is an old revision of the document!
Thread nou? Nu. Pentru o ușoară parcurgere a mesajelor, folosiți thread-urile de discuții existente în cadrul forumului, fără a crea altele. În consecință, thread-urile (subiectele de discuții) nou create vor fi șterse.
Căutare. Căutați pe forum informația pe care doriți să o obțineți, înainte să puneți o întrebare. De cele mai multe ori, cineva a mai întrebat același lucru. În fiecare thread al forumului aveți informații despre cum puteți căuta în forum.
Printscreen/poză? Nu. În cazul în care doriți să publicați un printscreen pe forum, recomandăm folosirea site-urilor pentru partajarea gratuită a imaginilor, precum imgur sau alternativele sale, publicând pe forum doar link către printscreen. Pozele inserate în răspunsuri, vor fi șterse.
Actualizări. Urmăriți atât forumul cât și modificările aduse enunțului/checker-ului, modificări ce sunt publicate și explicate în paragrafele de mai jos.
Regulament. Înainte și în timpul realizării temei, vă rugăm să parcurgeți indicațiile legate de realizarea temelor, încluzând ce înseamnă o temă copiată și cum penalizăm temele copiate. Folosiți cu încredere forumurile de pe cs.curs.pub.ro pentru întrebări și neclarități legate de teme.
Întrebări frecvente. În timpul realizării temei, când vă loviți de probleme și aveți nevoie de suportul echipei de USO, parcurgeți și lista de întrebări frecvente întâlnite în cadrul temelor. Să țineți cont, va rugăm, și de recomandările de comunicare electronică.
Ajutor reciproc. Vă încurajăm ca atunci când găsiți soluția la o problemă pe care ați postat-o anterior pe forum să postați și soluția găsită. De asemenea dacă știți răspunsul la întrebările colegilor sunteți încurajați să le răspundeți.
hello_from_the_other_side.h
nu este, de fapt, symlink.
Actualizări utilitar uso
: versiunea v16 - “Gold Blackbird”
Actualizări checker: versiunea 4
hello_5.c
) *_result
vor fi generate, chiar dacă scriptul iese cu eroare.
uso
uso
, consultați instrucțiunile de utilizare.Descărcare mașină virtuală și informații despre aceasta
Testarea temei se va face doar pe mașina virtulă (aici) autentificat ca utilizator student
, folosind utilitarul uso
. Acesta poate fi executat în orice moment pentru a verifica dacă au fost rezolvate corect task-urile. Nu lucrați autentificat ca utilizator root
în sistem, la nicio temă. Din acest motiv există posibilitatea să nu vă treacă testele. Pe de altă parte, nu este o metoda de siguranță să lucrați autentificat ca utilizator root
din motive de securitate și/sau permisiuni.
Utilitarul uso
implementează testele doar pentru task-urile temei curente. La fiecare temă nouă, pentru a folosi utilitarul uso
, primul pas este să porniți tema folosind comanda sudo uso start
. În caz contrar, nu veți avea actualizat checker-ul pentru tema curentă.
Verificați versiunea utilitarului uso
cât și a checker-ului, afișată la rularea comenzii sudo uso start
sau sudo uso check
, pe prima linie a output-ului. Asigurați-vă că aveți ultima versiune înainte de a continua lucrul pentru temă. Versiunea actuală este specificată în secțiunea Informații generale prezentă în enunțul temei. Pentru situațiile în care nu dispuneți de ultima versiune a utilitarului uso
sau checker-ului, rulați sudo uso update
.
Finalizarea temei se realizează prin rularea comenzii sudo uso submit
și încărcarea codului returnat de această comandă (32 de caractere alfanumerice), în formularul din secțiunea Informații generale. Pentru a evita transcrierea eronată a codului returnat de checker, recomandăm copierea acestuia din interfața mașinii host conectată prin SSH către mașina guest după cum urmează:
Scrieți un script get_headers_path.sh
în directorul ~/tema4/headers/
care găseaște calea absolută a fiecărui fișier header inclus într-un fișier sursă C
. Dacă fișierul header inclus este un link simbolic, trebuie găsita calea fișierului către care pointează. Căile vor fi afișate la stdout
, câte o cale pe linie. Scriptul va primi calea către un fișier sursă și mai poate primi parametri (oricâți) de forma -Ipath
, având aceeași semnificație ca opțiunea -I
pentru gcc
, pentru a specifica căi suplimentare unde se vor căuta headere. (Vezi man gcc, /-I
). După -I
poate urma o cale absolută sau relativă. Căile date astfel au prioritate în fața căilor default pentru headere din sistem (se va căuta mai întâi în ele). Din punct de vedere al căilor pasate cu -I
, prioritate are prima cale din cadrul apelului.
Căile default unde se pot afla headere pe usovm
sunt, în această ordine:
De exemplu, fie un fișier numit test.h
existent atât în directorul a/
, cât și în directorul b/
și inclus de fișierul sursă test.c
.
$ ./get_headers_path.sh -Ia/ -Ib/ test.c /path/to/dir/a/test.h $ ./get_headers_path.sh -Ib/ test.c -I/path/to/dir/a/ /path/to/dir/b/test.h
Presupunând că fișierul test.h
s-ar afla și în /usr/include
, outputul rulărilor de mai sus ar fi același, prioritate având căile date explicit cu -I
.
Dacă printre argumentele scriptului nu se află calea unui fișier C, se va afișa mesajul de Pass a C file
, la stderr, și scriptul va ieși cu codul de eroare 1.
#include<header.h>
.#include “header.h”
sau cu #include<header.h>
dacă este dat și un argument -I/path/to/header/dir
.#include < header.h>
este valid.-I
, nu vor exista spații(sau taburi).#include<subdir/header.h>
.#include <header.h>
/#include “header.h”
va exista exact o linie corespunzătoare în output (o cale absolută), conform regulilor de prioritate enunțate mai sus.
~/tema4/headers
. Este vorba de următoarele fișiere:
.
├── hello_0.c
├── hello_1.c
├── hello_2.c
├── hello_3.c
├── hello_4.c
├── hello_5.c
├── hello_6.c
├── hello_7.c
├── hello.h
├── include/
│ ├── hello_from_the_other_side.h
│ └── hello.h
└── math.h
Pe lânga acestea, checkerul va genera 3 fișiere în directorul /home/student/tema4
. Acestea vor fi:
rm -rf ~/tema4/headers/
va duce la ștergerea scriptului vostru și va trebui să îl refaceți! Ștergeți fiecare fișier manual pentru a evita situații de acest fel.
Puctarea acestui task se va face astfel:
#include “header.h”
(doar din directorul curent). Rularea scriptului se va face:$ ./get_headers_path.sh <C_file>
-Ipath
. Headerele incluse nu vor fi in subdirectoare, adică nu vor fi în fișierul C linii de forma #include<dir/header.h>
.Exemple de rulări valide:$ ./get_headers_path.sh <C_file> -I. $ ./get_headers_path.sh -I. <C_file> $ ./get_headers_path.sh <C_file> -I. -Imydir/ $ ./get_headers_path.sh -I. <C_file> -Imydir -Iyourdir/
-Ipath
și cu headere incluse de forma #include<dir/header.h>
Creați un script numit change_date_format.sh
, în directorul /home/student/tema4
. La rulare scriptul primește ca argument un fișier text (calea către acesta) care conține date in format USA, de forma YYYY-MM-DD
. De exemplu: 2016-12-25
corespunde datei 25 Decembrie 2016
, 2001-01-02
pentru 2 Ianuarie 2001
etc.
DD/MM/YYYY
(25/12/2016
, respectiv 02/01/2001
pentru exemplele de mai sus).MM
din dată este luna în format scurt, de 3 litere, în limba engleză (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec). De exemplu: 2016-Dec-25
să devină 25/12/2016
. Scriptul trebuie să continue să înlocuiască și formatul inițial indicat la subpunctul anterior.
YYYY-MM-DD
, nu se va considera o dată validă și nu trebuie înlocuită. De exemplu, 1992 -05-05
nu este o dată validă și trebuie lăsată neschimbată.~/tema4/dates
și vor fi generate de checker.student@usovm:~/tema4/date_files$ ls confs gsoc_timeline holidays linuxcon twelve_days
/home/student/tema4
. Acestea vor fi:
Scrieți un script bash, ~/tema4/get_tweets.sh
, care să extragă doar tweet-urile dintr-un fișier text formatat într-un anumit fel. Liniile din fișier cu tweet-uri sunt de forma:
<tweet user>My awesome tweet about music</tweet>
<tweet user>My awesome tweet about music< /tweet> <tweet user> My awesome tweet about music</tweet > < tweet user> My awesome tweet about music< /tweet >
Fișierul poate conține și linii fără tweet-uri. Exemplu de conținut de fișier:
<tweet ion >Ana are mere</tweet> <tweet test_> Test </tweet> Random line <tweet ana> la lala </tweet>
stdout
toate tweet-urile găsite. Scriptul trebuie sa afiseze la stdout linii de forma:<user>: "<tweet>"
unde <user>
este numele userului care a postat tweet-ul, iar <tweet>
este conținutul tweetului respectiv. Într-o primă fază puteți considera că nu avem mai mult de un tweet per user în fișier. Liniile trebuie sortate alfabetic dupa user. De asemenea, spațiile și taburile redundante (trailing whitespaces) de la începutul și finalul mesajului nu trebuie să mai apară în outputul final.
Pentru exemplul de mai sus, outputul va fi:
ana: "la lala" ion: "Ana are mere" test_: "Test"
—matching
urmat de un argument <word>
(un cuvânt fără spații). Scriptul trebuie să obțină doar tweet-urile care conțin cuvântul <word>
, necontand capitalizarea (litere mari/mici). Se pastrează precizările de la subpunctul anterior. Atenție, nu trebuie extrase și tweet-urile unde <word>
se potrivește doar cu numele userului, acesta trebuiind să apară în textul tweet-ului.Exemplu de rulare:
$ ./get_tweets.sh tweets_file --matching test
$ ./get_tweets.sh tweets_file --matching <word1> <word2> … <wordn>
În acest caz scriptul trebuie să obtină doar tweeturile care conțin cel puțin unul dintre cuvintele <word1>
sau <word2>
sau … <wordn>
, necontând capitalizarea. Putem presupune că nu vom pasa cuvinte care conțin --
$ ./get_tweets.sh tweets_file --matching <word1> <word2> … <wordn> —all
În acest caz scriptul trebuie să obtină doar tweeturile care conțin toate cuvintele <word1>
sau <word2>
sau … <wordn>
, necontând capitalizarea. Putem presupune că nu vom pasa cuvinte care conțin —
. După —matching
vor urma oricâte cuvinte, iar la final, ultimul argument al scriptului va fi —all
.
~/tema4/tweets
.
student@usovm:~/tema4/tweets$ tree . ├── tweets-00 ├── tweets-00-shuf ├── tweets-01 ├── tweets-01-shuf ├── tweets-02 ├── tweets-02-shuf ├── tweets-10 ├── tweets-10-shuf ├── tweets-11 ├── tweets-11-shuf ├── tweets-20 ├── tweets-20-shuf ├── tweets-21 └── tweets-21-shuf
/home/student/tema4
. Acestea vor fi:
mysql-server-5.7
. Setați parola root
pentru userul root
. Asigurați-vă că vă puteți conecta la server folosind comanda mysql -uroot -proot
.
În urma primei rulări a checkerului, dacă subpunctul anterior a fost rezolvat corect, veți găsi database-ul world_x
, care conține 4 tabele city
, country
, countryinfo
și countrylanguage
. Scrieți un script în directorul tema4
din home-ul utilizatorului student
, numit query_world.sh
care interoghează baza voastră de date locală. Scriptul poate fi rulat în următoarele moduri:
student@usovm:~$ echo "SELECT Name FROM city limit 2;" | mysql -uroot -proot world_x 2> /dev/null Name Kabul Qandahar
/home/student/tema4
. Acestea vor fi:
./query_world.sh --city-population [-le | -ge ] N
În acest caz, scriptul va produce la stdout
un fișier CSV cu toate orașele care îndeplinesc condițiile din argumente. Fișierul va avea capul de tabel City,Population
. Dacă argumentele -le
sau -ge
lipsesc, atunci se vor afișa toate orașele care au populația egală cu N
. Dacă înainte de N
este prezent unul dintre argumentele -le
sau -ge
, atunci se vor afișa toate orașele cu o populație mai mică sau egală, respectiv mai mare sau egală cu N
. Orașele afișate trebuie sortate crescător după populație, iar dacă numărul de locuitori este identic, atunci alfabetic după nume. Exemple:
student@usovm:~/tema4$ ./query_world.sh --city-population 1040000 City,Population Jilin,1040000 Tangshan,1040000 student@usovm:~/tema4$ ./query_world.sh --city-population -le 500 City,Population Adamstown,42 West Island,167 Fakaofo,300 Città del Vaticano,455 student@usovm:~/tema4$ ./query_world.sh --city-population -le 11999 -ge 9500 City,Population Tamuning,9500 Basseterre,11600 Avarua,11900 student@usovm:~/tema4$ ./query_world.sh --city-population -ge 500 -le 699 City,Population Bantam,503 Yaren,559 The Valley,595 Alofi,682
ORDER BY
) pentru a evita probleme legate de encodarea caracterelor non latine pe care comanda sort
din Linux le va interpreta diferit.
Pentru acest subpunct vi se garantează că primul argument primit de script este --city-population
. În cazul în care N
nu este un număr întreg strict pozitiv, se va afișa mesajul de eroare Illegal arguments
la stderr
, iar scriptul se va întoarce cu valoarea de retur 101
. În cazul în care înainte de N
scriptul primește un argument diferite de -ge
sau -le
, se va afișa mesajul Illegal arguments
la stderr
și scriptul va ieși cu valoarea de retur 101
. În cazul în care argumentul --city-population
este ultimul, atunci se vor afișa toate orașele din baza de date. În cazul în care argumentele sunt corecte, dar niciun oraș nu satisface cerințele, nu se afișa nimic (nici măcar capul de tabel). Exemple:
student@usovm:~/tema4$ ./query_world.sh --city-population 100a Illegal arguments student@usovm:~/tema4$ ./query_world.sh --city-population 0123 Illegal arguments student@usovm:~/tema4$ ./query_world.sh --city-population -gt 123 Illegal arguments student@usovm:~/tema4$ ./query_world.sh --city-population -ge Illegal arguments student@usovm:~/tema4$ ./query_world.sh --city-population City,Population Adamstown,42 West Island,167 ... Seoul,9981619 Mumbai (Bombay),10500000
./query_world.sh --city-population [-le | -ge] N [--country COUNTRY]
Extindeți funcționalitatea scriptului astfel încât dacă primește și un parametru --country
urmat de numele unei țări, va afișa doar orașe din acea țară. Parametrul --country
poate apărea doar ultimul, nu va fi intercalat cu celelalte de la subpunctul anterior. Vi se garantează că după argumentul --country
scriptul va primi încă un argument, numele țării de căutat. Exemple:
student@usovm:~/tema4$ ./query_world.sh --city-population -ge 340000 --country Romania City,Population Constanta,342264 Iasi,348070 Bucuresti,2016131 student@usovm:~/tema4$ ./query_world.sh --city-population -ge 340000 -le 700000 --country Italy City,Population Firenze,376662 Bologna,381161 Genova,636104 Palermo,683794 student@usovm:~/tema4$ ./query_world.sh --city-population --country Tokelau City,Population Fakaofo,300 student@usovm:~/tema4$ ./query_world.sh --city-population 776733 --country "United States" City,Population San Francisco,776733 student@usovm:~/tema4$ ./query_world.sh --city-population -le 90000 --country "United States" City,Population Charleston,89063 Carson,89089 Odessa,89293 Elgin,89408 Kenosha,89447 student@usovm:~/tema4$ ./query_world.sh --city-population "United States" --country 776733 Illegal arguments student@usovm:~/tema4$ ./query_world.sh --city-population 123 --country "Romania"
./query_world.sh --district-population [-le | -ge] N [--country COUNTRY]
Extindeți scriptul astfel încât dacă primul parametru este --district-population
, acesta va afișa toate districtele care satisfac condițiile primite prin următoarele argumentele. Scriptul va funcționa în același mod ca la subpunctul anterior, doar că va afișa districte în loc de orașe. Populația unui district se va considera ca fiind suma tuturor orașelor care fac parte din acel district. Două districte cu același nume, dar din țări diferite, vor fi considerate diferite. Exemple:
student@usovm:~/tema4$ ./query_world.sh --district-population -le 180000 --country "United States" District,Population Montana,92988 New Hampshire,107006 South Dakota,123975 Rhode Island,173618 student@usovm:~/tema4$ ./query_world.sh --district-population -le 200000 -ge 160000 --country "Romania" District,Population Mures,165153 Sibiu,169611 Arad,184408 Arges,187170 student@usovm:~/tema4$ ./query_world.sh --district-population -le 200000 -ge 197000 District,Population Northern Cape,197254 Manipur,198535 Kaolack,199000 Plaines Wilhelms,199080 Pahang,199484 Yamanashi,199753 student@usovm:~/tema4$ ./query_world.sh --district-population District,Population West Island,167 Fakaofo,300 ... England,19978543 Maharashtra,23659433 São Paulo,26316966
Asigurați-vă că ați submis tema și ați încărcat codul aferent submisiei în formularul din secțiunea de Informații generale. Acest lucru este necesar ori de câte ori modificați tema și o submiteți din nou (detalii aici), până la termenul limită. În caz contrar, punctajul aferent temei va fi nul (0 puncte).