- Luck Dragon: Asszociációs játék. :)
- Steven: Sokat utazó kávéfüggők ide!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- eBay-es kütyük kis pénzért
- sziku69: Fűzzük össze a szavakat :)
- droidic: EA GAMES – élő emberrel a supportban 2025 ben
- Magga: PLEX: multimédia az egész lakásban
- btz: Internet fejlesztés országosan!
- M0ng00se: Hardvert áruhitelre?
- sziku69: Szólánc.
Új hozzászólás Aktív témák
-
floatr
veterán
válasz
filomena98 #10898 üzenetére
Már nem azért, de ha van egy java IDE kéznél, ez 5 perc alatt kideríthető.
-
fatal`
titán
válasz
filomena98 #10898 üzenetére
A kódrészleteket illeszd be kódként, mert ebből nem lehet kibogarászni rendesen, hogy mi van.
-
filomena98
friss újonc
Kedves Mindenki!
Van itt valaki, aki tudna segíteni kiválasztani a helyes válaszokat? Már napok óta rágódom rajtuk, de eddig csak arra jutottam, hogy már nem vagyok biztos semmiben.1. Melyik a helyes allitas?
class MyClass{
static MyClass ref;
String[] arguments;
public static void main(String[] args){
ref = new MyClass;
ref.func(args);
}
public void func(String[] args){
ref.arguments = args;
}
}
A-nem kompilalhato, mert a statikus main metodus nem hivhat nem statikus matodust, mint a func
B-a program kompilalhato, es hiba nelkul mukodik
C-kompilalhato, de inditas utan hibat dob ki(exception)
D-nem kompilalhato, mert az args parametert a statikus main metodbol, nem lehet tovabbitani nem statikus metodusnak, mint a func
2.
Van egy osztalyunk aminek Book a neve.Az alabbiak kozul melyik a helyesen deklarant konstruktor?
A- public static void Book(String[] args){}
B-Book Book(){}
C-void Book(){}
D-egyik sem
3.
Melyik konstruktor helyezheto a 11. sorba, hogy ne legyen gond a kompilacional?
Class MySuper{
int number;
MySuper(int i){ number = i;}
}
class MySub extends MySuper{
int count;
MySub(int count,int num){
super(num);
this.count=count;
}
//ide kell kivalasztani a megfelelo konstruktort
}
A-MySub(int count){this(count, count);}
B-MySub(int count){super(count); this(count,0);}
C-MySub(int count){this.count=count; super(count);}
4.Melyik parameter deklaraciot lehet hasznalni a masodik sorban?
public class Testing{
//itt
public long getNum(String name){
Long number = accounts.get(name);
return number == null ? 0 : number;
}
public void setNum(String name, long number){
accounts.put(name,number);
}
}
A- private Map<String,Long> accounts = new HashMap<String,Long>();
B-private Map<String<Long>> accounts = new HashMap<String<Long>>();
C-private Map<String, long> accounts = new HashMap<String,long>();
D-private Map accounts = new HashMap();
E-private Map<String,Long> accounts = new Map<String,Long>();
5. Melyikallitas helyes?
class Fruit{}
class Apple extends Fruit{}
public class TestApp{
public static void main(String[] args){
List<? extends Apple> lst1 = new ArrayList<Fruit>();
List<? extends Fruit>lst2 =new ArrayList<Apple>();
List<? super Apple> lst3 = new ArrayList<Fruit>();
List? super Fruit> lst4 = new ArrayList<Apple>();
List<?> lst5 = lst1;
List<?> lst6=lst3;
List lst7 = lst6;
List<?> lst8 = lst7;
}
}
A- a 9. sor kompilalhato, a 10. nem
B- a 7. sor kompilalhato, a 8. nem
C- egyik valasz sem helyes
D- 5. sor kompilalhato, a 6. nem
E-a 11. sor kompilalhato, a 12 . nem
6. Hol van a hiba a kodban?
public class MyClass{
public static void main(String[] args) throws A{
try{
f();
}finally{
System.out.println("Done.");
}catch(A e){
throw e;
}
}
public static void f() throws B{
throw new B();
}
}
class A extends Throwable{}
class B extends A{}
A-a mainbe throw A helyett throw B kell
B-mainben a finally blocknak a catch block utan kell kovetkeznie
C-try block utan nem lehet egyszerre finally es catch block is
D-a main metodban, a catch blokban, A e helyett B e kellene
E-az A osztaly deklaracioja nem helyes
7. Mit ir ki a program inditas utan?
public class MyClass{
public static void main(String[] args) throws InterruptedException{
try{
f();
System.out.println("1");
}finally{
System.out.println("2");
}
System.out.println("3");
}
static void f() throws InterruptedException{
throw new InterruptedException("Time to go home.");
}
}
A- 2 es 3
B- 1 es 2
C- 2 es InterruptedExceptiont jelez
D-1, 2 es 3
E-3 es 2
F-1 es 3
8.Mi lesz az eredmeny futtatas utan?
public class MyClass{
public static void main(String[] args){
C c = new C();
System.out.println(c.max(13,20));
}
}
class A{
int max( int x, int y){ if( x>y) return x; else return y;
}
class B extends A{
int max(int x,int y){ return super.max(y,x)-10;}
}
class C extends B {
int max (int x, int y) { return super.max(x+10, y+10);}
}
A-a kod nem kompilalhato, mert nem egyertelmu a max() metodus hivasa
B- a kod kompilalhato, inditas utan 23-at ir ki
C-nem kompilalhato, mert a max () metodus a B osztalybanrossz sorrendben kuldi az argumenteket
D-kompilalhato,13-et ir ki
E-kompilalhato 29-et ir ki
F-kompilalhato, 39-et ir ki -
válasz
walgud6 #10893 üzenetére
- Nem olyan nehéz a gép, a 15-ös (most már 16-os) modell is teljesen vállalható
- Plusz gari szerintem mindenképpen megéri, azért többet kibírnak mint két év
- Akksi jól bírja, ha dolgozom rajta 4 - 5 óra, sima "office" használat van 8 is
- Java fejlesztésre használom én is13-as és 15, 16-os modell is vállalható szerintem. Ez egyéni preferenciának gondolom, ha sokat használod monitorról akkor a 13 is bőven elég lehet. Memóriából minél több, annál jobb! 16 legalább.
Nekem egy IDEA + Docker (általában 3 image, SonarQube, MongoDB és RabbitMQ) szokott enni olyan 4 - 5 giga körül. Én az i7-et annyira nem tartom fontosnak, mióta van 8. generációs i5 ami 4 mag + 4 szál.
Air szerintem kevés, Pro mindenképpen.
-
disy68
aktív tag
válasz
walgud6 #10893 üzenetére
Én a részemről 13"-on megőrülnék, az szerintem nagyon kicsi. A többi kb. attól függ mit fejlesztesz, mekkora az alkalmazás és a kódbázis. Valamint lokál környezetben mennyi adattal szaladgál az alkalmazás.
A kód az mindenképpen ssd-n férjen el, hogy az ide tudja a fájlokat gyorsan indexelni, én ajánlanám a 256GB-ost. Proci az a build-nél fontos, core i7 alá nem mennék. Egy giga monolith-nél persze sose lesz túl gyors a build, de nem mindegy, hogy 15 perc vagy 45 perc. A memória is attól függ kategória, 1-2 kis microservice-nek elég lehet 8 giga ide-vel egyebekkel, de én is inkább a 16-ot lőném be iránynak.
Amúgy meg ha munkaeszköz, akkor vedd meg a legjobbat a büdzséd szerint. Meg ha nem akkor is
-
walgud6
tag
Konkrétan az érdekelne, hogy melyik típusra érdemes beruházni.
Néhány szempont:
- könnyű hordozhatóság, mert sokat ingázok
- Ne csak 1-2 évig legyen elegendő az erőforrás fejlesztésre
- hosszú üzemidő (eddigi ismereteim alapján, ez nem probléma egyik modellnél sem)
- Java fejlesztésre használnám leginkább, talán local db is futna rajta
A hordozhatóság szempontjából a 13"-os modellek a nyerők, viszont itt meg is állt a tudományom. Kicsit utánaolvasva a témának, annyi lejött, hogy azért kisebb erőforrásal is hoznak olyan szintet, mint nagyobb erőforrású win-es gépek. Az viszont nem tudom, hogy Air vagy Pro, mennyi RAM-al, SSD-ből gondolom a 128-as is elég (külső HDD orvosolja a helyhiányt). Windows-os üzleti gépekkel van tapasztalatom eddig, ott a 16GB RAM szerintem elvárt, local db+ IDE + böngésző néhány tabbal + DB nézegető + egyéb apróságok.
Szóval összefoglalva, szükséges a Pro vagy az Air is elegendő, kell a 16 GB RAM vagy 8-al is vígan el lehet lenni?
Köszi a válaszokat! -
walgud6
tag
Közületek használ valaki Macbook-ot fejlesztéshez? Lenne pár kérdésem, akár privátban is.
-
Drizzt
nagyúr
válasz
fatal` #10881 üzenetére
"Az == a referenciát ellenőrzi, az pedig sosem lesz ugyanaz." Ez így nem teljesen igaz. Pl. ha ugyanarra a String literalra hivatkozol, akkor a referncia is ugyanaz lesz, mert a fordító észreveszi, hogy több referencia van ugyanarra a stringre már fordítási időben, így nem fogja kétszer ugyanazt a konstants elrakni a memória megfelelő szegmensébe.
-
Csaby25
őstag
Sziasztok!
Ha kiíratom az xoTransferObj.getXoInput()-ot, az értéke X és mégsem megy bele az if-be..
Viszont ha egy sima változót ellenőrzök az if-ben aminek az értéke X, akkor belemegy
if (xoTransferObj.getXoInput() == "X") {
.......
}
Hol itt a gond?public String getXoInput() {
return xoInput;
}
public void setXoInput(String xoInput) {
this.xoInput = xoInput;
} -
A clean code teljes félremagyarázása
(főleg Python huszároktól hallotam ezt idági), hogy ha van comment az nem clean code és nem jó...Szerintem kell komment, de ha sikerül olyan függvényeket írnod, ami valóban 5-6 sor akkor adott esetbel lehet, hogy felesleges a komment, mert azonnal látszik, hogy mit csinálsz (pl. elwrappelsz egy lambdát mert még 6 helyen használod).
-
xuldar
addikt
Sürgősen szükségem lenne valakire, aki ért a Javahoz és JavaFX-hez. Részletek PM-ben.
-
Szmeby
tag
válasz
ReSeTer #10871 üzenetére
Néhány egyszerű példa:
String[] valami = { "ez", "az", "amaz" };
System.out.println(valami[0]); // ez
String az = valami[1]; // az
System.out.println(valami[2]); // amaz
Egy lépésben építettem egy 3 fiókos szekrényt és mindegyik fiókba tettem 1-1 szót. Ezekre a fiókokra a szögletes zárójelben lévő számmal tudok hivatkozni és tudom felhasználni a bennük tárolt szavakat, például értékül adhatom egy másik változónak, vagy kiírhatom konzolra, stbstb. Vedd észre, hogy nullától számozódik. Próbáld ki más számokkal is.String[] masValami = new String[4];
masValami[0] = "ez";
masValami[1] = "az";
masValami[2] = null;
Itt az első lépésben csak létrehoztam egy 4 fiókos szekrényt, de üresen. Ezt követően tettem valamit az első (0) és második (1) fiókjába. A harmadik fiókba (2) explicite null-t tettem, a negyedik fiókhoz (3) nem nyúltam, de annak az értéke is null. Egy üres fiókban null van.String[] megintMas;
megintMas = new String[]{ "ezt", "csak", "ilyen", "terjengősen", "lehet" };
megintMas[1] = "CSAK";
Itt először csak jelzem, hogy lesz egy fiókos szekrényem, de nem tudom, mekkora. A második sorban jönnek létre a fiókok (5 db), amiket fel is töltök. Az utolsó sorban pedig a második fiókban (1) lévő szöveget lecserélem arra, hogy "CSAK".
Játsz vele, kombináld, nézd meg, hogy mi működik és mi nem. Sok sikert.Ja igen, nem csak Stringgel működik, hanem más típusokkal is:
int[] szamok = { 4, 2, 3, 9 };
szamok[0] = 8;
int ketto = szamok[1];
-
Drizzt
nagyúr
válasz
ReSeTer #10871 üzenetére
[]: tömb. {ertek1, ertek2, ...}: tömb elemeket leíró literál. A lényeg, hogy több értéket felsorolhatnál, ami String és a tömbben akarod eltárolni.
Az említett könyvet nem ismerem. Totál alap Java könyvet nem is tudnék ajánlani. Inkább Java alap videokat néznék. Pl. totál kezdő szinten van a Udemy-n a Java masterclass. Az talán már 100 óránál is hosszabb, nagyon sok dologra kitér, teljesen az alapoktól kezdve. Bár angol és fizetős.
-
Szmeby
tag
válasz
ReSeTer #10871 üzenetére
Jól gondolod, ez a helyes szintaxis. A
String[] valami = {"ez", "az", "amaz"};
neve az, hogy tömb, vagy ahogy a művelt francia mondaná: array. Olvass utána, igazán változatos egy jószág.Ha a
String változónév
a cipősdoboz, amibe tehetsz egy valamit, akkor aString[] változónév
lehetne a fiókos szekrény valahány meghatározott számú fiókkal és mindegyik fiókba tehetsz egy valamit.A te konkrét példádban ez egy 1 db fiókkal rendelkező szekrény, aminek a fiókjában pihen az "értékebetűkkel" String, de attól még nem cipősdoboz.
-
ReSeTer
senior tag
Helló!
Elkezdtem az Agyhullám java könyvet. Egy kérdés: Van ennél részletesebben elmagyarázó könyv?
Ennél a feladatnál elakadtam. Nem értem, miért kell hirtelen
String változónév = "értékebetűkkel"
helyettString[] változónév = {"értékebetűkkel"}
?Mit jelent a []? Miért kell kapcsos zárójel amikor megadjuk az értékét? (bár tippem az, hogy a felsorolás miatt)
Nem igaz, hogy nem találok normálisan elmagyarázó könyvet..... -
Szmeby
tag
Azt hittem, már valami alter irányzat kezdett kibontakozni clean code-nak csúfolva magát.
Valószínűleg az én angol tudásom kopott meg, de ebben sem látom a tiltást. Persze kiemelhetném a "not to write" kifejezést az egészből, és ignorálhatnám az ezt körbevevő bekezdések tartalmát, de miért is tennék ilyet!Szerintem érdemes elolvasni a teljes fejezetet, ha még nem tetted meg. Különösen azokat a részeket, ahol azt ecseteli például, hogy totálisan felesleges leírni a kód mellé/alá/fölé, hogy mit csinál, mert az olvasó ezt amúgy is látja, viszont például azon ritka esetekben, amikor a miért kérdésre adandó választ kívánja megörökíteni a fejlesztő, a mögöttes szándékot, amit semmilyen más nyelvi eszközzel nem lehetne egyszerűen megmutatni, akkor érdemes ezt megtenni, hogy megkönnyítsük az olvasó dolgát. Persze a gányolást is lehet kommentben magyarázgatni, de a könyv többi része azt szajkózza, hogy ne gányolj, szóval...
Az általad idézett "not to write" arról beszél, hogy ha szépen írod meg a kódot, akkor a kommentek elhelyezése is szükségtelenné fog válni, mivel feltételezzük, az olvasó tud alapszinten jávául és minden szükséges információt megkap a konstansok, változók, metódusok és osztályok elnevezéseiből, struktúrájából.Semmi sem fekete vagy fehér, így tudathasadásról sem lehet beszélni, hiszen értjük az ajánlás mögötti szándékot és aszerint cselekszünk. A clean code szerintem meg amúgy sem szabály, hanem ajánlás.
A public api javadoc meg más tészta, az a feladata, hogy röviden összefoglalja a mögöttes funkció lényegét és tájékoztasson a használat módjáról, megspórolva az olvasónak a forráskód böngészését... de erről a többiek is sokat írtak.
-
Lortech
addikt
Ja. Ne keverjük már a kommentet egy javadoc (API) leírással. API leírás kell, ha például 3rd party használja az API-dat, aki nem tudja/akarja elolvasni a forrásodat, hogy megismerje a belső működését.
Olyan komment nem kell, ami a kódot szemeteli tele. Normális esetben a clean code egyúttal jól strukturált és jól olvasható kód is, tehát könnyű megérteni, így nem kell lépten nyomon teletűzdelni olyan kommentekkel, hogy "ez azért van, mert..", vagy "ezt ne változtasd meg mégha nagyon fura is, mert behány tőle a rendszer stb". Ugyanakkor ilyen kód nem létezik, és sokszor jól jön egy-egy magyarázó sor. -
Drizzt
nagyúr
"Some comments are necessary or beneficial. We’ll look at a few that I consider worthy of the bits they consume." Tehát kommentet írni bizonyos esetekben és és jogos. Javadoc meg akkor igazán fontos, hogyha egy library API-ját írja le. Mivel akkor az konkrétan inkább dokumentáció, mint komment.
-
p76
senior tag
-
axioma
veterán
Engem az zavar amikor a clean code-nak a keplettel ellenorizheto reszet eroltetik, a lenyeget meg siman felrugjak egy unit test kedveert. Kaptam olyan review comment-et hogy a comment-ben (ok kertek hogy legyen leiras hogy miert ugy) a folyo angol szovegben egy zarojel elott nem volt szokoz, potoljam... [osszevontam ket sort es ugy maradt].
En ugy gondolom, hogy a clean code a biorobot kodiroknal muszaj, akik raadasul surun cserelodhetnek, es ezt aztan mint szabvanyt probaltak elterjeszteni hogy a manager egyenletesebb (nem jobb, nem gyorsabb, hanem kiszamithatobb!) haladassal tudjon szamolni.
Nyilvan a clean code masreszt nem mas, mint egy best practice gyujtemeny, iranymutato. Aki gyakorlott, az nem mint clean code csinalja, hanem mint egyszeruen adodo helyes megoldas. [Kedvenc peldam erre, hogy mennyit kuzdenek a tanarok mikor az adatbaziselmeletben keresnek olyan eseteket ami x NF de nem (x+1)NF. Mert termeszetes uton senki nem ugy allitja ossze, ha mar addig eljut hogy atgondolja, hogy ez egy karbantarthato sema legyen. Tok hasonloan a kozosbe irt kod is. Szerintem.] -
Drizzt
nagyúr
És? Aki a Java9-es könyvet írta amit olvasol, azt mondta, hogy clean code enthusiast? Vagy honnan jön a tudathasadás feltételezés? Van aki követi, van aki nem. Nem szeretem a kommenteket, de néha van haszna. Főleg ha valamit úgy írsz meg, hogy elüt a best practice-ről, de van valamilyen jól megfogható oka, hogy miért van mégis úgy. Én nagyjából követem az elveket, bár a refactoring könyveket sokkal jobban és hasznosabbnak tartom.
-
p76
senior tag
-
Zsoxx
senior tag
Hali
Hogyan nézne ki ez a kód, ha nem lambda expressionnal írnám? (JavaFX)
Nem igazán értem, hogy mit csinál, talán a régebbi módon írva érthetőbb lenne.private List<Sprite> sprites() {
return root.getChildren().stream().map(Node n -> (Sprite) n)
.collect(Collectors.toList());
}
-
bucsupeti
senior tag
A static metódus arra enged következtetni hogy valószínű ugyan abban az osztályban van ez a kaloriaKiir metódus amiben a main() és azért static hogy tudd meghívni a main-ben.
Lehet hogy a vizsgára amire készülsz ez jó és elegendő. Én a következő osztályokkal dolgoznék:
Gyumolcs : egyetlen gyümölcs adatait tároló POJO osztály. semmi extra metódus nem kell ebbe. Max a toString-et írd felül hogy az objektum értékeit adja vissza.
KaloriaTabla : lenne benne egy ArrayList<Gyumolcs> lista, egy adatbeolvasó metódus ami feltöltené ezt a listát. Konstruktorba feltölteném a listát. Kell egy kereső metódus ami egy string alapján keres a listában a gyümölcs neve alapján és Gyumolcs-öt adnék vissza, vagy null-t ha nincs. (Ez az osztály lehetne akár singleton is, ha már tanultátok)
A futtató osztályban (amiben a main() van), megírnám a felhasználói felületet, menüt, a névbekérést stb. Itt példányosítanám a KaloriaTabla-t és ennek a kereső metódusát hívogatnám.
Igaza van Sirpi kollégának abban hogy a contains használata nem a legjobb megoldás. Ha contains-t használsz akkor kezeld úgy hogy nem csak egy hanem több gyümölcsöt is kaphatsz eredményül, és ilyenkor minden találatot jeleníts meg. -
Sirpi
senior tag
Miután elküldtem, rájöttem, hogy az ertekek.contains(nev) nem lesz jó, mert egy List<Gyumolcs> sosem tartalmazhat String-et, de ettől még áll, amit írtam, hogy a toString()-ezés nem a jó irány. Például:
private static boolean isNameValid(List<Gyumolcs> ertekek, String nev) {
for (Gyumolcs gyum : ertekek) {
if (gyum.getName().equals(nev)) {
return true;
}
}
return false;
}És akkor ezt a metódust lehet hívni a while ciklusból. A gyum.Megnevezes-t pedig engedelmeddel getter-re cseréltem, nem használunk field-et közvetlenül (és nem is kezdjük a nevét nagybetűvel).
-
Sirpi
senior tag
Ez a rész háromszor is szerepel: gyum.toString().contains(nev)
Egyrészt a harmadik automatikusan teljesülni fog, elhagyható, egyetlen vizsgálat is elég. Másrészt gondolom az elso gyum helyett az ertekek változót akartad használni, így az értékek.contains(nev) pont az, amire szükséged van, sőt, a toString-ezés miatt ha akár egyetlen betűt írsz be, ami a felsorolt gyümölcsök valamelyikében szerepel, azt is el fogja fogadni, nem néz teljes egyezést. Kicsit egyszerűsítve:
public static void kaloriaKiir(List<Gyumolcs> ertekek) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev;
while (!ertekek.contains(nev = scan.nextLine())) {
System.out.println("Nem megfelelő név, újat kérek!");
}
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
} -
kutga
félisten
válasz
Drizzt #10851 üzenetére
Do-while-lal oldottam meg végül, köszi.
public static void kaloriaKiir(ArrayList<Gyumolcs> ertekek, File f) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev = scan.nextLine();
do {
if (!gyum.toString().contains(nev)) {
System.out.println("Nem megfelelő név, újat kérek!");
nev = scan.nextLine();
}
} while (!gyum.toString().contains(nev));
if (gyum.toString().contains(nev)) {
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
}
}Biztos sok sok furcsaság van a kódban, de most a cél átmenni a vizsgán.
-
Drizzt
nagyúr
Bulizhatz rekurzioval: az utolso else agban meghivhatod a kaloriaKiirt megegyszer.
Bulizhatsz do-while ciklussal: do... while (beolvasott szo nem gyumolcs).Amugy van sok furcsasag a kododban. Lehet csak a tableten nem latom, de mi szukseged van a File f parameterre? Mi a gyum, honnan jon az extended for loop elott. Van egy static String gyumod az osztalyban valamilyen ertekkel?
-
kutga
félisten
Hölgyek/Urak!
Programozás vizsgára készülök, az egyik feladatnál megakadtam.
Csv file-ból kellett adatokat beolvasni ArrayListbe, aztán mindenféle metódusokat gyártani rá. A csv file-ban gyümölcsök nevei (pl. alma, körte, stb) és hozzájuk tartozó adatok vannak, többek között a kalória.
A feladat az, hogy a metódus kérje be a felhasználótól a gyümölcs nevét és a mennyiséget, és ez alapján mondja meg, hogy az adott mennyiségű gyümölcs hány kalóriát tartalmaz.
Megcsináltam a metódust, azt szeretném elérni, hogy ha a felhasználó rossz nevet ír be (ami nem szerepel az ArrayListben), akkor addig kérje, amíg jót nem ad (jelen állás szerint ha rossz nevet ír be a felhasználó, leáll a program).
Itt a kód:
public static void kaloriaKiir(ArrayList<Gyumolcs> ertekek, File f) {
Scanner scan = new Scanner(System.in, "ISO-8859-2");
System.out.println("Kérem a gyümölcs nevét: ");
String nev = scan.nextLine();
if (gyum.toString().contains(nev)) {
System.out.println("Kérem a mennyiséget grammban: ");
int menny = scan.nextInt();
for (Gyumolcs gyum : ertekek) {
if (nev.equals(gyum.Megnevezes)) {
System.out.println(menny + " gramm " + gyum.Megnevezes + " " + gyum.kcal / 100 * menny + " gramm kalóriát tartalmaz.");
}
}
} else {
System.out.println("Nem megfelelő név!");
}
}
Van valami ötletetek?
-
Drizzt
nagyúr
Ez szerintem egy elég nehezen érthető része a javanak. De a lényeg. Van a Komparator osztályod. Ezen az osztályon belül van egy inner classod, a KutyaRend. Ilyenkor a kutyarend osztály mivel nem static, ezért a példánya csak egy adott objektumpéldányon belül hozható létre. A static method nem példányhoz, hanem osztályhoz tartozik, így annak nincsen példánya, tehát nincsen benne KutyaRend létrehozási lehetőség sem. Legkönnyebben ezt itt úgy tudod megoldani, ha a Kutyarend osztályt statická teszed:
static class Kutyarend ...De ettől sokkal szebb, ha nem ágyazod be az osztályba semmilyen módon, hanem külön osztályba teszed. Sőt, ha ez a kutyák természetes rendezése, akkor elég a Kutyákat implements Comaparble<Kutyák> módon megadni, s akkor benne a compareTo-t implementálni.
Még egyszerűbb, ha használod a Java 8-as Comparators.comparing-et, így:
Collections.sort(KutyaLista, Comparators.comparing(Kutyak::getKor));
-
venic
kezdő
Sziasztok!
Írtam egy hosszabb kódot, amiben az Arraylist rendezése nem működik.
Csak ezt a részt kivettem, hogy egy egyszerű példán oldjam előbb meg, de ugyanúgy nem jó.
Tudtok segíteni, hogy mi a baj vele? Miért nem jó?
A Collection.sort... kezdetű sornál jelez hibát.
Ezt irja ki: non-static variable dis cannot be referenced from static context
Köszönöm a segítséget.public class Komparator {
class KutyaRend implements Comparator<Kutyak> {
@Override
public int compare(Kutyak o1, Kutyak o2) {
return o1.getKor()-o2.getKor();
}
}
public static void main(String[] args) {
Kutyak kutya;
ArrayList<Kutyak> KutyaLista=new ArrayList<>();
kutya=new Kutyak("Stefi", 6);
KutyaLista.add(kutya);
KutyaLista.add(new Kutyak("Lacy", 2));
KutyaLista.add(new Kutyak("Roger", 3));
KutyaLista.add(new Kutyak("Tomi", 4));
Collections.sort(KutyaLista, new KutyaRend()); -
Zsoxx
senior tag
válasz
Csaby25 #10837 üzenetére
JDK 11 óta nincs benne a JavaFX.
https://youtu.be/nbn_tjHBRV8 -
Csaby25
őstag
válasz
Csaby25 #10836 üzenetére
Innen kell letölteni? [link]
Ebben nincs jfxrt.jar fájl, tudtommal ez kell és a jfxswt.jar
Ha nem adom meg a jfxrt.jar-t nem is tudja importálni a javafx-et.
Telepítettem a JavaFX Scene Builder 2.0-t, ebben van jfxrt.jar. Megadtam neki, így már importálja, kiterjesztem a Application osztályt, futáskor hibát ad:
"Error: Could not find or load main class TestFX
Caused by: java.lang.NoClassDefFoundError: javafx/application/Application"Nem tudtam megnyitni az Application.class forrástfájlt, nem találta. Megadtam neki az src.zip forrást ami a javafx-sdk-13.0.1-ban található, amit innen szedtem le: https://openjfx.io/
Most mar megnyitja forrástfájlt, de ugyanez a hiba maradt. Valami ötlet? Mindez Eclipse 2019-12-ben.... -
Csaby25
őstag
Sziasztok! JavaFX működik az újabb JDK-val, pl. 13-al? Honnan kell leszedni és hogy kell beállítani, próbáltam már Eclipse plugint ill. manuálisan megadni a JAR-okat, NetBeans-ben is, de nem működik. Köszi!
-
Drizzt
nagyúr
válasz
bambano #10830 üzenetére
Muhahaha.
Remekül szórakoztatod az embert a nagyon furcsa feltételezéseiddel, de közben szerencsére jó dolgokat is mondasz.Arról sehol nem volt eddig szó, hogy mekkora méretű lenne az adat. Én eddig mindvégig azt feltételeztem, hogy kicsi.
"select meg watch service meg toronyóra lánccal... az eredeti kérdés szerint linuxon futna, ami egy unix. nem bohóckodunk ilyenekkel." És a select melyik oprendszer egyik fontos syscallja?
A tee-t tök jó, hogy felhoztad, mert magamtól nem jutott volna eszembe a neve, remélem most jobban elmélyül a tudatomban.
A syslogos megoldás az amúgy tetszik, bennem is bennem volt."tail -f /tmp/dumpfile | java -jar tefeldolgozod.jar
második esetben esetleg van értelme jávás watch objektumozni..."
De ilyenkor egy sima Scanner.nextLine is elég. Az vár az új inputig, vagy amíg a stdin-je el nem tűnik."miért érzem azt, hogy azért jobb a jáva szerinted, mert a shell programozásról fogalmad sincs?"
Én ilyet sehol nem írtam. Különböző célokra különböző eszközök a jók. Hirtelen meg az ember mindig úgyis azt a megoldást fogja ajánlgatni, amivel éppen a legjobban képben van. Ha nagyon akarnék, akkor én is elkezdhetnék kötekedni, hogy miért mysql-ben akarod a szenzor adatokat eltárolni, amikor vannak más kifejezetten ilyen célú adatbázisok is. De nem teszem, mert valószínűleg a probléma olyan kis méretű, hogy igazából nem számít.Ui. a mysql klienst úgy kezeled itt mindenhol, mintha minden linuxon kötelezően rajta lenne, de az ugyanúgy egy dependencia, ami vagy van, vagy nincs.
"most eltekintve attól, hogy tök értelmetlen http-n csinálni ilyet, a curl-ben túl sok hiba van ahhoz, hogy komoly rendszeren használd."
Ezt btw. még kifejthetnéd, hogy mire gondolsz. Milyen hiba? (És természetesen a curl sem feltétlen minden disztró része) -
floatr
veterán
válasz
bambano #10819 üzenetére
Az eddigi hozzáállásod alapján inkább lehetne rólad elmondani, hogy szereted a scriptelést, és bármire azt használnál. Amíg 2 sorról van szó, még hagyján, bár ha abba kell beletúrni valamiért, továbbra is tartom, hogy kevés ember lesz, aki tartani meri érte a hátát. Nem egy 12-factor konform cucc, de mókolni jó.
Az üzemeltetéssel és karbantartással kapcsolatban éppen a scriptekkel van baromira rossz tapasztalatom többek között a minőségbiztosítás teljes hiánya miatt, és hogy az általad említett sok száz komponens nagyon nem mentes a hibáktól. Nem baj kavarjuk össze lecsóba, mi bajunk lehet.Azt nem vágom, hogy pont ezeknek a szenzoros dolgoknak a kezelése eléggé ingoványos terep, de te nyugodt szívvel rábíznád egy pipe-olt scriptre a dolgot, miközben szinte mindenki kivétel nélkül baromira óvatos a témával. Amíg otthon barkácsol az ember egy arduinoval két hőmérő meg három nedvességérzékelő adataival, addig még hagyján, csak akkor tartsa is otthon a "tudást".
Az meg eleve nagyon gáz, hogy "debuggolni" úgy akarsz, hogy módosítod a kódodat. Agyrém...
-
bambano
titán
válasz
Drizzt #10828 üzenetére
jaja, így csinálják a windowsról átszökött, unixot messziről ugató fotelprogramozók
nem, nem mindegy, hogy fájlba írod-e, tehát átkergeted kétszer a fájlrendszeren és a blokkos eszközökön a cuccot, vagy memória puffereken keresztül tolod be. nem pazaroljuk az erőforrásokat. különös tekintettel az iot nevű betegségre, ahol flash drájvokat nyírhatsz ki azzal, ha fájlba írsz, mivel a ramdiszk jellemzően kevés.
select meg watch service meg toronyóra lánccal... az eredeti kérdés szerint linuxon futna, ami egy unix. nem bohóckodunk ilyenekkel.
ha az a probléma, hogy debuggolni akarod a fájlt, akkor van rá segédporgram. tee. tehát azt írod, hogy:
sensorread | tee /tmp/logfile1 | sed | tee /tmp/logfile2 | mysql
ha nem akarod azt a hatalmas nagy sedet folyton forkolni, és mindenáron bele akarsz piszkolni a fájlrendszerbe, akkor egyik taszkban:
sensorread >>/tmp/dumpfile &
másik taszkban:
tail -f /tmp/dumpfile | sed | mysql
vagy
tail -f /tmp/dumpfile | java -jar tefeldolgozod.jarmásodik esetben esetleg van értelme jávás watch objektumozni...
de ha már ennyire elb.szarintod az architektúrát, akkor a legegyszerűbb az, ha a szenzorok adatait logoltatod a syslogba, és abból azon a gépen ott és akkor azt csinálsz, amit akarsz.
miért érzem azt, hogy azért jobb a jáva szerinted, mert a shell programozásról fogalmad sincs?
-
Drizzt
nagyúr
válasz
bambano #10823 üzenetére
"ezért amikor elhangzott itt (nem Peachmantől), hogy a szenzor program tegye le diszkre egy fájlban az adatot és azt olvassa be jávából LINUXON, akkor azt gondoltam, hogy ezzel totálisan szívenszúrja a unixos alapfilozófiát. kevésbé udvarias megfogalmazásban ekkora f.ságot évek óta nem hallottam."
Én írtam, s egyáltalán nem értek veled egyet. Majdnem mindegy, hogy először fájlba írsz valamit és onnan pollozod, vagy közvetlenül a pipe-pal küldöd át. Utóbbi esetben ráadásul újra, meg újra meg kell hívni a feldolgozó programot, ami nem feltétlen hatékony. Fájl változásra linux alatt selecttel fel tudsz iratkozni, Javaban is megvannak a megfelelő képződmények(Watch service). Egyébként named pipe-pal lehet a legjobban áthidalni, hogy a feldolgozó mindig futhasson attól függetlenül, hogy mikor kap inputot. De én fájlba írnám inkább, mert sokkal könnyebb lesz hibát izolálni annak előfordulásakor, ha a fájlra nézve meg tudod azonnal mondani, hogy mikor frissült, meg mi van benne, anélkül hogy a két alkalmazás belében kellene turkálni.
-
bambano
titán
"nem tudom elképzelni mondjuk, hogy egy szerver alkalmazás szét legyen dobva 10 futtatható binárisra és egymást hívogatják": oké, legyen egy egyszerű példa: biztonsági mentés.
tegyük fel, hogy a következő lépéseket akarod végrehajtani a mentéshez:
1. mentendő fájlok listájának előállítása
2. mentendő fájlok összecsomagolása egy konténerformátumba
3. konténer tömörítése
4. konténer lemezre írása.windowson erre van egy backup utility, monolitikus, felparaméterezed, fut. unixon mindegyik feladatra van egy program, és a programokat össze tudod kötni a shellel.
1. find
2. cpio
3. bzip
4. ddtehát azt mondod, hogy (a kapcsolók nem biztos, hogy jók):
find -atime 5 / | cpio -o | bzip2 -9 | dd of=/dev/rmt/0 obs=2k
A find összeszedi neked az összes fájlt, amit kevesebb, mint 5 napja néztél meg és a fájllistát kiírja a szabvány kimenetére. A find szabvány kimenetét a shell összeköti a cpio szabvány bemenetével (valójában úgy mókol a fájldeszkriptorokkal, hogy a find kimeneti puffere a cpio bemeneti puffere lesz, tehát nem a shell másolgat soronként, hanem ez kernelszintű szolgáltatás). A cpio a szabvány bemenetéről beolvassa azon fájlok nevét, amit az archívumba bele kell tennie és az archívumot kiírja a szabvány kimenetére. Ami átkerül a tömörítő bemenetére, tömöríti és kiírja a saját kimenetére. Amit megkap a dd, összeblokkosítja olyan méretre, ami a szalagegységnek optimális, majd kiírja szalagra.
Minden darab külön van, minden darabot cserélhetsz is, ha akarsz. Minden darab egy konkrét feladatot végez el. Gyakorlatilag kapsz egy kosár téglát és ebből neked kell házat építeni. Ez az erőssége és a gyengesége is egyben. Ha tudsz kosár téglát egymásra rakni, jó rendszered lesz. Ha nem, üres konzol előtt fogsz pislogni, mint kocsonyában a béka. A másik világban pont az ellentéte van, kapsz pár 14 emeletes toronyházat, amik elvileg mindent tudnak, amiről az alkotójuk azt hitte, hogy tudniuk kell. Vagy megfelel számodra, és akkor halleluja, vagy nem, akkor bukta van. Nem változtathatsz, nem babrálhatsz bele, ez van, ezt kell szeretni.
Egyébként nagyon sok ilyen szoftver van, például az adatbáziskezelőknél is gyakori, hogy van egy nagyobb program, ami a szerverfunkciókat végzi, és vannak kis, parancssori utilityk, amikkel aktiválsz bizonyos funkciókat vagy beállításokat. ezekből rakod össze a megoldásodat.
-
válasz
bambano #10823 üzenetére
""Cserébe nem lesz olyan lassú.": értem, tehát a bash egy pártíz-párszáz soros szenzor kimenetnél lassú lesz?"
Ezt általánosságban értelmezd ne erre a példára levetítve.
"unixon ezzel szemben az az alapvetés, hogy kis programokat csinálsz (amikor csak lehet), azok egy dolgot csinálnak, de azt hatékonyan és jól, és rábízod az oprendszerre, hogy összekösse a programjaidat."
Ezt most vagy félreértem, vagy nem tudom elképzelni mondjuk, hogy egy szerver alkalmazás szét legyen dobva 10 futtatható binárisra és egymást hívogatják.
"Egyébként én csak húsz éve foglalkozom hasonló kérdésekkel, nyilván tapasztalatlan vagyok a témában, szemben pár fórumtárssal a fotelből..."
Senki nem mondta, hogy tapasztalatlan vagy, csak azt, hogy erre a problémára létezik kb. 100 féle jó megoldás
-
bambano
titán
"Full komolyan érdekel, mikor jó a 10k soros bash a javával szemben": akkor jó, amikor egy nagyobb rendszerben történő folyamatot akarsz automatizálni, és ehhez parancssoros segédprogramokat adnak csak. fontos, hogy automatizálni akarsz, tehát nincs képernyő, grafikus interfész, klikkelés. van viszont mondjuk 200 darab bináris programod, amivel meg tudod oldani a problémád részfeladatait.
ilyenkor a jáva program nagyjából úgy nézne ki, hogy folyton parancssori paramétereket rak össze, exec()-el, eredményt olvas, stb. ehhez felesleges jáva. pont jó a szkript.
egy csomó telepítő meg karbantartó szkriptet láttam már, amik ilyenek voltak.
-
bambano
titán
"akkor linuxon mindent írjunk szerinted bash-ben": nem.
a fő különbség a két rendszer között (unix vs. windows), hogy a unixot eredetileg kis programok hatékony összekapcsolására találták ki, a windows meg nagy monolitikus rendszerek futtatására. pl. ha windowson elindítod az outlookot, a fél office-t maga alá rántja, mert ha a levélben van excel vagy html, akkor máris behúzza az excelt meg a html motort.unixon ezzel szemben az az alapvetés, hogy kis programokat csinálsz (amikor csak lehet), azok egy dolgot csinálnak, de azt hatékonyan és jól, és rábízod az oprendszerre, hogy összekösse a programjaidat.
ezért amikor elhangzott itt (nem Peachmantől), hogy a szenzor program tegye le diszkre egy fájlban az adatot és azt olvassa be jávából LINUXON, akkor azt gondoltam, hogy ezzel totálisan szívenszúrja a unixos alapfilozófiát. kevésbé udvarias megfogalmazásban ekkora f.ságot évek óta nem hallottam.
tehát itt a unixos filozófia szerinti megoldás az, hogy van egy szenzorleolvasója, van egy átalakítója meg egy adatbáziskliense, amiket a shell összeköt:
sensorread | sed ... | mysql ...
ha ezt el akarjuk rontani az itteni kérdés szintjére, akkor is az a megoldás, hogy jávában a szabvány bemenetet olvassa és azt elemzi, és csővezetékkel kerül a bemenetre az adat:
sensorread | java -jar szenzorosztalyom.jar"Cserébe nem lesz olyan lassú.": értem, tehát a bash egy pártíz-párszáz soros szenzor kimenetnél lassú lesz? kizárt. ráadásul ugye itt nem is a bash fut sokáig, mert az csak összeköti a programokat, falusiasan fogalmazva bűvészkedik a fájldeszkriptorokkal, a sok olvasást, írást egy c-ben megírt, évtizedek alatt optimalizált kód fogja csinálni a sedben. nem lesz lassú, ne aggódj, nagyjából bármit el fog verni, mint az atom. az interpretált bájtkódodat szinte biztosan rommá fogja verni.
Egyébként én csak húsz éve foglalkozom hasonló kérdésekkel, nyilván tapasztalatlan vagyok a témában, szemben pár fórumtárssal a fotelből...
-
válasz
bambano #10814 üzenetére
"De az is látszik a párbeszédből, hogy sokan úgy programoznak linuxon, hogy fogalmuk sincs, mit jelent linuxon programozni. ha linuxon windowsosan akarsz programozni, akkor tegyél fel windowst."
Ebből nekem az jön le, hogy akkor linuxon mindent írjunk szerinted bash-ben. Én zsh-t használok és macet munkára. Ott mit kéne csinálni?
"Szerinted melyikben valószínűbb, hogy hiba lesz: egy két soros shell szkriptben vagy egy elastic-ban?"
Tudsz unit tesztelni bash-t és jávát is, a hiba valószínűsége ugyanakkora.
"És hiába fikázod a szkript nindzsákat, az objektív műszaki érvek ebben a feladatban nem a jáva mellett szólnak."
Abban igazad van, hogy talán nem a Java a legjobb megoldás erre, de szerintem még nem is a bash. Python például. Amúgy tipikus "szkript ninja" hozzáállás, hogy feszegetjük a jvm erőforrás felhasználását, ami tény, hogy több lesz mint egy szkripté. Cserébe nem lesz olyan lassú.
Egy szó mint száz, a kollégának kell tudnia, hogy miért akarja Javában írni. De szerintem ha Ő abban akarja és van alá vas akkor hajrá. Cron + CLI alkalmazás. Én viszont erre a feladatra a Python-t javaslom ha csak ennyit kell csinálni.
#10820: Full komolyan érdekel, mikor jó a 10k soros bash a javával szemben (én olyan szituációt még tényleg nem láttam. 10k soros szkriptet is csak azért mert ahhoz értett a költő)?
-
válasz
bambano #10803 üzenetére
Én dolgozam olyen helyen ahol ez volt a szokás, és kb. ott csaptam volna szét mindent szívlapáttal.
A végeredmény 10 ezer soros bash scriptek (vegyítve gawk-val és python szkriptek behívásával), egy olyan feladatra amire totálisan alkalmatlan. Inkább akkor python vagy valami egyéb shebangelhető szkript.
-
bambano
titán
válasz
floatr #10817 üzenetére
amit mondtam eddig, az érdemi mondanivaló attól, hogy te nem értesz vele egyet. Nem a vita kedvéért csinálom, hanem azért, hogy a kedves kolléga tanulhasson belőle. Ettől egy független tény, hogy mivel te java-val foglalkozol, szerinted mindent java-ban kell megoldani.
abban pedig biztos vagyok, hogy sokkal hamarabb fog érteni valaki vagy talál valakit, aki ért a sedhez, mint egy tök idegen program json konfigjához, amiben pont ugyanazok a reguláris kifejezések vannak, mint amit sedben használsz.
-
axioma
veterán
Ne csinaljatok mar! Szerintem senkinek nincs igaza
Na jo, mondhatjuk ugy is, hogy mindkettotoknek.
A kerdes, hogy az adat _felhasznalva_ mikor es hogyan lesz. A mikor mindket ertelemben: 1. mikorra lesz kesz valami, ami mar hasznalja 2. a bekeruleshez kepest mikor (on-the-fly vagy havi osszesites). Ha a ketto kozul barmelyik a PatoPal-os verzio, akkor en bizony kezzel nyersen (az ellenorzest se eroltetnem bele) letolnam, azaz a gyujtes mar megkezdodik egy ket perces script utan; ellenben barmi magasabb szintu (adatellenorzes, osszesites stb.) plane megjelenites jellegu izet valami magas szintu, akar java nyelven tennek meg.
Most mar mindketten lohettek ide -
floatr
veterán
válasz
bambano #10816 üzenetére
Annyira ne kapaszkodj már a szavakba, mert az eredeti felvetés annyi volt, hogy parsolni szeretne. Meg akar oldani egy problémát, amire létezik megoldás, nem is egy. Amit te javasoltál neki arra jó, hogy kézzel belökjön pár tesztadatot valahová. Egyik oldalon próbálsz ragaszkodni a "leírtakhoz" a másik oldalon meg "találgatsz". Ez tök jó, ha csak a vita kedvéért csinálod, bár már rögtön az elején megmondta, hogy köszi nem.
Nyilván 3 szutyok property beolvasására nem kell még DB sem, nemhogy teljes stack, sem sed, awk, meg majdnem szabványos reguláris kifejezések, de ha egy kicsit felnézel a billentyűzetből, akkor láthatod a céljait jövőbelátás nélkül.Ha vitatkozni szeretnél csak, akkor biztosan találsz mást a környezetedben, ha meg van érdemi mondanivalód, akkor azzal kéne folytatni.
A scriptedet lehet, hogy kidobod minden egyes változtatásnál, bár leginkább az ötletet kéne kukázni, mert semmi másra nem jó, csak egy éppen aktuális állapot kezelésére, ahol ha hiba van az awk/sed kifejezésekben, ott nagyobb gondban van egy harmadik ember, mintha egy konfigot kéne módosítani - feltételezem, hogy ért hozzá az ember, amit csinál, márpedig ez awk/sed esetében elég nagy szó.
-
bambano
titán
válasz
floatr #10815 üzenetére
"Nem fog megállni a dolog egy property->insert trafónál": ezt úgy hívják, hogy találgatás. Ha architekt követi el, akkor az főben járó bűn. A feladat szenzoradatok mysql-be töltése. Nem vidámpark, nem csillagháború, egy darab libikóka.
"Rendszerszemlélet zéró.": ez nyilván téves kijelentés több okból is. Egy kétsoros szkriptet összeütök két perc alatt. Tehát ha a találgatás, hogy majd valamikor beláthatatlan időtávban mégis lesz extra kérés, amire a szkript már nem alkalmas, akkor pontosan ugyanennyi idő alatt ki is dobom.
Másrészt a rendszerszemléletben alapvető, első helyen levő pontnak kell lenni, hogy a rendszeredet kicsinek tartod meg. Tehát amíg lehet, nem növeled. Minél kisebb egy rendszer, annál egyszerűbb üzemeltetni. Ja, jáva architektek ezt se szokták figyelembe venni, hogy a lomjukat üzemeltetni is kell. Meg debuggolni.
-
floatr
veterán
válasz
bambano #10814 üzenetére
Az ELK nem új. Van mire használni, leírtam, bár láthatóan nem sikerült beazonosítani a komponenseket. A logstash elég messze van a "ballisztikus rakétádtól".
Nem fog megállni a dolog egy property->insert trafónál, ezt nem akarod látni, nem veréb a célpont. A script nem két soros lesz, azt már most garantálom, nem rugalmas, nem használható tovább, csak egy darab script, ami szerencsés együttállásnál elég lehet workaroundnak. Rendszerszemlélet zéró. -
bambano
titán
válasz
floatr #10812 üzenetére
az a baj a jáva nindzsákkal, hogy ha meglátnak egy új jáva szabványt, azonnal fel akarják használni akkor is, amikor nincs mire. Meg az is, hogy soha nem az előttük levő feladatra koncentrálnak. De ha nem, akkor mire?
De az is látszik a párbeszédből, hogy sokan úgy programoznak linuxon, hogy fogalmuk sincs, mit jelent linuxon programozni. ha linuxon windowsosan akarsz programozni, akkor tegyél fel windowst.
Tele van a padlás olyan jávás szakemberekkel, akik akkor is atomtengeralattjáróról kilőtt interkontinentális ballisztikus rakétával lőnek, ha csak egy veréb a célpont.
Szerinted melyikben valószínűbb, hogy hiba lesz: egy két soros shell szkriptben vagy egy elastic-ban? Melyikre kell több erőforrást felhasználni, kiemelten emberit is: egy szkriptre vagy egy rakás jáva vm-re meg benne futó rakás szolgáltatásra? melyiket kapod meg összességében olcsóbban? hint: nem a jávát, arra mérget vehetsz.
És hiába fikázod a szkript nindzsákat, az objektív műszaki érvek ebben a feladatban nem a jáva mellett szólnak.
-
axioma
veterán
válasz
floatr #10812 üzenetére
Tetszik a vidamparkos hasonlat
[off, csak errol jutott eszembe, az idei adventofcode feladatainak majdnem fele egy ilyen evolucios dolog: az elejen csak 2 opcode-ot ismero ertelmezo volt a feladat, most mar komplett terkepet uzemeltet a sajat hasaban es azt kell meghajtani kivulrol algoval -- megjegyzem nekem tetszik es viszonylag uj is ez a(z elore nem ismert) funkcionkkent tovabbpockolos munkamodszer - igaz nem is java-ban hanem pythonban csinalom] -
floatr
veterán
válasz
bambano #10808 üzenetére
Az a baj a script ninjákkal, hogy mindig arra a feladatra koncentrálnak, ami az orruk előtt van. Ezt meg lehet oldani két sor scripttel, ja várj még mókolok rajta.
Szinte minden esetben, amikor egy ilyen kérdés felmerül, jönnek az újabb ötletek, és a végén te is tudod nagyon jól, hogy nem kötélhintát szeretne az emberünk, hanem komplett vidámparkot. Aztán abban a vidámparkban találd meg az egyes scripteket, amiket jó esetben a szerzője tud értelmezni. Tele van a padlás ilyen "szakemberekkel", akik indulatból oldanak meg mindent.az elastic maga az "adatbázis"
a kibana egy dashboard, amivel megjeleníted a méréseket, nyilván nem terminálon queryzgetve akarod nézegetni
a logstash a "pumpa", amivel tetszőleges forrásból, és formátummal betolod az adatokat, ha netán bejönnek új mérésekEttől függetlenül lehet scriptekkel gányolni
-
válasz
#68216320 #10800 üzenetére
Az exe futtatása megoldható a
Runtime.getRuntime().exec(...)
hívással. Visszakapsz egy processz-t, aminek a lefutásátwaitFor()
-ral megvárod. Itt van rá egy kis példa program, ami már demonstrálja azt is, hogy hogyan lehet az exe outputját (stdout) megszerezni. (Alternatíva, hogy az exe egy fájlba írja az outputját, amit futás után normál módon fájlként felolvasol.)A parsolásra régebben még azt mondtam volna, hogy kell írni egy parsert, de manapság ez nem divat... Ha tényleg ennyire rögzített a szerkezet, akkor a sorban szereplő négy komponens (csoport, adatnév, értéknév, érték) előbányászható egy reguláris kifejezéssel is, pl. ezzel:
^([^.]+)\.([^.]+)\.([^.]+): *(.*?) *$
Az outputot soronként célszerű feldolgozni, az elején vagy ki kell hagyni fix számú sort, vagy egyszerűen ki kell hagyni azokat, amire nem illeszkedik a regex:
Pattern pattern = Pattern.compile(<a fenti regex>);
while (<van sor>) {
Matcher m = pattern.matcher(<a sor tartalma>);
if (m.find()) {
String sensorGroup = m.group(1);
// ...
String sensorValue = m.group(4);
// DB mentés
}
}Alternatív szervezés: linux-ban oldod meg, amit lehet. A java program nem hajt végre exec-et, helyette a standard input-ot olvassa, és dolgozza fel. Hívni meg valahogy így:
>sensor.exe <opciók> | java -jar sensorprocessor.jar
És az egészet lehet futtatni pl. cron-ból. (Hátránya, hogy a JVM indítás kissé erőforrásigényes, 30 másodpercenként meg pláne.)
Megjegyzések: (1) fejből írtam, a kódot tekintsük pszeudokódnak, (2) a regex pattern-ben a
\
-eket duplikálni kell a Java string konstansban.Szerk: A korábbi válaszokat nem láttam, pár dolog így ismétlés, bocs.
-
bambano
titán
válasz
#68216320 #10806 üzenetére
"Egyrészt szeretném a beérkezett értékeket validálni mielőtt tárolom.": egyrészt lehet shellben, awk-ban, bármiben validálni. de validálhatod az adatbázisban is. már ha a mysql alkalmas erre, sose próbáltam. postgresql alkalmas.
"esetleg tényleg a megoldás az lenne, hogy egy API-t csinálni java-ban, amit a kliensek hivogatnak és a már parse-olt adatokat azon keresztül tolnák befelé.": van ilyen api, a mysql hálózati apija, minek akarnál még egy újabb apit kitalálni?lyalyly curl... most eltekintve attól, hogy tök értelmetlen http-n csinálni ilyet, a curl-ben túl sok hiba van ahhoz, hogy komoly rendszeren használd.
ha mindenáron kell a wines kliens, akkor winre van sed, bash, mysql kliens, és ugyanaz, mint linuxon. hogy powershellben mekkora meló leprogramozni, nem tudom. de mivel úgysem tudod ugyanazt a szenzorprogramot futtatni, ezért a rendszer mindenképpen különbözni fog.de ha már itt tartunk: miért nem rakod bele a mysql klienst a szenzorokat kezelő programba?
persze elfelejtettem az alapvető kérdést feltenni: dolgozni akarsz vagy megoldani a problémát?
-
bambano
titán
válasz
floatr #10807 üzenetére
tökéletesen leírtad, hogy mi a baj egyes java architektekkel.
elk meg logstash meg elastic meg kibana meg a franc se tudja hány cuccot felrakni azért, hogy bekerüljön egy mért érték egy adatbázisba, az durva tévedés. mindegyik szoftver bugos. ha telerakod szoftverrel a rendszert, akkor teleraktad hibával is.amit két sorban meg lehet írni shellben, ahhoz nem rakunk fel akkora architektúrát, hogy csak a0-s lapra lehet kinyomtatni. és ha még valaki a dockert is elkezdi emlegetni, sikítani fogok.
-
floatr
veterán
válasz
#68216320 #10806 üzenetére
Ez a formátum YAML-ként is értelmezhető, így egy YAML parser be tudja olvasni, és akkor nem egy igénytelenül gányolt shell-ninja szutyokkal oldod meg, amit 1 év múlva a saját szerzője sem tud már támogatni.
De van rá lényegében kész megoldás is: ELK stack. Azt pont ilyenekre találták ki. Logstash illesztőkön keresztül Elastic-ba tolja a szenzorok adatait, amit később Kibanával meg tudsz jeleníteni. Ezt a shelles babrálást meg felejtsd el -
#68216320
törölt tag
válasz
bambano #10805 üzenetére
Van pár szempont ami miatt a sheel-ből nem volna jó dolgoznom.
- Egyrészt szeretném a beérkezett értékeket validálni mielőtt tárolom. Persze ezt is lehet bash-el, de java kényelmesebb volna.
- A szerveren mindenképp van java, mert van egy API, amivel pedig le lehet majd kérdezni ezeket. Tehát a függőségek mindenképp megvanak már
- Szeretném magát az sql részt nem látható módon használni, tehát nem volna jó, ha az insert into mondjuk script-ben lenne
- Lenne windows-os gép is, ami szenzor adatot kap, ott akkor új megoldás kellene a parse-oláshoz (persze ott is megoldható)Amit mondasz, az mondjuk tökéletes megoldás lehetne arra az esetre, amikor az rpi-ket kell használnom majd. Ott problémás lenne a java.
Azon gondolkodom, hogy esetleg tényleg a megoldás az lenne, hogy egy API-t csinálni java-ban, amit a kliensek hivogatnak és a már parse-olt adatokat azon keresztül tolnák befelé. Merthogy a szerveren amúgy is van tomcat. Aztán ott validálnám és ha oké tárolnám (mysql, influx, miegyéb) Ha nem oké majd a response jelzi a kliensnek.
Ekkor a kliens lehet mondjuk a mostani gép linux-al és akkor a sed szétszedné az adatokat (és mondjuk curl hívná az api-t). Ez járható lenne a későbbi rpi kliensek esetén is. A win-es megoldást nem tudom még, hogy ott miként lehetne szétkapni az adatokat és hívni az api-t, de gondolom ott sincs nagy csavar a dologban.Ez mennyire lenne járható út?
-
bambano
titán
válasz
#68216320 #10804 üzenetére
a véleményedtől függetlenül súlyos hiba java vm-et meg java-s programot indítani ott, ahol egy sed vagy awk program tökéletesen elegendő. attól, hogy van java a gépeden, még nem kell minden esetben használni.
a mysql-nek van parancssori kliense, az tökéletes arra, hogy betöltsd az adatokat az adatbázisba."jó lenne java exec megoldással a kimenetet elkapni és parse-olni.": azt sem értem, ehhez minek java exec. feltalálták a csővezetéket, tessék szabvány bemenetet olvasni és parsolni, ha mindenáron java-ban akarod.
bocs, de úgy gondoltam, hogy nem központi probléma megoldani, hogy egy linuxon futó program kimenete hogy kerül egy windowson futó programba. te írtad, hogy linuxon futó program szenzor adatokat gyűjt. miért akarnák windowson adatbázisba rakni?
hagyd a fenébe a java-t, shell szkript topicban vagy linux kezdő topicban megmondják a jó megoldást. szenzor program kiolvassa a mért értékeket, kiküldi szabvány kimenetre, azt sed-del, awk-val vagy shell szkripttel átalakítod szabvány sql insert utasítássá, azt bele küldöd a mysql kliensbe és kész. ennyi. nem java, meg legyen kéznél jdbc driver, meg vm meg a fene se tudja még mi minden függőség.
-
#68216320
törölt tag
válasz
bambano #10803 üzenetére
A modorod a szokásos, neked sem ártana egy szívlapát a képedbe.
Aztán gondolom majd a sed tolja nálad az adatokat mysqldb-be (influxdb még hagyján) és ha netán win-en akarnám futtatni, akkor meg mivan? Szóval igen, java program kell. Pont java és pont azért, mert java.
-
#68216320
törölt tag
válasz
Drizzt #10801 üzenetére
A terv hasonló, de nem szeretném fájlba tárolni, hanem jó lenne java exec megoldással a kimenetet elkapni és parse-olni.
Illetve a grafana tervben van, de sima mysql-ben gondolkodtam nem influxdb-ben. Utóbbit ugyanis nem ismerem és telegraf-ot sem használtam még.Ezért elsőkörben sql lenne. Aztán lehet nekiugrok megismerni az influxdb-t. Csak valami jó anyagot kell találnom róla, ami pontosítja bennem a lényegét, működését, felhasználását.
De köszi a tippet, tényleg ez volna a legjobb végeredmény a feladatra.
És persze docker használat is jó volna, de még az is várat magára. -
Drizzt
nagyúr
válasz
#68216320 #10800 üzenetére
A Linuxos program időzített futtatására használj cront, vagy egyszerűen írj egy bash scriptet, ami tight loopban vár. A kimenetet meg simán irányítsd bele egy fájlba. A Java programban ugyanezt a fájlt nyisd meg ugyanilyen időközönként. Aztán dolgozd fel, s írd ki adatbázisba. Amúgy ahogy az adatod jellegét nézem, kb. egy time series database-ben lenne a legjobb őket tárolni. Erre jó pl. Influxdb. Aztán csinálhatsz rá mindenféle fancy ábrát Grafanával.
Parse-olni ezt egyébként elég egyszerű, soronként végigolvasod, majd line.split("."), a három elemű tömböt meg felhasználod ahogy akarod..
Más: Mi a legjobb, legmélyebb Spring video course amivel találkoztatok? Kéne nekem egy masszívabb. Ha csak fizetős van, az se gond. De örülnék, ha legalább 20 óra körüli lenne és nagyon a részletekbe menő.
Új hozzászólás Aktív témák
Hirdetés
A topicot kiemeltem. Valaki nem akar egy nyitó hsz-t írni?:))
- Xiaomi 11T Pro 128GB, Kártyafüggetlen, 1 Év Garanciával
- Apple iPhone 13 Pro 128GB, Kártyafüggetlen, 1 Év Garanciával
- Apple iPhone 14 Plus 128GB, Kártyafüggetlen, 1 Év Garanciával
- !FELVÁSÁRLÁS! RTX 4090 KORREKT ÁRON AZONNAL
- GAMER PC - RYZEN 5 5500 / ASUS RTX 2060 / AORUS 16GB DDR4 / 512GB SSD / 500GB HDD
- ÁRGARANCIA! Épített KomPhone i5 12400F 16/32/64GB RAM RTX 5060 8GB GAMER PC termékbeszámítással
- Kingmax 1x2GB DDR3-1333 RAM
- ÁRGARANCIA!Épített KomPhone i5 14600KF 32/64GB DDR5 RTX 4070Ti Super GAMER PC termékbeszámítással
- Xiaomi Redmi Note 10 Pro 128GB, Kártyafüggetlen, 1 Év Garanciával
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest