Hirdetés

Keresés

Új hozzászólás Aktív témák

  • BE4GLE
    senior tag

    Ettől féltem. (Próbálok többek, több kérdésére is választ adni, nem csak neked.)
    Amin dolgozom, az egy céges JAVA backend library. A valós feladat, hogy az ügyfél listákat tudjon létrehozni egy adott parent-child business object-ből (listánként vagy csak az egyik, vagy csak a másik). A listáknak azonban különböző saját tulajdonságaik lehetnek (jó lenne ha dinamikusan lehetne őket kreálni és nem kéne folyton a CD-t dolgoztatni), sőt maguk a kapcsolatok is változó változókkal bírnak. Tehát egy BO többször is szerepelhet a listában, ha a kapcsolatnak mások a paraméterei.
    Az egyszerűen menne, hogy lepéldányosítok egy közös interfészt, de az nem oldja meg, hogy minden új típusú listára új osztályt kéne csinálnom. Ha csinálok egy lista osztályt és abba dobok egy "tömböt" a plusz paraméterekről, akkor viszont azokat folyton cast-olnom kellene. Ezért gondoltam, hogy inkább csinálok ahhoz is egy marker interfészt, plusz bele az említett függvényt a lehetséges értékekkel és akkor a kliens oldalon nulla tudással lehet kezelni a dolgot.
    A backend-nél arra gondoltam, hogy ha foreign key-t szeretnék a különböző paraméterekre, akkor az macerásabb. Listatípusonként tudok csinálni egy táblát, a típusleíróba meg beírom a hozzátartozó tábla nevét, de kicsit mókolásnak érzem.
    De bármennyire is keresek, nem találok rá elegáns megoldást.

    Én ugyan mobil fejlesztő vagyok, de az a tapasztalatom, hogy az öröklődéssel szemben sokszor ésszerűbb kompozíciót használni. Nem tudom, hogy ez segít-e, de talán ötletet ad ahhoz, hogy másként közelítsd meg a problémát. Persze miután Google-öztél egy picit a témában. :B

  • BE4GLE
    senior tag

    Kicsit a logisztikával vagyok bajban, ha piconetet használnék. Ami esetet írsz, vélhetően egy helyi windows-os gép volt a piconet központ, és amikor beérkezett egy új android a hatósugárba, már tudta, melyik piconet-het csatlakozzon, csatlakozott, és jelezte, hogy érkezik az ember. Ha rosszul sejtem, javíts ki.

    Ha egy kliens piconet-hez csatlakozik, egyszerre csak egy központhoz csatlakozhat. Oda küldheti el az üzenetet. Aztán kotorásznia kell a többi beacon után, csatlakozni oda, és küldeni üzenetet újra. Kicsit hasonló szitu, mint amikor vonalas LAN-on letiltják a multicast csomagokat, és következésképp ha küldeni akarsz egy multicast-ot, fel kell deríteni az összes állomást, és egyesével elküldeni a csomagokat. Mindazt a temérdek sok kommunikációt végezni el ahelyett, hogy csak kiküldenél egy szem multicast csomagot, és aki kapta, kapta, aki nem, az nem. Vonalas LAN-on még letojnám az esetet, mert úgyis hálózatról megy minden, van energia. Mobil telefon esetében akkumulátor van véges kapacitással.

    Nem jobb a helyzet akkor sem, ha a mobil telefon a beacon. A beacon-nek állandóan üzemben kell lennie ahelyett, hogy mondjuk időzített job jelleggel 5 percenként egyszer feléled, kidob egy üzenetet a környezetének, aki kapta, kapta, aki nem, az nem, ignore, és alkalmazás lepihen újra. Beacon esetében nincsen pihi. Akku kajálás van helyette.

    Szóval ez a bajom a piconet-tel, és ezért akarok inkább broadcast send-et.

    Ha az nem létezik, még kiegészítőként azon gondolkodok el, hogy windows-on be lehet-e állítani low energy beacon-t, és az korlátozná a hatósugarat. Lehetségesen csak korlátos számú master lehet a környezetben egy adott időpillanatban. Viszont az eddigiekben nem találtam arra módot, hogy piconet-hez csatlakozó kliens hogyan kérdezheti meg a master-től az adási energia szintet. Ha megkérdezheti, az még mindig kommunikáció minden master felé, amit a master nem biztos, hogy venni fog, mert míg a master ad 100 mW-on, a slave 1 mW-on, a slave megkapja az üzenetet, a master nem, és kivárási idő telik el minden alkalommal, mire kiderül, hogy "az a hálózat messze van". Nem csak az én beacon-jeim lehetnek ott, de ezernyi másik ugyan úgy. Ha lehetne azt párhuzamosan, minden létező beacon-höz egyszerre csatlakozni, talán megpróbálnám, de ahogy olvasgattam, arra nincsen támogatás, csak egyik a másik után, és úgy a szükséges idő már nem korlátos.

    Igazából ezt úgyis megpróbálhatod, hogy csinálsz stream-et, amire egy windows-os kliens feliratkozik. Ez amolyan push gateway lenne. Beállíthatod, hogy automatikusan induljon windows boot-nál. Ez a kliens jelzi a szerver app felé, hogy jelen van, ha csatlakozott az ottani hálózatra. Ergo a közelben van. Annyit kell még megoldani, hogy ledobáld azokat, akik nincsenek már jelen.

    A szervernek nem kell androidos eszköznek lennie. Elég, ha van egy endpoint, amin lehet üzetet küldeni a feliratkozóknak. Az üzenet küldés android oldalon pedig csak simán ennek a végpontnak a meghívása lenne.

  • BE4GLE
    senior tag

    Nem akarok piconetet, nem akarok semmi kapcsolódást. Publikus információt akarok kiküldeni bármilyen vevőnek, ami éppen akkor éppen ott van vagy nincs. A többi eszköz tervezetten windows-os lesz, de annak nem kellene számítson, ha nem barkácsolok át szabványos alapokat.

    A fenti linken olyan sok mappa van mappa hátán, hogy még keresem a levesben a húst, hogy a saját függvények rétegei alatt végül mit használ :U

    Ez így inkább beacon-nek hangzik. Többnyire marketing kommunkiációhoz használják. Én a második linken található library-t használtam is néhány éve. Bár az a prokekt pont nem marketing célú volt. Elhelyeztünk ilyen beacon-öket a cég épületében, és így lehetett tudni, ha valaki megérkezett az irodába.

  • BE4GLE
    senior tag

    Küldeni akarok. Sender kell az android telefonra. Az android telefon körül létező - és éppen broadcast-ra figyelő - összes BT eszközknek akarok egy pár karakteres üzenetet eljuttatni az androidról.

    Amúgy nem iBeacon-ről van szó véletlenül? Mert ha igen, ahhoz itt egy library és egy sample projekt: [link]

  • BE4GLE
    senior tag

    Küldeni akarok. Sender kell az android telefonra. Az android telefon körül létező - és éppen broadcast-ra figyelő - összes BT eszközknek akarok egy pár karakteres üzenetet eljuttatni az androidról.

    Hm... Gyorsan rákerestem a githubon és egy ilyet találtam neked: [link] Kiindulási pontnak talán jó. Bár nem írtad, hogy a többi BT eszköz is androidos e.

  • BE4GLE
    senior tag

    Nem teljesen java, inkább OOP kérdés, amiben kicsit elveszve érzem magam.
    Vannak állataink, legyen mondjuk kenguru és tigris. Szeretnénk építeni egy cirkuszt, több ilyen állattal.
    A cirkusz igazgató le tud hívni egy állatlistát, amiben látja mindkét fajt és az adataikat, pl. születési év. Illetve ha kiválaszt egyet, akkor utasítást adhat pl. egy gombbal. Mindkét állat tud a farkán ugrálni, viszont a kenguru el is tud rejteni valamit az erszényében.
    A problémám, hogy sokak szerint egy instanceof mindig code smell. Akár leszármazást, akár kompozíciót használok, valahogy meg kell tudnom a lista egy adott elméről, hogy milyen többlet képessége.
    Hogyan lehet ezt szépen megoldani?
    Illetve lehet-e dinamikussá tenni az egészet, hogy kódváltoztatás nélkül új fajokat kreáljon az igazgató, amik saját "képességekkel" rendelkeznek?

    Az OOP-vel könnyű átesni a ló túloldalára és túlkomplikálni egy egyszerű problémát. Pl. ha a kenguru el tud rejteni valamit azt lehet simán relációs adatszerkezetként is értelmezni. X elrjeti Y-t. Ez akár tárolható egy táblában is. A kengurunak nincs szüksége "elrejt" metódusra. Az lehet egy tőle független metódus. Az ugrás szintén egyszerű. Hiszen olyankor mozgatod és animálod az állat objektumot. Nem feltétlenül kell tudnia magáról, hogy ő képes e ugrani. Az ugrás metódus majd eldönti, hogy az adott faj képes e rá. Mozgatja és keres hozzá egy animációt, ha van. Ez mind megoldható faj azonosítóval. Nem kell instanceof. Próbáld az adatszerlezeteidet minél egyszerűbre írni. Egy állat nagyon sok mindenre képes. Hatalmas osztályaid lesznek, kismillió őssel, ha ilyen szemléletben tervezed őket. És az végül mindig visszaüt.

  • BE4GLE
    senior tag

    Sziasztok!

    Android telefonra keresek példát BT broadcast üzenetet küldeni.

    A tippeket köszönöm.

    Szia! Nem értettem pontosan. Bluetooth broadcast receiver példát szeretnél? Vagy bluetooth-on szeretnél üzenetet küldeni?

  • BE4GLE
    senior tag

    Nem teljesen java, inkább OOP kérdés, amiben kicsit elveszve érzem magam.
    Vannak állataink, legyen mondjuk kenguru és tigris. Szeretnénk építeni egy cirkuszt, több ilyen állattal.
    A cirkusz igazgató le tud hívni egy állatlistát, amiben látja mindkét fajt és az adataikat, pl. születési év. Illetve ha kiválaszt egyet, akkor utasítást adhat pl. egy gombbal. Mindkét állat tud a farkán ugrálni, viszont a kenguru el is tud rejteni valamit az erszényében.
    A problémám, hogy sokak szerint egy instanceof mindig code smell. Akár leszármazást, akár kompozíciót használok, valahogy meg kell tudnom a lista egy adott elméről, hogy milyen többlet képessége.
    Hogyan lehet ezt szépen megoldani?
    Illetve lehet-e dinamikussá tenni az egészet, hogy kódváltoztatás nélkül új fajokat kreáljon az igazgató, amik saját "képességekkel" rendelkeznek?

    Szerintem az insteanceof önmagában még nem code smell. Kotlinban sem code smell az is operator. Sőt, ha használod, még smart cast-olja is az objektumot. A java azért más picit, mert ott neked kell cast-olni. Inkább azt mondanám, hogy könnyű code smell-t csinálni vele javaban. Például figyelni kell, hogy csakis final pointerre hívd meg, mert hiába csekkolod, hogy instanceof ha később változhat az object amire a pointer mutat.

  • BE4GLE
    senior tag

    "An unmodifiable collection is not necessarily immutable. If the contained elements are mutable, the entire collection is clearly mutable, even though it might be unmodifiable. For example, consider two unmodifiable lists containing mutable elements. The result of calling list1.equals(list2) might differ from one call to the next if the elements had been mutated, even though both lists are unmodifiable. However, if an unmodifiable collection contains all immutable elements, it can be considered effectively immutable. "

    [link]

    Azt a kotlin extension-ök sem állítják, hogy a listOf(...) eredménye immutable. Szóval nekem tökéletesen megfelel a kotlinos elnevezés. És annak legaláb egy olyan List a visszatérési értéke, aminek nincs add metódusa, ami aztán random RuntimeException-t dobál, mint a javas alternatívák. De abban egyetértünk, hogy lista elemeinek is immutable-nek kell lenniük. :K

  • BE4GLE
    senior tag

    Iteratornak is van remove metodusa: [link]

    Immutable kollekciokra tobb fuggveny van, pl. Collections.unmodifiableList, List.of (java 9), List.copyOf (java 10)

    Android vonalon én java 8-nál tetőztem. Kotlinban ez pl. így működik:
    listOf(...) és mapOf(...) ha final kell és
    mutableListOf(...) és mutableMapOf(...) ha mutable kell

    Az List.of szintén List típust add vissza, csak gondolom dob egy csinos UnsupportedOperationException-t ha add-ot hívsz az outputra.

  • BE4GLE
    senior tag

    A List meg a Map nem típus, hanem interface. És mindkettő a mutable típusok interface, a List interfaceben ott az add és a Mapban is a put.

    LOL. Olyan rég Kotlin-ra váltottam, hogy már el is felejtettem, hogy a list is definiálja az add metódust. Akkor ha jól rémlik talán az Iterable a jó analógia rá. :B

  • BE4GLE
    senior tag

    Volt már hasonló kérdésem saját osztállyal. (ősosztály metódus elérés, override)

    Azt még mindig nem értem, hogy beépített osztályoknál mi a különbség a list1-list2 között, ha az egyiket List-be a másikat ArrayList típusba teszem. (ez a kérdés akár a Map/HahMap -re vonatkozhatna)

    List<String> list1 = new ArrayList<String>();
    ArrayList<String> list2 = new ArrayList<String>();

    Annyit tennék, még hozzá, hogy az ArrayList mutable. A projektekben az ilyen típusú visszatérési értékek kerülendők. A HashMap is ilyen. Ezeket inkább csak függvények és osztályok belső logikájához használd. Visszatérési értéknek mindig próbálj immutable-t használni, mint a List vagy a Map. Azt gondolom észrevetted, hogy az interface típusokban nincs add és put. Okkal. ;)

  • BE4GLE
    senior tag

    Metódus-referenciát akartam írni, de elbabráltam.
    Ha a Literacy osztályban implementálsz egy static compare metódust a Double::compare mintájára (ahogy a lambdában csináltad), akkor úgy is lehetne a streames kód, hogy:
    .sorted(Literacy::compare)

    Rövidebb nem lesz összességében, de elegánsabb, és nálam egy kód reviewn is hamarabb átmegy ;)

    Hát igazából, ha már ott implementálja, akkor simán override-olhatja a compareTo metódust, és akkor üresen is hívhatja a sorted() függvényt. :B

  • BE4GLE
    senior tag

     .sorted((p1, p2) -> {return Double.compare(p1.getLiteracyRate(), p2.getLiteracyRate());})
    Így már működik! Megjegyeztem. Köszönöm!

    Hopsz! Igen, azt nem írtam ki szépen. De látom ügyesen megoldottad. :R Szívesen!

  • BE4GLE
    senior tag

    Elakadtam a következő stream soron:
     ArrayList<Literacy> list = new ArrayList<>();
            try {
                Scanner scanner = new Scanner(Paths.get("literacy.csv"));
                while (scanner.hasNextLine()) {
                    String[] line = scanner.nextLine().trim().split(",");
                    list.add(new Literacy(line[0],line[1],line[2],line[3],Integer.valueOf(line[4]),Double.valueOf(line[5])));
                    
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }
            list.stream()
                .sorted((p1, p2) -> {return p1.getLiteracyRate() - p2.getLiteracyRate();})
                .forEach(l -> System.out.println(l));
    A fordítási hibaüzenet: incompatible types: bad return type in lambda expression
    possible lossy conversion from double to int
    A Literacy osztályban a getLiteracyRate double típus.

    Nem értem mi a baja két double kivonásával és visszaadásával? (int-el működne, de nem az a feladat)

    Egy kis magyarázat: A comparator mindig int visszatérési értékű. Az érték előjele mutatja meg, hogy merre néz a kacsacsőr. Ha nem primívet használsz, akkor az object rendelkezik egy compareTo metódussal aminek int a visszatérési értéke. Szóval ha double helyett Double lenne a property, akkor hívhatnád így is. p1.compareTo(p2). Vagy ha ez az egyetlen property akkor akár comparator nélkül is mehet: sorted()

  • BE4GLE
    senior tag

    Elakadtam a következő stream soron:
     ArrayList<Literacy> list = new ArrayList<>();
            try {
                Scanner scanner = new Scanner(Paths.get("literacy.csv"));
                while (scanner.hasNextLine()) {
                    String[] line = scanner.nextLine().trim().split(",");
                    list.add(new Literacy(line[0],line[1],line[2],line[3],Integer.valueOf(line[4]),Double.valueOf(line[5])));
                    
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }
            list.stream()
                .sorted((p1, p2) -> {return p1.getLiteracyRate() - p2.getLiteracyRate();})
                .forEach(l -> System.out.println(l));
    A fordítási hibaüzenet: incompatible types: bad return type in lambda expression
    possible lossy conversion from double to int
    A Literacy osztályban a getLiteracyRate double típus.

    Nem értem mi a baja két double kivonásával és visszaadásával? (int-el működne, de nem az a feladat)

    p1.getLiteracyRate() - p2.getLiteracyRate()
    Ehelyett írd ezt: Double.compare(p1, p2)

  • BE4GLE
    senior tag

    Vagy csak olyanok kozott dolgozom akik a problemat oldjak meg a szoftver letrehozasaval es az implementacio helyesseget tesztelik megfelelo szintu tesztekkel utat helyesebbnek tartjak.
    Tesztet irni TDD-hez DE ugy, hogy az tenyleg minden lehetseges implementacio eseten minden hibat elkap, akkora befektetes, hogy annyi ido alatt az _egyik_ implementaciot tesztelessel egyutt egy-harom masik problemara is megcsinalja [JOL]. Teljes tesztet elore megirni ugy, hogy egy lehetseges implementacio mar a fejeben van, az meg a menet kozben kiderulo donteseknel csinal lyukat [aztan vagy betomik vagy nem... talan ahol merge feltetelbe fut].
    Egy esetben jo lehet: az "agy" irja a teszteket, a code monkey-k/juniorok/etc. meg az implementaciot. De akkor sem biztos hogy kicsit is hosszabb tavra nezve.
    [Termeszetesen az elozoleg irt kiveteleket fenntartva, altalanosabb meretu/beagyazottsagu/bonyolultsagu fejlesztesi feladatokra.] Es persze SZVSZ.

    Nem értem mi igényel ebben olyan sok időt. :B Az én tesztjeim nem szoktak olyan robosztus kódok lenni. Hiszen csak pár mock adat, fake hívás, és assert az egész. Viszont a teszt nélküli legacy kódok javítására borzalmasan sok idő megy el. A menet közben kiderülő döntések pedig mindenképpen megkavarják a dolgokat. Ez nem érv a TDD-vel szemben.

  • BE4GLE
    senior tag

    Ha már Hello World.
    Azt hogy kell TDD-ben csinálni?
    Hogy állapítja meg a teszt hogy kiírta-e a képernyőre hogy Helló világ?
    És a jó pozícióba. Nem csak Helló vi és a lág meg kilóg oldalt.

    Ha ez a kérdés fölmerült benned az számomra azt sugallja, hogy nagyon nem tudod mire való egy unit teszt. Vagy csak trollkodsz. :B Az ilyen tesztekben az interface-eket mock-olod. A user interface-t is. Nem célja ezeknek a teszeknek ellenőrizni, hogy a layout-ot helyesen raktad e össze, és hogy a szöveged jól legyen tördelve. Viszont a Hello World-ig vezető utat le tudod tesztelni és a kimenetet is.

  • BE4GLE
    senior tag

    Túl cinikus vagyok a TDD-hez :)
    Az utóbbi években csak olyan agilis projektekben dolgoztam, ahol az agilitás leginkább arra vonatkozott, hogy menetközben találja ki a megrendelő, hogy mit is akar (vagy nem). A projektek óriási keretrendszereket használnak, amiben az egyes funkciók deklaratív elemeken keresztül automatikusan készülnek el. Ritka volt az, amikor nem változott hétről hétre a követelmény, és nagyon kevés része volt a kódnak az, amiben unit tesztre érdemes dolgok történtek.
    Ha ilyen projektekre valaki rávág egy coverage kritériumot, mert az jól mutat, a teljes csapat egy emberként áll fel, és megy át a konkurenciához.
    De hello ${username} példakódban piszkosul jól mutat...

    Amit leírtál az távolról sem agilis fejlesztés. A rossz menedzsment mindig rányomja a bélyegét a projektminőségre. Ez nem a TDD hibája.

  • BE4GLE
    senior tag

    A TDD zseniális ötlet.
    De azért ara kíváncsi vagyok hogy a gyakorlatban hány cég fejleszt ezzel.
    Kiderül hogy 1-2, de azok is megbánták.

    Nálunk se jutnál keresztül a felvételi folyamaton enélkül. És nem tudom miről beszélsz. Én sosem bántam meg. Az olyan kódokkal viszont nagyon nehéz dolgozni, amik teszt nélkül össze lettek gányolva. Már csak azért is, mert az ilyen kódok jellemzően később se teszteletőek. Egészen máshogy írsz meg valamit, ha a tesztelhetőség és karbantarthatóság is szempont, és nem csak az, hogy minél előbb legyen egy látszólag működő funkciód.

  • BE4GLE
    senior tag

    Mennyire használják a gyakorlati fejlesztésben a metódus tesztelés (assert) technikát? Érdemes komolyabban elmélyülni vagy elég az "ezt is láttám már" tudás?

    Sok cég projektjébe be se lehet mergelni olyan kódot, ami nincs letesztelve. Szóval jobb ha megbarátkozol velük, és úgy általában a TDD-vel, mert ha csak nem valami kontár projekten dolgozol, akkor legalább egy code coverage ellenőrzés le fog futni a projekten.

  • BE4GLE
    senior tag

    Most már, működik. Miután elárultad, hogy az equal-t is meg kell valósítani. (override) :K Előtte nem tudtam, hogy a contains (teljeskörű) működéséhez azt is meg kell írni.

    Köszönöm.

    Egy érdekesség: Java 14-től bevezették a record class-t. Szóval ha azt használod, akkor nem kell ilyen boilerplate kódokkal vacakolnod. ;)

  • BE4GLE
    senior tag

    Ebben a tanulási fázisban (szerintem) még nem ismert az exception.

    Ezesetben bocsi a SPOILER miatt. :R Coming soon... :DDD

  • BE4GLE
    senior tag

    remélem nagyon kezdő kérdések is elférnek itt

    Elkezdtem a MOOC.fi Java programozás kurzust és az egyik feladatnál elakadtam.
    Illetve a feladatot magát meg tudtam oldani, az ellenőrzés mégis hibaüzenetet dob rá.
    Ez lenne a kód:

    import java.util.Scanner;

    public class InAHoleInTheGround {

    public static void main(String[] args) {
    printText();
    }

    public static void printText() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Give numbers:");
    int sum = 0;
    int count = 0;
    int even = 0;
    int odd = 0;
    while (true) {
    int number = Integer.valueOf(scanner.nextLine());
    if (number == -1) {
    break;
    }
    sum += number;
    count++;
    if (number % 2 == 0) {
    even++;
    } else {
    odd++;
    }
    }
    System.out.println("Thx! Bye!");
    if (count != 0 && sum != 0) {
    System.out.println("Sum: " + sum);
    System.out.println("Numbers: " + count);
    System.out.println("Average: " + 1.0 * sum / count);
    System.out.println("Even: " + even);
    System.out.println("Odd: " + odd);
    }
    }
    }

    És a hibaüzenet:

    Tudnátok segíteni, mi lehet a gond?

    Én a kilépő ágat try-catch blokban csináltam volna. Lekezelve a NumberFormatException kivételt. Az az if (number == -1) nem tudom mitől véd egész pontosan. :B

Új hozzászólás Aktív témák

Hirdetés