Java

[ Megoldva ] Javascript USB-kezelési probléma

Fórumok

Egy böngésző alapú alkalmazásból javascripttel kommunikálok USB-n keresztül az xterm.js segítségével.

Mivel a soros kommunikációt csak felhasználói beavatkozásra engedi megnyitni a Chrome (Firefox még úgy sem), így jelenleg, ha a felhasználó megnyom egy gombot, akkor meg tudom nyitni az USB kapcsolatot, adatot tudok cserélni az eszközzel, és utána le tudom zárni a kapcsolatot. Minden megnyitáshoz a felhasználónak ki kell választania a soros portot. Ez működik, de nehézkes.

Szerettem volna egy megnyitás és egy lezárás gombot is készíteni, de itt kezdődött a probléma. Ha egy külön esemény nyitja meg a soros portot, akkor hiába küldök rá bármit, már nem működik.

Azaz a következő kód megy:

function on_click() {
   var sc = new SerialComm();
   sc.sendCmd( command );
   sc.close();
}

A következő pedig nem:

var sc;

function on_click_open() {
   sc = new SerialComm();
}

function on_click_send() {
   sc.sendCmd( command );
   sc.close();
}

Hibaüzenetet nem kapok, csak nem megy.

Van valakinek ötlete, mi lehet a probléma? Vagy ez valamilyen biztonsági megkötés, és így soha nem is fog menni, csak egy eseményben?

Megoldás: gond nélkül megy külön a megnyitás és a kommunikáció, nincs korlátozás. Én hibáztam a SerialComm osztályon belül. :(

Vaadin újrafelhasználható felületi elemek

Fórumok

Most ismerkedek a Vaadinnal.Azt a feladatot kaptam, hogy alakítsak ki olyan kódbázist, amiben újra felhasználható elemek vannak.
Itt viszont állandó küzdés volt eddig.

A lényeg a kód, így mutatok példát:

public class AComponent extends VerticalLayout implements MyComponent {

    private static final String PERSON = "Személy";
    private static final String ORGANIZATION = "Szervezet";

    private ADto aDto = new ADto();

    private ComboBox<String> type = new ComboBox<>();

    private PersonComponent personComponent;

    private OrganizationComponent organizationComponent;

    private Binder<ADto> binder = new BeanValidationBinder<>(ADto.class);

    public AComponent(String title) {
        binder.forField(type).bind(ADto::getType, ADto::setType);
        //binder.bindInstanceFields(true);
        binder.setBean(aDto);

        add(new H3(title));
        setPadding(false);

        type.setPlaceholder("<válasszon>");
        type.setItems(PERSON, ORGANIZATION);
        add(type);

        VerticalLayout sumbitterDataContainer = new VerticalLayout();
        sumbitterDataContainer.setPadding(true);
        sumbitterDataContainer.setSpacing(false);
        add(sumbitterDataContainer);

        type.addValueChangeListener(listener -> {
            if (isPerson()) {
                personComponent = new PersonComponent(sumbitterDataContainer);
            } else {
                organizationComponent = new OrganizationComponent(sumbitterDataContainer);
            }
        });
    }

    @Override
    public boolean validate() {
        boolean valid = binder.validate().isOk();
        if (valid && isPerson()) {
            valid = personComponent.validate();
        }
        if (valid && isOrganization()) {
            valid = organizationComponent.validate();
        }

        return valid;
    }
    private boolean isOrganization() {
        return ORGANIZATION.equals(type.getValue());
    }

    private boolean isPerson() {
        return PERSON.equals(type.getValue());
    }
}

public class PersonComponent extends VerticalLayout implements MyComponent {

    private PersonDto personDto = new PersonDto();
    private NameComponent personName = new NameComponent("Viselt név");
    private NameComponent birthName = new NameComponent("Születési név");

    private Binder<PersonDto> binder = new BeanValidationBinder<>(PersonDto.class);

    public PersonComponent(FlexComponent container) {
        binder.bindInstanceFields(this);
        binder.setBean(personDto);

        addDataFields(container);
    }

    @Override
    public boolean validate() {
        return binder.isValid() && personName.validate() && birthName.validate();
    }

    private void addDataFields(final FlexComponent container) {
        container.removeAll();
        container.add(personName, birthName);
    }
}

public class PersonDto {
    private NameDto personName;
    private NameDto birthName;
    private NameDto mothersName;
    private BirthplaceDto birthplace;
    private LocalDate birthdate;
    // getters, setters...
}

public class ADto {

    @NotNull
    @NotEmpty
    @NotBlank
    @Size(min = 1)
    private String type;

    private PersonDto personDto;

    private OrganizationDto organizationDto;
    // getters, setters...
}

Azaz pl. van egy névbekérő rész ami ismétlődhet több formon is. 

Körülnéztem a Vaadin oldalán is, de csak egyszerű példák vannak. Ahol mindent feldobálsz egy form-ra, és nem használsz újra részeket. Kerestem Google-el is, de nem találtam komolyabb példákat.

1.) Az elképzelésem az volt, hogy A dto-kon levő annotációkkal tudom kontrollálni a felületen megjelenő hibaüzeneteket.
Tehát ha pl. kötelező megadni a AComponent type lenyílóját, ha pl. rákattint egy gombra amivel mentené a formot és validálja is közben a validate metódussal, akkor majd szépen kiírja a hibaüzenetet, hogy "nem lehet üres" a type mező alá. De ez nem történik meg. :( Látható, hogy ráraktam szinte minden létező annotációt. De a binder.isValid() azt mondja valid, amikor null az értéke.

2.) Valamint eredetileg arra gondoltam, hogy biztos van valami automatizáció, amely egy ilyen Component tree-n végig tud menni és a bevitt adatokból létrehoz egy ADto-t, benne a PersonDto-val, benne a NameDto-kkal stb. Úgy tűnik ilyen nincs. :(

Az is lehet csak rossz helyen kutatok és van valami egyszerű megoldás is, ami működik is.
Van valakinek valami megoldása erre?

Integer keresése integerekben

Fórumok

A feladat:

Megyek végig egy integer listán. Ami megfelelő integer, azt berakom egy másik listába. Az eredeti lista sorrend nem változhat meg az eredmény listában.

Ha az integer már szerepel az eredmény listában, akkor nem adhatom hozzá (azaz nem lehetnek duplikáltak az eredményekben).

Max. olyan 400-500 ezer integer lehet az eredménylistában.

Az eredménylistának nem kell tartalmaznia mind a 400-500 ezer sort. Mivel lapozható, így csak az aktuális oldalszámnak megfelelően pl. 100 db-nak.

Jelenleg HashSet-el oldottam meg.

Viszont nem ártana a memóriára is figyelni. CPU-ra is figyelni kell, de arra most ideiglenesen jó a + HashSet töltése.

Tudom van a Bloom filter is, de az nem 100%-os. Viszont valami hasonló megoldást keresnék.

Java - `-XX:CompressedClassSpaceSize` állítás mennyire baj

Fórumok

Sziasztok,

Van néhány, JVM11 felett futó appunk k8s-en. Néhány hete történt, hogy a k8s egyszerre lőtte ki egy deployment összes podját, OOMKilled okkal a tesztkörnyezetben. Szerintem ennek nem kellett volna megtörténnie - a Javas appok a saját igényeiknek beállított `-Xmx`-szel futnak (3200m), a pod memória requestje 4Gi, limitje 5. 

Utólagos vizsgálatok alapján az alábbiakat sikerült megszülnöm:

  • A memóriahasználat a pod indulásától kúszik fel, normál esetben megáll valahol 4.5 Gb környékén
  • A bekötött micrometer szerint a heap max tökéletesen bennemarad a 3200m-ben, de a nonheap memória max ~1.2 Gb.
  • lásd a képet lejjebb, de amivel el vagyok veszve, hogy a JVM kapásból befoglalja a micrometer által a `jvm_memory_max_bytes`-ban mondott értéket?
    • ha igen, akkor részben boldog vagyok, mert a JVM Heap max + JVM Non-Heap max kiadja azt, amit a k8s szerint a pod memóriában lefoglal a nap végére
      • cserébe mintha a heapnél nem így működne, lásd a nap elejét. Tehát memória usage = JVM Heap Committed + JVM NonHeap max?
      • miért?
    • ha nem, akkor miért mond a k8s akkora memória használatot, ami a `sum(jvm_memory_max_bytes)`-nak felel meg?

Namost, ha helyesen értem az interneten talált doksikat, és a micrometer metrikáit, akkor a nonheap áll:

  • CodeHeap 'non-nmethods' (a jvm_memory_max_bytes 5 megabájtot mond rá)
  • CodeHeap 'non-profiled nmethods' (a jvm_memory_max_bytes ~117 megabájtot mond rá)
  • CodeHeap 'profiled nmethods' (a jvm_memory_max_bytes ~117 megabájtot mond rá)
  • Compressed Class Space (a jvm_memory_max_bytes 1 gigabájtot mond rá)
  • Metaspace (a jvm_memory_max_bytes -1-et mond rá)

Odáig eljutottam a doksi alapján, hogy a Compressed Class Space méretét a `-XX:CompressedClassSpaceSize` kapcsolóval tudom állítani, és hogy a default értéke 1 gigabájt. A kérdésem az, hogy ezt az 1 gigabájtot a JVM lefoglalja egyből induláskor, akár rak oda adatot, akár nem? A jvm_memory_used_bytes metrika szerint ebből a Compressed Class Space-ből az utóbbi ~30 napaban sosem volt több, mint ~30 mega használva, és az is szélsőérték.

TLDR két kérdésem van, hátha valaki nagyon otthon van JVM memory tuningban:

  • Ha hagyom a `-XX:CompressedClassSpaceSize`-ot defaulton (~nem adom meg), akkor ezt az 1 gigabájtot a JVM lefoglalja egyből induláskor, akár rak oda adatot, akár nem?
  • Ha lejjebb veszem az `-XX:CompressedClassSpaceSize`-ot (de még mindig a valós használat többszörösére, mondjuk 256 megára, szép kerek szám), akkor milyen veszélyeket rántok magamra?

Megpróbáltam végigtúrni az internetet, de nem nagyon találtam semmi hasznosat elsőre. Ha van jó doksid, vagy releváns tapasztalatod, megköszönöm.

Köszi előre is,

float cseréje double-ra a teljes projectben (IntelliJ IDEA)

Fórumok

Szeretnénk lecserélni a float típust double-re a teljes projectben.

Mindezt úgy hogy a primitív típust primitív típusra (float -> double) az osztályt pedig osztályra (Float -> Double).

Nyújt ehhez valami refactoring támogatást az IntelliJ IDEA vagy bármi más? Jó lenne valami előzetes megtekintési lehetőség amit az IDEA egyébként is fel szokott ajánlani refactor-nál, mert nem biztos, hogy mégis mindenhol le kell cserélni, szóval jó lenne ezt ellenőrzötten végezni, de ha ilyen lehetőség nincs akkor az is jó ha tényleg mindenhol lecseréli első körben aztán majd "manuálisan" ellenőrzünk minden előfordulást.

Java alkalmazások által használt java verzió beállítása

Fórumok

Üdv Mindenkinek!

Van arra mód, hogy a Javat használó alkalmazásoknál a használandó Java verziót automatikusan ki tudja választani a op. rendszer? Van néhány alkalmazásom, ami a 8as JAVAhoz ragaszkodik (ÁNYK, Microsigner), és meg se nyikkannak például a 11-sel. Viszont vannak olyan appok, amik csak a 11-gyel hajlandóak működni.

BPMN 2.0 létjogosultsága

Fórumok

Hali!

Van olyan aki komolyabban foglalkozik BPMN, DMN cuccokkal, modellekkel?

Van értelme foglalkozni vele komolyabban, esetleg nagyobb szoftver projektet erre alapozni? Ha jól tudom 2.0nál megrekedt a szabvány.

Java elég jól ellátott eszközökket, de Go hoz is találtam engine-t, bár kezdetleges.

Spring boot lehetőségek?

Fórumok

Próbálok világosabban látni a Sping Boottal kapcsolatban, nem tudom merre induljak...

 

Kérdés röviden:

A Spring boot alkalmas frontend programozásra?

 

Bővebben:

Ha írok egy REST API-t Spring bootban. A kliens oldali rész is megoldható Spring boot segítségével? Letudom a REST API-t kérdezni kliens oldalon Spring boot-tal? Valami letölthető Spring boot alkalmazás klines oldalon. Létezik ilyen? Vagy csak JavaScript használható kliens oldalon?

JPA OneToMany Id mezők nem frissülnek merge után

Fórumok

Van egy OneToMany reláció, pl. egy Post-Comments tankönyvi lépda:

public class Post implements Serializable {
    private int id;
    private List<Comment> comments;



    @Id
    @Column(name = "ID")
    @TableGenerator(...)
    @GeneratedValue(...)
    public int getId() {
        return id;
    }

    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    public List<Comment> getComments() {
        return comments;
    }
}
public class Comment implements Serializable {
    private int id;
    private int idPost;
    private Post post;

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name = "ID_POST", insertable = false, updatable = false)
    public int getIdPost() {
        return idPost;
    }

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "ID_POST", referencedColumnName = "ID")
    public Post getPost() {
        return post;
    }
}

Az adatbázis kezelő alatta MySql és a Comment tábla ID mezője AUTOINCREMET.

Abban az esetben ha entityManager.merge(post) utasítással mentek egy Post entitást melynek a comments listájához adok egy Comment entitást, akkor szépen elment, viszont a Comment entitás ID mezője, melynek a MySql ad értéket az autoinc miatt nem frissül. Csak ha egy entityManager.refres() vagy bármilyen más módon újra lekérem. Mit kell még tenni hogy a merge hatására frissítse az entitást úgy hogy az id értékét visszakapja anélkül, hogy újra lekérdezném?

A JPA provider EclipseLink.

GlassFish @Schedule jobok leállnak ha megváltoztatják a rendszeridőt

Fórumok

Sziasztok!

Egyik ügyfelünknél, az üzemeltetés sikeresen elkonfigurálta egy szerver idő és időzóna beállításait, így elég "érdekes" adatokat rögzített az alkalmazásunk.

Szeretnénk elébe menni az ilyen dolgoknak, így az elképzelés szerint egy @ApplicationScoped-os @Schedule eljárással percenként lekérnénk a pontos időt egy NTP szervertől, illetve az alkalmazásunkat futtató szerver időzóna beállítását. Ezt eltárolnánk, majd ahol kritikus az idő, ott ezen adatok alapján megnéznénk hogy a pontos idő és az időzóna rendben van-e. Azért percenként scannelnénk és az itt kapott adatokból dolgoznánk, mert elég sok helyen kell figyelni, hogy az idő renden van-e, és nem szeretnénk másodpercenként x alkalommal az NTP szervertől kérdezni.

A lényeg, hogy elkezdtük fejleszteni, tesztelni a dolgot és ha átállítjuk a rendszeridőt a GlassFish alatt a @Schedule dolgaink úgy leállnak, hogy csak na.

Az időzóna lekérése (ZoneId.systemDefault()) meg mintha a jvm az indulásakor lekérné a rendszer időzónáját és mindig ezt az értéket adná vissza.

Ezt leteszteltem egy kis konzolos appal. Mindig a jvm indulásakor érvényben lévő időzónát adja vissza. Viszont az időt azt jól adja vissza ez a konzolos app. Ha változik alatta az idő akkor már az újat adja vissza.

Gyanítom ez a GF-nél is így lenne csak ott maga az ejb timer service hasal el ha megváltozik a rendszeridő, így esélye sincs lekérni a rendszeridőt.

Szóval 2 dolgot szeretnék megoldani:

1. ne szálljon el az ejb timer service ha megváltozik a rendszeridő

2. szükség lenne a lekérdezés pillanatában beállított rendszer időzónára és nem arra ami a jvm indulásakor volt.