This shows you the differences between two versions of the page.
|
si:teme2022:tema2 [2022/12/11 14:16] florin.stancu created |
si:teme2022:tema2 [2023/12/12 12:00] (current) florin.stancu old revision restored (2023/01/13 22:44) |
||
|---|---|---|---|
| Line 2: | Line 2: | ||
| * **Publicare**: | * **Publicare**: | ||
| - | * **11 Decembrie 2022 //16:00//** | + | * **11 Decembrie 2022 //17:50//** |
| * **Termen de predare**: | * **Termen de predare**: | ||
| - | * <color red>**14 Ianuarie 2023 23:55** - deadline HARD</color> | + | * <color red>**15 Ianuarie 2023 23:55** - deadline HARD</color> |
| * **Changelog:** | * **Changelog:** | ||
| - | * //nothing, yet// | + | * //**14 Ianuarie 2023 22:30**// - mărit deadline-ul până duminica ;) |
| + | * //**13 Ianuarie 2023 11:15**// - corectat numele fișierelor: ''url.txt'' + ''checksum.txt'' (CU extensie). | ||
| + | * //**05 Ianuarie 2023 13:40**// - reparat RESTful endpoints din text să fie ca în scriptul de Python de demo. | ||
| <note> | <note> | ||
| Line 24: | Line 26: | ||
| <note important> | <note important> | ||
| Pentru a rezolva tema, este recomandat să folosiți [[https://github.com/cs-pub-ro/SI-Lab-VM/releases/|mașina virtuală Yocto 2022 (~22GB)]] cu distribuția Yocto gata compilată și cache-uită, altfel timpul de compilare pe un laptop modest poate fi chiar și de 10 ore! | Pentru a rezolva tema, este recomandat să folosiți [[https://github.com/cs-pub-ro/SI-Lab-VM/releases/|mașina virtuală Yocto 2022 (~22GB)]] cu distribuția Yocto gata compilată și cache-uită, altfel timpul de compilare pe un laptop modest poate fi chiar și de 10 ore! | ||
| - | Puteți lucra în paralel cu laboratorul pe aceiași mașină (veți folosi descriptori de ''kas (yml)'' din fișiere diferite + layere separate). | + | Puteți lucra în paralel cu laboratorul pe aceiași mașină (veți folosi descriptori de ''kas'' (în format ''yml'') din fișiere diferite + layere separate). |
| - | </note> | + | |
| - | + | ||
| - | <note important> | + | |
| - | Work in progress: enunțul / materialele temei sunt în curs de redactare ;) | + | |
| </note> | </note> | ||
| <ifauth @si> | <ifauth @si> | ||
| - | + | <color red>CINE VEDE ASTA E ASISTENT ;) </color> | |
| - | <color red>CINE VEDE ASTA MAI JOS E ASISTENT:</color> | + | </ifauth> |
| ===== Storyline / Enunț ===== | ===== Storyline / Enunț ===== | ||
| Line 43: | Line 41: | ||
| Ca și cerință principală, va trebui să realizați o imagine incorporabilă Linux folosind Yocto ce va expune pe rețea un server HTTP cu API REST-ful (detalii / specificație mai jos) pentru primirea de comenzi de control al LED-urilor. | Ca și cerință principală, va trebui să realizați o imagine incorporabilă Linux folosind Yocto ce va expune pe rețea un server HTTP cu API REST-ful (detalii / specificație mai jos) pentru primirea de comenzi de control al LED-urilor. | ||
| + | |||
| De asemenea, dorim să vedem, în consolă, o simulare grafică (ASCII Art) a bradului de Crăciun cu luminițele aprinse în starea actuală. | De asemenea, dorim să vedem, în consolă, o simulare grafică (ASCII Art) a bradului de Crăciun cu luminițele aprinse în starea actuală. | ||
| - | + | Un exemplu de pom luminat poate fi văzut în captura de mai jos (asciinema): | |
| - | Un exemplu de interfață și interacțiune prin HTTP poate fi văzut în captura de mai jos (asciinema): | + | |
| <html> | <html> | ||
| - | <a href="https://asciinema.org/a/TODO" target="_blank"><img style="max-width: 600px;" src="https://asciinema.org/a/TODO.svg" /></a> | + | <a href="https://asciinema.org/a/YIEhjwqJlYsYrWdD2nsIn4OX7" target="_blank"><img style="max-width: 300px;" src="https://asciinema.org/a/YIEhjwqJlYsYrWdD2nsIn4OX7.svg" /></a> |
| </html> | </html> | ||
| - | |||
| ===== Cerințe ===== | ===== Cerințe ===== | ||
| Line 93: | Line 90: | ||
| * Puteți face comunicarea între cele 2 procese (program TUI + server HTTP) prin orice mecanism vă pune Linux / limbajul la dispoziție (unix pipes, sockeți, RPC framework al limbajului, sistem de fișiere -- însă aici veți avea de furcă la notificarea schimbărilor :P); | * Puteți face comunicarea între cele 2 procese (program TUI + server HTTP) prin orice mecanism vă pune Linux / limbajul la dispoziție (unix pipes, sockeți, RPC framework al limbajului, sistem de fișiere -- însă aici veți avea de furcă la notificarea schimbărilor :P); | ||
| * Acest program trebuie **OBLIGATORIU** să se numească ''christmas-tree'' și să fie în ''PATH'' (rulabil direct prin acest nume într-un terminal)! Acesta va fi pornit automat, prin ''ssh'', pentru testare facilă! | * Acest program trebuie **OBLIGATORIU** să se numească ''christmas-tree'' și să fie în ''PATH'' (rulabil direct prin acest nume într-un terminal)! Acesta va fi pornit automat, prin ''ssh'', pentru testare facilă! | ||
| - | * Cât despre design-ul pomului / elementelor afișate, aveți libertate deplină (cât timp se înțelege ce este și luminițele are câteva culori :D); | + | * Cât despre design-ul pomului / elementelor afișate, aveți libertate deplină (cât timp se înțelege ce este și luminițele au culori :D); |
| Line 126: | Line 123: | ||
| Astfel, se definesc următoarele endpointuri RESTful HTTP (atenție: API-ul este strict!): | Astfel, se definesc următoarele endpointuri RESTful HTTP (atenție: API-ul este strict!): | ||
| * ''GET /api/groups'': va întoarce un obiect JSON cu proprietatea ''NG'' (numărul de grupuri disponibile), e.g.: ''{"NG": 3}''; | * ''GET /api/groups'': va întoarce un obiect JSON cu proprietatea ''NG'' (numărul de grupuri disponibile), e.g.: ''{"NG": 3}''; | ||
| - | * ''GET /api/group/<G>/leds'': va întoarce un obiect JSON cu lista actuală de culori ale LED-urilor grupului ''<G>'' (fără caracterele ''<>'', sunt doar pentru a denota o variabilă), e.g., ''[0, 0, 0, 1, 4, 2, 0, 0]''; | + | * ''GET /api/group/<G>/state'': va întoarce un obiect JSON cu cheila ''NL'': numărul de leduri din grupul curent, și ''LC'': lista actuală de culori ale LED-urilor grupului ''<G>'' (fără caracterele ''<>'', sunt doar pentru a denota o variabilă), e.g., ''{"NL": 8, "LC": [0, 0, 0, 1, 4, 2, 0, 0]}''; |
| - | * ''POST /api/group/<G>/static'': va primi o listă (''array JSON'') de culori pentru fiecare LED din grupul ''<G>'' și va întoarce OK (HTTP 200); desigur, aceste noi setări trebuiesc propagate către aplicația de terminal ce redă ASCII Art-ul; | + | * ''POST /api/group/<G>/static'': va primi un obiect JSON cu o singură cheie: ''LC'' cu valoarea: o listă (JSON Array) de culori pentru fiecare LED din grupul ''<G>'', și va întoarce OK (HTTP 200); desigur, aceste noi setări trebuiesc propagate către aplicația de terminal ce redă ASCII Art-ul; |
| - | * ''POST /api/group/<G>/animate'': va primi o listă de liste de culori pentru fiecare pas al animației, apoi pentru fiecare LED din grupul ''<G>'' și va întoarce OK (HTTP 200); tranzițiile vor fi făcute la fiecare secundă și va fi repetată automat până la revenirea la cazul simplu (cererea de mai sus); exemplu de mutare a culorilor asupra tuturor pozițiilor dintr-un grup: <code> | + | * ''POST /api/group/<G>/animate'' [**BONUS**]: va primi un obiect cu o cheie, ''MC'' care conține o matrice de culori pentru fiecare pas al animației, apoi pentru fiecare LED din grupul ''<G>'' și va întoarce OK (HTTP 200); tranzițiile vor fi făcute la fiecare secundă și va fi repetată automat până la revenirea la cazul simplu (cererea de mai sus); exemplu de mutare a culorilor asupra tuturor pozițiilor dintr-un grup: <code> |
| [ | [ | ||
| [1, 2, 3, 0, 0, 0, 0, 0], | [1, 2, 3, 0, 0, 0, 0, 0], | ||
| Line 142: | Line 139: | ||
| Toate cererile vor folosi formatul ''Content-Type: application/json'' atât la input (pentru cererile ''POST''), cât și la răspuns. | Toate cererile vor folosi formatul ''Content-Type: application/json'' atât la input (pentru cererile ''POST''), cât și la răspuns. | ||
| + | |||
| + | Vedeți exemple de utilizare în fișierul ''test.py'' din schelet. | ||
| <note important> | <note important> | ||
| Line 150: | Line 149: | ||
| ===== Helpers + Mașină virtuală ===== | ===== Helpers + Mașină virtuală ===== | ||
| - | Ca și punct de pornire, puteți descărca un {{si:teme2022:si-tema2-skel-TODO.tar.gz|schelet inițial cu scripturi + structură recomandată}} (**v0.1**). | + | Ca și punct de pornire, puteți descărca un {{si:teme2022:si-tema2-skel-2022-0-1.tar.gz|schelet inițial cu scripturi + structură recomandată}} (**v0.1**). |
| Aceasta conține: | Aceasta conține: | ||
| - | * script de make pentru generarea arhivelor cerute; | + | * Makefile pentru generarea arhivelor cerute (înlocuiți-l pe cel de acum din VM, este inutil :D); |
| * script de rulare qemu pe host (folosit pentru rularea directă a imaginii de distribuit, fără Yocto); | * script de rulare qemu pe host (folosit pentru rularea directă a imaginii de distribuit, fără Yocto); | ||
| * un fișier descriptor pentru //kas// diferit de cel din laborator (numit ''tema2.yml''); | * un fișier descriptor pentru //kas// diferit de cel din laborator (numit ''tema2.yml''); | ||
| * un script de testat endpointul RESTful (+ exemplu utilizare API) folosind python (''test.py''); | * un script de testat endpointul RESTful (+ exemplu utilizare API) folosind python (''test.py''); | ||
| - | * un README.skel pe care ar fi util să-l citiți ;) | + | * un README.skel.txt pe care ar fi util să-l citiți ;) |
| * **Important:** citiți codul sursă al scripturilor și verificați (e.g., căile) să fie adecvate setup-ului vostru! | * **Important:** citiți codul sursă al scripturilor și verificați (e.g., căile) să fie adecvate setup-ului vostru! | ||
| Recomandarea de co-existență pentru tema2 + laborator folosind același VM cu Yocto: fișierele kas cu denumiri diferite (''tema2.yml'' vs ''kas.yml'') ce vor importa seturi diferite de layere (desigur, cele de bază vor rămâne, însă se recomandă crearea unui layer numit ''meta-tema2'' și să creați în interiorul lui configurațiile / pachetele necesare tuturor task-urilor). | Recomandarea de co-existență pentru tema2 + laborator folosind același VM cu Yocto: fișierele kas cu denumiri diferite (''tema2.yml'' vs ''kas.yml'') ce vor importa seturi diferite de layere (desigur, cele de bază vor rămâne, însă se recomandă crearea unui layer numit ''meta-tema2'' și să creați în interiorul lui configurațiile / pachetele necesare tuturor task-urilor). | ||
| - | |||
| - | <note> | ||
| - | |||
| - | </note> | ||
| <note> | <note> | ||
| Line 173: | Line 168: | ||
| Soluția temei va fi trimisă în două moduri (vă rugăm să respectați convențiile de denumire cu exactitate!): | Soluția temei va fi trimisă în două moduri (vă rugăm să respectați convențiile de denumire cu exactitate!): | ||
| - | * **arhivă cu codul sursă** + Readme + hash și alte metainformații (vedeți mai jos) -> pe Moodle | + | * **arhivă cu codul sursă** + Readme + hash și alte metainformații (vedeți mai jos) -> [[https://curs.upb.ro/2022/mod/assign/view.php?id=102647|pe Moodle]] |
| * **arhivă cu binarele / imaginea rulabilă** -> le urcați pe [[https://ctipub-my.sharepoint.com|OneDrive / Sharepoint-ul UPB]] și dați share prin Link Public (pe care ni-l trimiteți doar nouă în fișierul ''url.txt''). | * **arhivă cu binarele / imaginea rulabilă** -> le urcați pe [[https://ctipub-my.sharepoint.com|OneDrive / Sharepoint-ul UPB]] și dați share prin Link Public (pe care ni-l trimiteți doar nouă în fișierul ''url.txt''). | ||
| **Arhiva cu binarele** (''.tar.gz'' pls) trebuie să conțină (de preferat să folosiți strict aceste denumiri de fișiere): | **Arhiva cu binarele** (''.tar.gz'' pls) trebuie să conțină (de preferat să folosiți strict aceste denumiri de fișiere): | ||
| * ''rootfs.img'': imaginea partiției rootfs în format RAW utilizabil de qemu (ori partiția ext4, ori disk image); | * ''rootfs.img'': imaginea partiției rootfs în format RAW utilizabil de qemu (ori partiția ext4, ori disk image); | ||
| - | * ''kernel-*'': binarul kernel-ului compatibil cu QEMU (scheletul îl copiază automat din cache-ul Yocto); | + | * ''kernel'': binarul kernel-ului compatibil cu QEMU (scheletul îl copiază automat din cache-ul Yocto); |
| - | * ''versatile-pb.dtb'' sau orice alt device tree blob (dacă sunt necesare pentru rulare în Qemu); | + | * ''launch_bin.sh'': script de pornire QEMU (vedeți scheletul dat); |
| - | * ''launch.sh'': script de pornire QEMU (vedeți scheletul dat); | + | |
| * Dacă doriți să ne prezentați alt scenariu demonstrativ (decât cel inclus în schelet), includeți un script numit ''test.py''. | * Dacă doriți să ne prezentați alt scenariu demonstrativ (decât cel inclus în schelet), includeți un script numit ''test.py''. | ||
| * **NU INCLUDEȚI**: directorul build cache al yocto (yep, acela de > 20GB!); | * **NU INCLUDEȚI**: directorul build cache al yocto (yep, acela de > 20GB!); | ||
| Line 188: | Line 182: | ||
| * scripturile proprii de Yocto (layer, rețete, fișier ''yml'' pentru ''kas'') + sursele aplicației (în orice limbaje ați ales); | * scripturile proprii de Yocto (layer, rețete, fișier ''yml'' pentru ''kas'') + sursele aplicației (în orice limbaje ați ales); | ||
| * fișier ''README.txt'' cu explicații referitoare la funcționarea soluției, configurații speciale de optimizare folosite etc. | * fișier ''README.txt'' cu explicații referitoare la funcționarea soluției, configurații speciale de optimizare folosite etc. | ||
| - | * fișier ''url.txt'' (fără extensie!) cu URL către arhiva **.tar.gz** a binarelor; | + | * fișier ''url.txt'' cu URL către arhiva **.tar.gz** a binarelor; |
| - | * fișier ''checksum.txt'' (fără extensie!) care să conțină hash-ul SHA256 al arhivei cu binarele (obținut cu ''sha256sum''); **ATENȚIE**: verificați și re-verificați (de încă 2 ori) conținutul fișierului la încărcare pe Moodle cu hash-ul real deoarece tema nu va fi punctată dacă diferă! | + | * fișier ''checksum.txt'' care să conțină hash-ul SHA256 al arhivei cu binarele (obținut cu ''sha256sum''); **ATENȚIE**: verificați și re-verificați (de încă 2 ori) conținutul fișierului la încărcare pe Moodle cu hash-ul real deoarece tema nu va fi punctată dacă diferă! |
| * **NU INCLUDEȚI**: fișiere sursă ale Poky / alte layere Yocto / biblioteci / frameworkuri descărcabile de pe Internet (menționați în Readme ce ați folosit); puteți include bblayers.conf și local.conf dacă le-ați modificat manual (în afara ''kas''). | * **NU INCLUDEȚI**: fișiere sursă ale Poky / alte layere Yocto / biblioteci / frameworkuri descărcabile de pe Internet (menționați în Readme ce ați folosit); puteți include bblayers.conf și local.conf dacă le-ați modificat manual (în afara ''kas''). | ||
| + | * **Hint**: pentru a include un fișier la crearea automată a arhivei prin ''make source_archive'', pur și simplu copiați-l pe rădăcină (sau într-un director care nu este ignorat -- verificați Makefile-ul din schelet)! | ||
| * Această arhivă nu ar trebui să depășească ''1MB'' (aveți restricție pe Moodle). | * Această arhivă nu ar trebui să depășească ''1MB'' (aveți restricție pe Moodle). | ||
| Line 221: | Line 216: | ||
| * Tema are deadline **HARD** (nu mai sunt admise soluții după expirare), așadar se recomandă să vă apucați din timp de rezolvarea acesteia! | * Tema are deadline **HARD** (nu mai sunt admise soluții după expirare), așadar se recomandă să vă apucați din timp de rezolvarea acesteia! | ||
| * :!: **ATENȚIE**: orice formă de plagiat nu va fi permisă și va duce la depunctare totală / restanță / //that which must not be named, the E-word//! | * :!: **ATENȚIE**: orice formă de plagiat nu va fi permisă și va duce la depunctare totală / restanță / //that which must not be named, the E-word//! | ||
| - | * Pe Moodle găsiți și [[TODO|un forum]] ;) La fel pe Teams, avem un canal de discuții. | + | * Pe Moodle găsiți și [[https://curs.upb.ro/2022/mod/forum/view.php?id=102648|un forum]] ;) La fel pe Teams, avem un canal de discuții. |
| ===== Resurse ===== | ===== Resurse ===== | ||
| Line 227: | Line 222: | ||
| * [[:si:laboratoare:06]] | * [[:si:laboratoare:06]] | ||
| * [[:si:laboratoare:07]] | * [[:si:laboratoare:07]] | ||
| - | * [[https://asciinema.org/a/TODO|Exemplu de interacțiune (asciinema)]] | + | * [[https://asciinema.org/a/YIEhjwqJlYsYrWdD2nsIn4OX7|Exemplu de pom ASCII]] |
| - | + | ||
| - | </ifauth> | + | |