„Kliensalkalmazások” változatai közötti eltérés
Segédanyagok, követelmények rendszerezése |
Órák anyagának hozzáadása (a 11. hétig); segédanyagok hozzáadása |
||
22. sor: | 22. sor: | ||
==== Laborgyakorlatok ==== | ==== Laborgyakorlatok ==== | ||
* Az összesen 10 laborból legalább 3 illetve 5 teljesítése a két témakörben. | * Az összesen 10 laborból legalább 3 illetve 5 teljesítése a két témakörben. | ||
* A laborfeladatok felöltésének határideje: | * A laborfeladatok felöltésének határideje: 1 hét. | ||
==== Házi feladat ==== | ====Házi feladat==== | ||
A tárgyhoz 2 házi feladat (részteljesítmény értékelés) tartozik, mobilos és webes témakörben. Az első feladat bemutatásának határideje a 6. heti, a másodiké a 14. heti laboralkalom. Az első házi feladatra 10, a másodikra 20 pont kapható, amelyeknek egyenként 50%-át el kell érni. | A tárgyhoz 2 házi feladat (részteljesítmény értékelés) tartozik, mobilos és webes témakörben. Az első feladat bemutatásának határideje a 6. heti, a másodiké a 14. heti laboralkalom. Az első házi feladatra 10, a másodikra 20 pont kapható, amelyeknek egyenként 50%-át el kell érni. | ||
=== Aláírás === | ===Aláírás=== | ||
Mindkét házi feladat sikeres bemutatása és legalább 5 és 10 pont elérése. | Mindkét házi feladat sikeres bemutatása és legalább 5 és 10 pont elérése. | ||
Legalább 8 (3+5) labor sikeres teljesítése. | Legalább 8 (3+5) labor sikeres teljesítése. | ||
=== Pótlási lehetőség === | ===Pótlási lehetőség=== | ||
A póthéten az egyik | A póthéten az egyik házi feladat pótolható. | ||
=== Vizsga === | ===Vizsga=== | ||
A vizsgaidőszakban írásbeli vizsgát tartunk, amely 60 pontos (36 pont web + 24 pont Android), ebből legalább 30 pontot el kell érni a sikerességhez. Igaz-hamis, feleletválasztós, kifejtős és kódolós kérdések is várhatóak. | A vizsgaidőszakban írásbeli vizsgát tartunk, amely 60 pontos (36 pont web + 24 pont Android), ebből legalább 30 pontot el kell érni a sikerességhez. Igaz-hamis, feleletválasztós, kifejtős és kódolós kérdések is várhatóak. | ||
=== Osztályozás === | ===Osztályozás=== | ||
A végső osztályzatot a házi és a vizsga pontszámok összeadásával határozzuk meg. | A végső osztályzatot a házi és a vizsga pontszámok összeadásával határozzuk meg. | ||
45. sor: | 45. sor: | ||
Vizsga: max. 60 pont | Vizsga: max. 60 pont | ||
=== Értékelés === | === Értékelés=== | ||
*88– 100: jeles | *88– 100: jeles | ||
*75 – 87: jó | *75 – 87: jó | ||
*62 – 74: közepes | * 62 – 74: közepes | ||
*50 – 61: elégséges | *50 – 61: elégséges | ||
*0 – 49: elégtelen | *0 – 49: elégtelen | ||
== Tematika == | ==Tematika== | ||
=== Előadások === | ===Előadások=== | ||
==== Web ==== | ====Web==== | ||
* 1. hét (Albert István): [[Média:Kliens E00 20240212 követelmények.pdf|követelmények]], [[Média:Kliens ea1 2023 web.pdf|webarchitektúra]]: statikus és dinamikus kiszolgálás; HTTP-kérés, -válasz, -kapcsolat, -státuszkódok; URL: header, cache; API: REST, Postman | *1. hét (Albert István): [[Média:Kliens E00 20240212 követelmények.pdf|követelmények]], [[Média:Kliens ea1 2023 web.pdf|webarchitektúra]]: statikus és dinamikus kiszolgálás; HTTP-kérés, -válasz, -kapcsolat, -státuszkódok; URI, URL: header, cache; API: REST, Postman | ||
* 2. hét (Gincsai Gábor): az előző hét folytatása: HTML: elemek, attribútumok, oldalváz, block / inline, head, p, a, img, ul, ol, li, table, form, input, label, select, datalist, audio, video; validáció: pattern, required; állapotmegőrzés: session, cookie, GDPR; HTTPS: SSL, TLS (handshake), (self-signed) certificate, érvényesség, kulcs | **A 22. dián a telefonszámot tartalmazó URI az RFC 3986 alapján nem tartalmazhatna szóközöket. | ||
* [[Média:Kliens ea2 2023 web.pdf|3. hét (Gincsai Gábor)]]: CSS: ...; Bootstrap: grid, col, img-fluid, form; flexbox | *2. hét (Gincsai Gábor): az előző hét folytatása: HTML: elemek, attribútumok, oldalváz, block / inline, <code><head></code>, <code><nowiki><p></nowiki></code>, <code><a></code>, <code><img></code>, <code><nowiki><ul></nowiki></code>, <code><nowiki><ol></nowiki></code>, <code><nowiki><li></nowiki></code>, <code><nowiki><table></nowiki></code>, <code><form></code>, <code><input></code>, <code><label></code>, <code><select></code>, <code><datalist></code>, <code><audio></code>, <code><video></code>; validáció: pattern, required; állapotmegőrzés: session, cookie, GDPR; HTTPS: SSL, TLS (handshake), (self-signed) certificate, érvényesség, kulcs | ||
* [[Média:Kliens E04 20240304 JavaScript 1. rész.pdf|4. hét (Gincsai Gábor)]]: JavaScript: transpiler, összehasonlítás (Java), nyelvi elemek, változók, (logikai) típusok (konverzió), értékadás (strict), konstans, alapértelmezett érték, feltételes futtatás, objektumok, JSON (parse, stringify), tömbök, függvények, window, global scope pollution, scopes (shadowing); DOM: querySelector[All](), createElement(), textContent(), appendChild(), setAttribute(), firstChild(), nextSibling(); eseménykezelés: addEventListener(), bubble, stopPropagation(); session / local storage: setItem(), getItem(), removeItem(), clear(); closure, self-invoking / arrow function, modul; new, this; prototípus, konstruktor, factory method, class, string interpolation, öröklés; folytatás a laboron: [[Média:Kliens E05 20240311 JavaScript 2. rész.pdf|Promise]]: ... | **Megjegyzés a 61. diához: habár a diasoron én nem láttam magyarázatot a <code>name</code> attribútum használatára, a vizsgán kérdezik. De legalább az egyik laboron [https://bmeviaubb03.github.io/laborok/laborok/web/01-http/#html-oldal-vizsgalata szó esik róla]. | ||
* [[Média:Kliens ea4 2023 web.pdf|5. hét (Albert István)]]: TypeScript: transpiler, static typing (any, noImplicitAny), structural typing, deklaráció (var, let, const), null (strictNullChecks), undefined, type narrowing / assertion, non-null assertion, optional chaining, null coalescing, enum (sorszámozás), string / number literal (union), type annotation / alias, optional values, interface; class: static, constructor, readonly, protected, extends, super, private, erősen védett mező; method overload (signatures), generic types, típuskényszer, metszettípus, spread, dekorátorok; modulok: export, import, típusdeklarációs fájl | **Megjegyzés a 69. diához: a <code>.webm</code>-et valójában már mindegyik böngésző támogatja.<sup>[https://caniuse.com/webm]</sup> | ||
* [[Média:Kliens ea5 2023 web.pdf|6. hét (Albert István)]]: Angular: MV*, architektúra, metaadatok, dekorátorok, komponensek, szolgáltatások, Component, string interpolation, adatkötés (@Input / @Output, CSS class / -stílus), események kötése, kétirányú adatkötés, attribútum / property, (strukturális / attribútum)direktívák (HostListener), ngIf, ngFor, direktíva, alkalmazás- / komponens-életciklus, lifecycle hooks, ngOnInit, ngOnChanges, SimpleChange, ngDoCheck | *[[Média:Kliens ea2 2023 web.pdf|3. hét (Gincsai Gábor)]]: CSS: ...; Bootstrap: grid, <code>col</code>, <code>img-fluid</code>, form; flexbox | ||
** Megjegyzés a 26. diához: az <code>[src]</code>-t pont nem érdemes használni, mivel az <code>[https://angular.dev/guide/image-optimization ngSrc]</code> jobban optimalizált. | **Megjegyzés a 97. diához: a <code>display: flow-root</code>-ot valójában már mindegyik böngésző támogatja.<sup>[https://caniuse.com/flow-root]</sup> | ||
* 7. hét (Albert István): az előző hét folytatása: ngModule, bootstrapping, (im)pure (Reverse)Pipe; szolgáltatások (DI, scope, interface): HttpClient; szinkronitás, számosság (Observable), routing (RouterOutlet, RouterLink), linkek, Guard, (reaktív) formok (ellenőrzés), szinkron adatfolyam, vezérlők, komponensstílusok, témák, animáció | **Habár a diasoron én nem láttam magyarázatot a <code>@media only screen</code> query és a <code>min-width</code> használatára, [[Kliensalkalmazások kvíz#Mire való egy @media screen and (min-width: 1100px) CSS-query?|a vizsgán kérdezik]]. De legalább az egyik laboron [https://bmeviaubb03.github.io/laborok/laborok/web/02-css/#reszponziv-elrendezes szó esik róla]. | ||
*[[Média:Kliens E04 20240304 JavaScript 1. rész.pdf|4. hét (Gincsai Gábor)]]: JavaScript: transpiler, összehasonlítás (Java), nyelvi elemek, változók, (logikai) típusok (konverzió), értékadás (strict), konstans, alapértelmezett érték, feltételes futtatás, objektumok, JSON (parse, stringify), tömbök, függvények, window, global scope pollution, scopes (shadowing); DOM: <code>querySelector[All]()</code>, <code>createElement()</code>, <code>textContent()</code>, <code>appendChild()</code>, <code>setAttribute()</code>, <code>firstChild()</code>, <code>nextSibling()</code>; eseménykezelés: <code>addEventListener()</code>, bubble, <code>stopPropagation()</code>; session / local storage: <code>setItem()</code>, <code>getItem()</code>, <code>removeItem()</code>, <code>clear()</code>; closure, self-invoking / arrow (lambda) function, modul; <code>new</code>, <code>this</code>; prototípus, konstruktor, factory method, <code>class</code>, string interpolation, öröklés; folytatás a laboron: [[Média:Kliens E05 20240311 JavaScript 2. rész.pdf|Promise]]: ... | |||
**Megjegyzés a 44. diához: habár a diasoron én nem láttam magyarázatot a <code>confirm()</code> függvény használatára, [[Kliensalkalmazások kvíz#A confirm() JS-függvény aszinkron.|a vizsgán kérdezik]]. De legalább az egyik laboron [https://bmeviaubb03.github.io/laborok/laborok/web/03-js/#:~:text=%C3%89rdekess%C3%A9g%20a%20confirm()%20f%C3%BCggv%C3%A9ny,%20amely%20b%C3%B6ng%C3%A9sz%C5%91ben%20nat%C3%ADvan%20implement%C3%A1lt: szó esik róla] – érdekességként. | |||
**Megjegyzések a 103. diához: | |||
***Arrow functionöket <code>const</code>-tal érdemes definiálni, mivel általában nem változik a tartalmuk. | |||
***Az ''Objektum nem adható vissza simán'' pontban szándékosan hibás változódeklarációk szerepelnek. | |||
*[[Média:Kliens ea4 2023 web.pdf|5. hét (Albert István)]]: TypeScript: transpiler, static typing (<code>any</code>, <code>noImplicitAny</code>), structural typing, deklaráció (<code>var</code>, <code>let</code>, <code>const</code>), <code>null</code> (<code>strictNullChecks</code>), <code>undefined</code>, type narrowing / assertion, non-null assertion, optional chaining, null coalescing, enum (sorszámozás), string / number literal (union), type annotation / alias, optional values, <code>interface</code>; <code>class</code>: <code>static</code>, constructor, <code>readonly</code>, <code>protected</code>, <code>extends</code>, <code>super</code>, <code>private</code>, erősen védett mező; method overload (signatures), generic types, típuskényszer, metszettípus, spread, dekorátorok; modulok: <code>export</code>, <code>import</code>, típusdeklarációs fájl (<code>.d.ts</code>) | |||
**Az 52. dián az utolsó szöveges bekezdés pontosabban: ''míg a JavaScript tetszőleges típuson, a TypeScript csak <code>number</code>-ön tud <code>toString</code>-et hívni''. | |||
*[[Média:Kliens ea5 2023 web.pdf|6. hét (Albert István)]]: Angular: MV*, architektúra, metaadatok, dekorátorok, komponensek, szolgáltatások, Component, string interpolation, adatkötés (@Input / @Output, CSS class / -stílus), események kötése, kétirányú adatkötés, attribútum / property, (strukturális / attribútum)direktívák (HostListener), ngIf, ngFor, direktíva, alkalmazás- / komponens-életciklus, lifecycle hooks, ngOnInit, ngOnChanges, SimpleChange, ngDoCheck | |||
**Megjegyzés a 26. diához: az <code>[src]</code>-t pont nem érdemes használni, mivel az <code>[https://angular.dev/guide/image-optimization ngSrc]</code> jobban optimalizált. | |||
*7. hét (Albert István): az előző hét folytatása: ngModule, bootstrapping, (im)pure (Reverse)Pipe; szolgáltatások (DI, scope, interface): HttpClient; szinkronitás, számosság (Observable), routing (RouterOutlet, RouterLink), linkek, Guard, (reaktív) formok (ellenőrzés), szinkron adatfolyam, vezérlők, komponensstílusok, témák, animáció | |||
==== Android ==== | ====Android==== | ||
* 8. hét: ''szünet'' | *8. hét: ''szünet'' | ||
* [[Média:Kliens ea 09 20240408.pdf|9. hét (Gazdi László)]]: alapok, Activity, | *[[Média:Kliens ea 09 20240408.pdf|9. hét (Gazdi László)]]: alapok, Java, XML alapú UI, eseménykezelés, Kotlin; <code>Activity</code>, <code>Service</code>, content provider, <code>BroadcastReceiver</code>; manifest, erőforrások; compiler (Dalvik bytecode), <code>.apk</code>; activity lifecycle (callback függvények, állapot mentése, váltás) | ||
* [[Média:Kliens ea 10 20240415.pdf|10. hét (Gazdi László)]]: Intent, UI, | **Megjegyzések a 16. diához: | ||
* [[Média:Kliens ea 11 20240422.pdf|11. hét (Pásztor Dániel)]]: View, Menu, | ***Az OS X már macOS. | ||
* [[Média:Kliens ea 12 20240429.pdf|12. hét (Gazdi László)]]: Fragment, RecyclerView, Persistence | ***A [[wikipedia:Cocoa Touch|Cocoa Touch]] helyett már egy ideje [[wikipedia:SwiftUI|SwiftUI]] van. | ||
* [[Média:Kliens ea 13 20240506.pdf|13. hét (Gazdi László)]]: Compose | ***Az [[wikipedia:Interface Builder|Interface Builder]] már az [[wikipedia:Xcode|Xcode]] része. | ||
* [[Média:Kliens ea 14 20240513.pdf|14. hét (Gazdi László)]]: NFC, Bluetooth, Http, Retrofit, BR, Service, Permissions | *[[Média:Kliens ea 10 20240415.pdf|10. hét (Gazdi László)]]: <code>Activity</code>: back stack, vezérlés; <code>Intent</code>: típusai, részei, explicit / implicit, extras, képességek, filter; <code>startActivityForResult()</code>, <code>onActivityResult()</code>; erőforrások (i18n); UI: <code>viewBinding</code>; dpi, dp, sp; <code>LinearLayout</code>, <code>RelativeLayout</code>, <code>ConstraintLayout</code>; padding és margin | ||
* 15. hét: ''szünet'' | *[[Média:Kliens ea 11 20240422.pdf|11. hét (Pásztor Dániel)]]: <code>View</code>, <code>getLayoutInflater()</code>, validáció, <code>Menu</code>, <code>ActionBar</code>, <code>Toolbar</code>; <code>PopupWindow</code>, <code>AlertDialog</code>, <code>Snackbar</code>; <code>style</code>, <code>Theme</code>; grafikák, animációk | ||
*[[Média:Kliens ea 12 20240429.pdf|12. hét (Gazdi László)]]: Fragment, RecyclerView, Persistence | |||
*[[Média:Kliens ea 13 20240506.pdf|13. hét (Gazdi László)]]: Compose | |||
*[[Média:Kliens ea 14 20240513.pdf|14. hét (Gazdi László)]]: NFC, Bluetooth, Http, Retrofit, BR, Service, Permissions | |||
*15. hét: ''szünet'' | |||
=== Laborok === | ===Laborok=== | ||
https://bmeviaubb03.github.io/laborok/ | https://bmeviaubb03.github.io/laborok/ | ||
== Házi feladatok == | ==Házi feladatok== | ||
=== Web === | ===Web=== | ||
A házi feladat során egy Angular alapú webalkalmazást kell készíteni. | A házi feladat során egy Angular alapú webalkalmazást kell készíteni. | ||
=== Android === | ===Android=== | ||
Az előadásokon és laborokon bemutatott technológiák segítségével egy komplex alkalmazás készítése önálló funkcionalitással. | Az előadásokon és laborokon bemutatott technológiák segítségével egy komplex alkalmazás készítése önálló funkcionalitással. | ||
== Vizsga == | ==Vizsga== | ||
* [[Kliensalkalmazások kvíz|Kvíz]] | *[[Kliensalkalmazások kvíz|Kvíz]] | ||
* 2023. tavasz | *2023. tavasz | ||
** Mintavizsga | **Mintavizsga | ||
*** Mi az a TypeScript-dekorátor? Milyen szintaktikával használjuk? (kifejtős) | ***Web | ||
****''Mi az a TypeScript-dekorátor? Milyen szintaktikával használjuk?'' (kifejtős) | |||
*****kb. ugyanaz, mint Pythonban | |||
*****módosítani lehet vele egy osztályt vagy annak tagjainak működését | |||
*****pl.:<syntaxhighlight lang="ts" line="1"> | |||
function logged(originalMethod: any, context: ClassMethodDecoratorContext) { | |||
return (...args: any[]) => { | |||
try { | |||
console.log("Calculation started..."); | |||
return originalMethod.call(this, ...args); | |||
} | |||
finally { | |||
console.log("...finished!"); | |||
} | |||
} | |||
} | |||
class Calculator { | |||
@logged | |||
add(a: number, b: number) { | |||
return a + b; | |||
} | |||
} | |||
const calculator = new Calculator(); | |||
calculator.add(1, 9); | |||
</syntaxhighlight> | |||
*2024. tavasz | |||
**A diasorokon szereplő kifejtős kérdések | |||
***Android | |||
****9. hét | |||
*****Milyen lehetőségeink vannak a fejlesztés közbeni debugolásra? | |||
*****Miket kell tartalmaznia a manifestnek? | |||
*****Mit értünk erőforrás-minősítő alatt? | |||
*****Magyarázza el a fordítás mechanizmusát! | |||
*****Mit jelent az obfuszkálás? | |||
*****Az Activity callback életciklus-függvények felüldefiniálásakor meg kell-e hívni kötelezően az ősosztály implementációját? Miért? | |||
*****Ha <code>A</code> <code>Activity</code>-ről átváltunk a <code>B</code> <code>Activity</code>-re, milyen sorrendben hívódnak meg az életciklusfüggvények? | |||
****10. hét | |||
*****Magyarázza el az <code>Activity</code> back stack működési elvét! | |||
*****Hogyan kell egy <code>Activity</code>-t indítani, ha vissza akarunk kapni adatot tőle? | |||
*****Hogyan működik az implicit <code>Intent</code>? | |||
*****Mit értünk ''sűrűségfüggetlen pixel'' alatt? | |||
*****Egy 320 dpi-s képernyőn <code>1.dp</code> hány darab pixelnek felel meg? | |||
*****Sorolja fel a legfontosabb androidos layoutokat! | |||
*****Hogyan támogatja az Android a lokalizációt? | |||
****11. hét | |||
*****Mi a <code>LayoutInflater</code> feladata? | |||
*****Hogyan lehet elkészíteni és kezelni egy menüt? | |||
*****Hogyan adható meg, hogy egy stílus az egész alkalmazásra érvényes legyen? | |||
**Vizsga | |||
***Web | |||
****''Mire való a <code>[https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementById getElementById]</code> függvény? Hogyan lehet elérni?'' (kifejtős) | |||
*****egy adott ID-jű elem DOM-ban való megtalálására | |||
******így könnyen lehet a JS-kódból módosítani a DOM-ot | |||
*****a globális <code>document</code> objektumnak van ilyen tagváltozója, azt kell meghívni a JS-kódban | |||
*****pl.:<syntaxhighlight lang="html" line="1"> | |||
<button id="disablerButton"> | |||
Disable the other button | |||
</button> | |||
<button id="buttonToDisable"> | |||
This button will be disabled | |||
</button> | |||
</syntaxhighlight><syntaxhighlight lang="js" line="1"> | |||
function disableButton(buttonId) { | |||
const button = document.getElementById(buttonId); | |||
button.disabled = true; | |||
} | |||
disablerButton.addEventListener("click", disableButton("buttonToDisable")); | |||
</syntaxhighlight> | |||
****''Mi a különbség a'' block ''és'' inline ''típusú HTML-elemek között?'' (kifejtős) | |||
*****block | |||
******pl.: <code><nowiki><div></nowiki></code>, <code><nowiki><p></nowiki></code> | |||
******a szülőjének teljes szélességét kitölti | |||
******új sorban jelenik meg | |||
*****inline | |||
******pl.: <code><a></code>, <code><nowiki><span></nowiki></code> | |||
******nem tölti ki a szülőjének teljes szélességét | |||
******ugyanabban a sorban jelenik meg | |||
*******így lehet formázni linkeket, vagy pl. highlightolni (kihúzni) szöveget | |||
*******csak a tagen belüli szövegre vonatkozik | |||
****''Mire való egy <code>.d.ts</code> kiterjesztésű fájl?'' (kifejtős) | |||
*****declaration file | |||
*****kizárólag a hozzá tartozó JavaScript-fájl típusinformációit tartalmazza | |||
*****gyakorlatilag ugyanaz, mint Pythonban a [https://typing.readthedocs.io/en/latest/source/stubs.html type stub], de a TypeScript fordításidőben jelzi a típusokkal kapcsolatos problémákat (Pythonban ezeket csak az IDE mutatja) | |||
****''Mire szolgál az Angular <code>[https://angular.dev/api/common/NgIf?tab=description ngIf]</code> direktívája?'' (kifejtős) | |||
*****elemek feltételes megjelenítésére | |||
*****pl.:<syntaxhighlight lang="ng2" line="1"> | |||
<div *ngIf="train"> | |||
<p> | |||
This is the {{train.departureTime}} {{train.type}} service to {{train.destination}}. | |||
</p> | |||
</div> | |||
</syntaxhighlight> | |||
*****az <code>*ngIf</code> attribútumban található kifejezést értékeli ki | |||
******itt a komponens <code>.ts</code> fájljában található változókra (is) hivatkozhatunk, melyekre adatkötést hoz létre | |||
******ha az értéke <code>true</code>, megjeleníti az elemet | |||
******ha <code>false</code>, törli a teljes elemet | |||
*****lehet <code>else</code> ága is | |||
******ha sok if-else ág van, érdemes az <code>[https://angular.dev/api/common/NgSwitch?tab=usage-notes ngSwitch]</code>-et használni helyette | |||
***Android | |||
****''Hogyan tudunk saját stílust definiálni? Hogyan tudjuk ezt a stílust az egész alkalmazásra érvényesíteni?'' (kifejtős) | |||
*****View | |||
******Saját stílust a <code>res/values/styles.xml</code> fájlban egy <code><style></code> tag, majd ez alatt további <code><item></code> tagek hozzáadásával lehet definiálni. | |||
******A manifest fájl <code><application></code> tagjébe kell felvenni egy <code>android:theme</code> attribútumként, pl. így: <code><application android:theme="@style/CustomStyle"></code>. | |||
*****Jetpack Compose | |||
******Saját stílust egy <code>@Composable</code> függvény (pl. <code>MyTheme</code>) létrehozásával lehet definiálni, melyben pl. a <code>MaterialTheme</code> függvényt az általunk választott paraméterekkel hívjuk meg. | |||
******A <code>MainActivity</code> class <code>setContent</code> függvényében az <code>App</code> függvény hívását a <code>MyTheme</code> függvény hívásába kell ágyazni. | |||
****''Mire és hogyan használható egy flow?'' (kifejtős) | |||
*****A flow egy Python generatorhoz vagy egy Java Streamhez hasonló változótípus. | |||
******Egy Python generatorhoz hasonlóan több visszatérési értéke is lehet. | |||
******Egy Java Streamhez hasonlóan lehet mapelni vagy filterezni. | |||
*****Segítségével pl. fel lehet iratkozni egy adatfolyamra, hogy onnan folyamatosan kapjunk frissítéseket. | |||
*****A <code>Flow<></code> típusú változó <code>.collect { }</code> függvényét meghívva egy lambda kifejezést lehet végrehajtani a kapott értékkel. | |||
****''Vázolja fel a képen látható nézet kódját Jetpack Compose segítségével! A kódnak nem kell tökéletesnek és teljesnek lennie, de a lényegi részek szerepeljenek benne.'' (kódolós) A képen egy képernyő, melynek közepén teljes szélességben egy ''Email'' feliratú szövegmező látható, alatta egy ''Password'' feliratúval. Mindkét szövegmezőbe ugyanazon látható szöveg van beírva. Alattuk pedig egy ''Login'' gomb látható, szintén a képernyő teljes szélességében. | |||
*****<syntaxhighlight lang="kotlin" line="1"> | |||
@Composable | |||
fun loginPage( | |||
modifier: Modifier = Modifier, | |||
) { | |||
var emailAddress = "klaf@aut.bme.hu" | |||
Column() { | |||
TextField( | |||
placeholder = "Email", | |||
value = emailAddress, | |||
) | |||
HorizontalDivider() | |||
TextField( | |||
placeholder = "Password", | |||
value = emailAddress, | |||
) | |||
HorizontalDivider() | |||
Spacer() | |||
Button() { | |||
Text(text = "Login") | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
{{Lábléc_-_Üzemmérnök-informatikus_alapszak}} | {{Lábléc_-_Üzemmérnök-informatikus_alapszak}} |
A lap 2024. június 20., 22:17-kori változata
A tárgy célja, hogy a hallgatók megismerjék a kliensoldali alkalmazások fejlesztésének módszereit és meghatározó technológiáit különös tekintettel a vékony kliensekre (webes és mobil kliensek). A tárgy külön figyelmet fordít arra, hogy a technológiai lehetőségeken túl a hallgatók gyakorlati problémákkal és megoldásokkal is találkozzanak a félév során.
Követelmények
A szorgalmi időszakban
Laborgyakorlatok
- Az összesen 10 laborból legalább 3 illetve 5 teljesítése a két témakörben.
- A laborfeladatok felöltésének határideje: 1 hét.
Házi feladat
A tárgyhoz 2 házi feladat (részteljesítmény értékelés) tartozik, mobilos és webes témakörben. Az első feladat bemutatásának határideje a 6. heti, a másodiké a 14. heti laboralkalom. Az első házi feladatra 10, a másodikra 20 pont kapható, amelyeknek egyenként 50%-át el kell érni.
Aláírás
Mindkét házi feladat sikeres bemutatása és legalább 5 és 10 pont elérése. Legalább 8 (3+5) labor sikeres teljesítése.
Pótlási lehetőség
A póthéten az egyik házi feladat pótolható.
Vizsga
A vizsgaidőszakban írásbeli vizsgát tartunk, amely 60 pontos (36 pont web + 24 pont Android), ebből legalább 30 pontot el kell érni a sikerességhez. Igaz-hamis, feleletválasztós, kifejtős és kódolós kérdések is várhatóak.
Osztályozás
A végső osztályzatot a házi és a vizsga pontszámok összeadásával határozzuk meg.
Laborok: max. 10 pont Mobil házi feladat: max. 10 pont Webes házi feladat: max. 20 pont Vizsga: max. 60 pont
Értékelés
- 88– 100: jeles
- 75 – 87: jó
- 62 – 74: közepes
- 50 – 61: elégséges
- 0 – 49: elégtelen
Tematika
Előadások
Web
- 1. hét (Albert István): követelmények, webarchitektúra: statikus és dinamikus kiszolgálás; HTTP-kérés, -válasz, -kapcsolat, -státuszkódok; URI, URL: header, cache; API: REST, Postman
- A 22. dián a telefonszámot tartalmazó URI az RFC 3986 alapján nem tartalmazhatna szóközöket.
- 2. hét (Gincsai Gábor): az előző hét folytatása: HTML: elemek, attribútumok, oldalváz, block / inline,
<head>
,<p>
,<a>
,<img>
,<ul>
,<ol>
,<li>
,<table>
,<form>
,<input>
,<label>
,<select>
,<datalist>
,<audio>
,<video>
; validáció: pattern, required; állapotmegőrzés: session, cookie, GDPR; HTTPS: SSL, TLS (handshake), (self-signed) certificate, érvényesség, kulcs- Megjegyzés a 61. diához: habár a diasoron én nem láttam magyarázatot a
name
attribútum használatára, a vizsgán kérdezik. De legalább az egyik laboron szó esik róla. - Megjegyzés a 69. diához: a
.webm
-et valójában már mindegyik böngésző támogatja.[1]
- Megjegyzés a 61. diához: habár a diasoron én nem láttam magyarázatot a
- 3. hét (Gincsai Gábor): CSS: ...; Bootstrap: grid,
col
,img-fluid
, form; flexbox- Megjegyzés a 97. diához: a
display: flow-root
-ot valójában már mindegyik böngésző támogatja.[2] - Habár a diasoron én nem láttam magyarázatot a
@media only screen
query és amin-width
használatára, a vizsgán kérdezik. De legalább az egyik laboron szó esik róla.
- Megjegyzés a 97. diához: a
- 4. hét (Gincsai Gábor): JavaScript: transpiler, összehasonlítás (Java), nyelvi elemek, változók, (logikai) típusok (konverzió), értékadás (strict), konstans, alapértelmezett érték, feltételes futtatás, objektumok, JSON (parse, stringify), tömbök, függvények, window, global scope pollution, scopes (shadowing); DOM:
querySelector[All]()
,createElement()
,textContent()
,appendChild()
,setAttribute()
,firstChild()
,nextSibling()
; eseménykezelés:addEventListener()
, bubble,stopPropagation()
; session / local storage:setItem()
,getItem()
,removeItem()
,clear()
; closure, self-invoking / arrow (lambda) function, modul;new
,this
; prototípus, konstruktor, factory method,class
, string interpolation, öröklés; folytatás a laboron: Promise: ...- Megjegyzés a 44. diához: habár a diasoron én nem láttam magyarázatot a
confirm()
függvény használatára, a vizsgán kérdezik. De legalább az egyik laboron szó esik róla – érdekességként. - Megjegyzések a 103. diához:
- Arrow functionöket
const
-tal érdemes definiálni, mivel általában nem változik a tartalmuk. - Az Objektum nem adható vissza simán pontban szándékosan hibás változódeklarációk szerepelnek.
- Arrow functionöket
- Megjegyzés a 44. diához: habár a diasoron én nem láttam magyarázatot a
- 5. hét (Albert István): TypeScript: transpiler, static typing (
any
,noImplicitAny
), structural typing, deklaráció (var
,let
,const
),null
(strictNullChecks
),undefined
, type narrowing / assertion, non-null assertion, optional chaining, null coalescing, enum (sorszámozás), string / number literal (union), type annotation / alias, optional values,interface
;class
:static
, constructor,readonly
,protected
,extends
,super
,private
, erősen védett mező; method overload (signatures), generic types, típuskényszer, metszettípus, spread, dekorátorok; modulok:export
,import
, típusdeklarációs fájl (.d.ts
)- Az 52. dián az utolsó szöveges bekezdés pontosabban: míg a JavaScript tetszőleges típuson, a TypeScript csak
number
-ön tudtoString
-et hívni.
- Az 52. dián az utolsó szöveges bekezdés pontosabban: míg a JavaScript tetszőleges típuson, a TypeScript csak
- 6. hét (Albert István): Angular: MV*, architektúra, metaadatok, dekorátorok, komponensek, szolgáltatások, Component, string interpolation, adatkötés (@Input / @Output, CSS class / -stílus), események kötése, kétirányú adatkötés, attribútum / property, (strukturális / attribútum)direktívák (HostListener), ngIf, ngFor, direktíva, alkalmazás- / komponens-életciklus, lifecycle hooks, ngOnInit, ngOnChanges, SimpleChange, ngDoCheck
- Megjegyzés a 26. diához: az
[src]
-t pont nem érdemes használni, mivel azngSrc
jobban optimalizált.
- Megjegyzés a 26. diához: az
- 7. hét (Albert István): az előző hét folytatása: ngModule, bootstrapping, (im)pure (Reverse)Pipe; szolgáltatások (DI, scope, interface): HttpClient; szinkronitás, számosság (Observable), routing (RouterOutlet, RouterLink), linkek, Guard, (reaktív) formok (ellenőrzés), szinkron adatfolyam, vezérlők, komponensstílusok, témák, animáció
Android
- 8. hét: szünet
- 9. hét (Gazdi László): alapok, Java, XML alapú UI, eseménykezelés, Kotlin;
Activity
,Service
, content provider,BroadcastReceiver
; manifest, erőforrások; compiler (Dalvik bytecode),.apk
; activity lifecycle (callback függvények, állapot mentése, váltás)- Megjegyzések a 16. diához:
- Az OS X már macOS.
- A Cocoa Touch helyett már egy ideje SwiftUI van.
- Az Interface Builder már az Xcode része.
- Megjegyzések a 16. diához:
- 10. hét (Gazdi László):
Activity
: back stack, vezérlés;Intent
: típusai, részei, explicit / implicit, extras, képességek, filter;startActivityForResult()
,onActivityResult()
; erőforrások (i18n); UI:viewBinding
; dpi, dp, sp;LinearLayout
,RelativeLayout
,ConstraintLayout
; padding és margin - 11. hét (Pásztor Dániel):
View
,getLayoutInflater()
, validáció,Menu
,ActionBar
,Toolbar
;PopupWindow
,AlertDialog
,Snackbar
;style
,Theme
; grafikák, animációk - 12. hét (Gazdi László): Fragment, RecyclerView, Persistence
- 13. hét (Gazdi László): Compose
- 14. hét (Gazdi László): NFC, Bluetooth, Http, Retrofit, BR, Service, Permissions
- 15. hét: szünet
Laborok
https://bmeviaubb03.github.io/laborok/
Házi feladatok
Web
A házi feladat során egy Angular alapú webalkalmazást kell készíteni.
Android
Az előadásokon és laborokon bemutatott technológiák segítségével egy komplex alkalmazás készítése önálló funkcionalitással.
Vizsga
- Kvíz
- 2023. tavasz
- Mintavizsga
- Web
- Mi az a TypeScript-dekorátor? Milyen szintaktikával használjuk? (kifejtős)
- kb. ugyanaz, mint Pythonban
- módosítani lehet vele egy osztályt vagy annak tagjainak működését
- pl.:
function logged(originalMethod: any, context: ClassMethodDecoratorContext) { return (...args: any[]) => { try { console.log("Calculation started..."); return originalMethod.call(this, ...args); } finally { console.log("...finished!"); } } } class Calculator { @logged add(a: number, b: number) { return a + b; } } const calculator = new Calculator(); calculator.add(1, 9);
- Mi az a TypeScript-dekorátor? Milyen szintaktikával használjuk? (kifejtős)
- Web
- Mintavizsga
- 2024. tavasz
- A diasorokon szereplő kifejtős kérdések
- Android
- 9. hét
- Milyen lehetőségeink vannak a fejlesztés közbeni debugolásra?
- Miket kell tartalmaznia a manifestnek?
- Mit értünk erőforrás-minősítő alatt?
- Magyarázza el a fordítás mechanizmusát!
- Mit jelent az obfuszkálás?
- Az Activity callback életciklus-függvények felüldefiniálásakor meg kell-e hívni kötelezően az ősosztály implementációját? Miért?
- Ha
A
Activity
-ről átváltunk aB
Activity
-re, milyen sorrendben hívódnak meg az életciklusfüggvények?
- 10. hét
- Magyarázza el az
Activity
back stack működési elvét! - Hogyan kell egy
Activity
-t indítani, ha vissza akarunk kapni adatot tőle? - Hogyan működik az implicit
Intent
? - Mit értünk sűrűségfüggetlen pixel alatt?
- Egy 320 dpi-s képernyőn
1.dp
hány darab pixelnek felel meg? - Sorolja fel a legfontosabb androidos layoutokat!
- Hogyan támogatja az Android a lokalizációt?
- Magyarázza el az
- 11. hét
- Mi a
LayoutInflater
feladata? - Hogyan lehet elkészíteni és kezelni egy menüt?
- Hogyan adható meg, hogy egy stílus az egész alkalmazásra érvényes legyen?
- Mi a
- 9. hét
- Android
- Vizsga
- Web
- Mire való a
getElementById
függvény? Hogyan lehet elérni? (kifejtős)- egy adott ID-jű elem DOM-ban való megtalálására
- így könnyen lehet a JS-kódból módosítani a DOM-ot
- a globális
document
objektumnak van ilyen tagváltozója, azt kell meghívni a JS-kódban - pl.:
<button id="disablerButton"> Disable the other button </button> <button id="buttonToDisable"> This button will be disabled </button>
function disableButton(buttonId) { const button = document.getElementById(buttonId); button.disabled = true; } disablerButton.addEventListener("click", disableButton("buttonToDisable"));
- egy adott ID-jű elem DOM-ban való megtalálására
- Mi a különbség a block és inline típusú HTML-elemek között? (kifejtős)
- block
- pl.:
<div>
,<p>
- a szülőjének teljes szélességét kitölti
- új sorban jelenik meg
- pl.:
- inline
- pl.:
<a>
,<span>
- nem tölti ki a szülőjének teljes szélességét
- ugyanabban a sorban jelenik meg
- így lehet formázni linkeket, vagy pl. highlightolni (kihúzni) szöveget
- csak a tagen belüli szövegre vonatkozik
- pl.:
- block
- Mire való egy
.d.ts
kiterjesztésű fájl? (kifejtős)- declaration file
- kizárólag a hozzá tartozó JavaScript-fájl típusinformációit tartalmazza
- gyakorlatilag ugyanaz, mint Pythonban a type stub, de a TypeScript fordításidőben jelzi a típusokkal kapcsolatos problémákat (Pythonban ezeket csak az IDE mutatja)
- Mire szolgál az Angular
ngIf
direktívája? (kifejtős)- elemek feltételes megjelenítésére
- pl.:
<div *ngIf="train"> <p> This is the {{train.departureTime}} {{train.type}} service to {{train.destination}}. </p> </div>
- az
*ngIf
attribútumban található kifejezést értékeli ki- itt a komponens
.ts
fájljában található változókra (is) hivatkozhatunk, melyekre adatkötést hoz létre - ha az értéke
true
, megjeleníti az elemet - ha
false
, törli a teljes elemet
- itt a komponens
- lehet
else
ága is- ha sok if-else ág van, érdemes az
ngSwitch
-et használni helyette
- ha sok if-else ág van, érdemes az
- Mire való a
- Android
- Hogyan tudunk saját stílust definiálni? Hogyan tudjuk ezt a stílust az egész alkalmazásra érvényesíteni? (kifejtős)
- View
- Saját stílust a
res/values/styles.xml
fájlban egy<style>
tag, majd ez alatt további<item>
tagek hozzáadásával lehet definiálni. - A manifest fájl
<application>
tagjébe kell felvenni egyandroid:theme
attribútumként, pl. így:<application android:theme="@style/CustomStyle">
.
- Saját stílust a
- Jetpack Compose
- Saját stílust egy
@Composable
függvény (pl.MyTheme
) létrehozásával lehet definiálni, melyben pl. aMaterialTheme
függvényt az általunk választott paraméterekkel hívjuk meg. - A
MainActivity
classsetContent
függvényében azApp
függvény hívását aMyTheme
függvény hívásába kell ágyazni.
- Saját stílust egy
- View
- Mire és hogyan használható egy flow? (kifejtős)
- A flow egy Python generatorhoz vagy egy Java Streamhez hasonló változótípus.
- Egy Python generatorhoz hasonlóan több visszatérési értéke is lehet.
- Egy Java Streamhez hasonlóan lehet mapelni vagy filterezni.
- Segítségével pl. fel lehet iratkozni egy adatfolyamra, hogy onnan folyamatosan kapjunk frissítéseket.
- A
Flow<>
típusú változó.collect { }
függvényét meghívva egy lambda kifejezést lehet végrehajtani a kapott értékkel.
- A flow egy Python generatorhoz vagy egy Java Streamhez hasonló változótípus.
- Vázolja fel a képen látható nézet kódját Jetpack Compose segítségével! A kódnak nem kell tökéletesnek és teljesnek lennie, de a lényegi részek szerepeljenek benne. (kódolós) A képen egy képernyő, melynek közepén teljes szélességben egy Email feliratú szövegmező látható, alatta egy Password feliratúval. Mindkét szövegmezőbe ugyanazon látható szöveg van beírva. Alattuk pedig egy Login gomb látható, szintén a képernyő teljes szélességében.
@Composable fun loginPage( modifier: Modifier = Modifier, ) { var emailAddress = "klaf@aut.bme.hu" Column() { TextField( placeholder = "Email", value = emailAddress, ) HorizontalDivider() TextField( placeholder = "Password", value = emailAddress, ) HorizontalDivider() Spacer() Button() { Text(text = "Login") } } }
- Hogyan tudunk saját stílust definiálni? Hogyan tudjuk ezt a stílust az egész alkalmazásra érvényesíteni? (kifejtős)
- Web
- A diasorokon szereplő kifejtős kérdések
1. félév | |
---|---|
2. félév | |
3. félév | |
4. félév | |
5. félév | |
6. félév |