Gwt Java Oauth2 példa hiba

Gwt Java Oauth2 példa hiba
2012-06-24T13:22:26+02:00
2012-06-24T23:16:14+02:00
2022-11-26T04:05:43+01:00
mitibor
Sziasztok!

Ismerkedem a programozással és egy példát csináltam végig, ahol Eclipsben egy Gwt projektet csináltam, majd a leírás szerint hozzáadtam az Oauth2 kódot.

A leírás

Már vagy százszor végigcsináltam úgy is, hogy csak az új részeket illesztettem be, és úgy is, hogy a teljes forrásokat bemásoltam.

Sajnos appspotra felrakva nem jelenik meg az új script. A fordításnál semmilyen hibát nem ír ki, de ha
helyben futtatom, akkor amint megjelenítem a lapot a böngészőmben, a consolban a következő hibaüzenetet kapom:

13:03:47.804 [ERROR] [oauthappenginesample] Uncaught exception escaped

java.lang.NullPointerException: null
at com.sprunck.sample.oauth2.client.OAuthAppEngineSample$2.onSuccess(OAuthAppEngineSample.java:149)
at com.sprunck.sample.oauth2.client.OAuthAppEngineSample$2.onSuccess(OAuthAppEngineSample.java:1)
at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
at java.lang.Thread.run(Thread.java:679)

Merre keresgéljem a hibát? Gondolom nem a leírás hibás, hanem valamit én csináltam rosszul, de nem tudok rájönni, hogy mit. Már a beillesztendő libekből is megkerestem a leírás szerinti régi verziókat, hogy hátha, de nem segített.

Esetleg tud valaki egy még egyszerűbb, teljesen fapados tutorialt?

Előre is köszönöm a reagálásokat.
Mutasd a teljes hozzászólást!
Ha értelmeznéd a kódot, már meg is oldottad volna ezt a részét:
@Override public void onSuccess(final LoginInfo result) { if (result != null && result.getName() != null) { if (!result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); } }
Mi történne eredetileg? Ha a nickname ki van töltve, akkor fut az if első fele (addGoogleAuthHelper és addLogout), ha nincs, akkor a második (loadLogin).
Ha ebbe egyáltalán nem mész bele, mert a result null, vagy a nickname null, akkor tényleg nem fog semmi se történni.

Egyik megoldás, hogy a LoginInfo-ban (pl. konstruktor) mindenképpen inicializálod az értékeket (nickname = "") és akkor nem fordulhat elő, hogy null-t kapsz. A másik megoldás (és akár keverheted is), hogy a feltételt úgy fogalmazod meg, hogy minden esetben értelmes módon válasszon a két ág között.
Ahogy sejtem, a result soha nem lesz null, de ha mégis, akkor jobb is, ha elpukkan egy npe-vel.
@Override public void onSuccess(final LoginInfo result) { if (result.getName() != null && !result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); }
Mutasd a teljes hozzászólást!

  • Mi van írva a OAuthAppEngineSample.java fájl 149. sorába?

    A hiba lényege, hogy egy olyan objektumra akarsz hivatkozni, ami még nem is létezik.
    Hozd létre előtte! Vagy figyeld, hogy nem "null"-e az értéke!

    --------------------

    (Miért nem "mitibi" a nick-neved?)

    --------------------
    Ismerkedem a programozással

    Akkor miért egy ilyen dologgal kell kezdened? Miért nem tanulod meg a Java alapjait? Akkor talán tisztában lennél vele, mi az hogy: "NullPointerException".
    Mutasd a teljes hozzászólást!
  • Szia Pelz!

    Köszönöm, hogy válaszoltál. Kicsit rosszul fogalmaztam. Már programozgattam régebben, csak sose valami magas szinten. Mindig túl bonyolultnak éreztem. Nemrég olvastam a Blocklyról, és gondoltam felelevenítem a dolgokat, megnézem mi fejlődött. Reméltem, hogy össze tudok rakni egy kisebb nyilvántartó progit a gwt designerrel + minimális programozással. Ehhez lett volna tökéletes ez a tutorial, hogy még a belépés is egyszerűen meglegyen. Sajnos már az Eclipse maga is túl bonyolultnak tűnik(régen a Netbeans valahogy egyszerűbbnek, letisztultabbnak tűnt). Általában jól elmozgok számtech szinten, de ennyire specifikusan nem másztam még bele semmibe, így a java rejtelmeibe sem. Gondoltam, ha működik a tutorial, akkor majd tovább alakítgatom magamnak.

    Ide azért írtam, mert reméltem, hogy valaki már kipróbálta ezt a tutorialt, és kapásból tudja a választ. Arra magamtól is rájöttem, hogy a 149. sorban kell keresgélnem null érték után, de ez a program túl szerteágazó nekem. Még próbálkozok egy picit, aztán lehet várok még pár évet, hogy egyszerűbb legyen a dolog

    Amúgy a 147-156.sor:
    @Override public void onSuccess(final LoginInfo result) { if (!result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); }

    Mutasd a teljes hozzászólást!
  • Szerintem a "result" lehet null.
    Próbáld ki ezt:
    @Override public void onSuccess(final LoginInfo result) { if (result != null) { if (!result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); } }

    Most, mit csinál?
    Egyébként, jó lenne a teljes kódot bemásolnád.
    Így nehéz megmondani, miért lehet a probléma.
    Így csak próbálkozhat az ember, valami hasonlóval, mint én tettem most...
    Mutasd a teljes hozzászólást!
  • Köszi segítséget.

    most egy sorral későbbre írja a nullt:

    18:58:47.440 [ERROR] [oauthappenginesample] Uncaught exception escaped

    java.lang.NullPointerException: null
    at com.sprunck.sample.oauth2.client.OAuthAppEngineSample$2.onSuccess(OAuthAppEngineSample.java:150)
    at com.sprunck.sample.oauth2.client.OAuthAppEngineSample$2.onSuccess(OAuthAppEngineSample.java:1)
    at com.google.gwt.user.client.rpc.impl.RequestCallbackAdapter.onResponseReceived(RequestCallbackAdapter.java:232)
    at com.google.gwt.http.client.Request.fireOnResponseReceived(Request.java:287)
    at com.google.gwt.http.client.RequestBuilder$1.onReadyStateChange(RequestBuilder.java:395)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Thread.java:679)

    A forráskódok egy az egyben ugyanazok, mint itt:
    Tutorial

    Még a neveken sem változtattam semmit, hogy nehogy elrontsam.

    Amúgy próbálkoztam debug módban, de az nekem már nagyon kínai.
    Az utolsó sor ami után megáll a dolog:

    TreeLogger branch = host.getLogger().branch(TreeLogger.SPAM,
    "Invoke native method " + name, null);

    Ez a ModuleSpaceOOPHM.class -ban van. (com.google.gwt.dev.shell.ModuleSpaceOOPHM@5bdfcc0e)
    Mutasd a teljes hozzászólást!
  • Akkor, úgy gondolom, nem a result lesz null, mert akkor nem futott volna bele újra ugyanabba a hibába.
    Feltételezésem szerint, már csak a getName() függvény nem adhat vissza objektumot.

    Próbaképpen módosítsd így:
    @Override public void onSuccess(final LoginInfo result) { if (result != null && result.getName() != null) { if (!result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); } }

    Van ilyen osztályod a projektben?
    com.sprunck.sample.oauth2.shared.LoginInfo

    Ha van, hogyan néz ki a getName() függvénye?
    Mutasd a teljes hozzászólást!
  • Tévedtem nem áll meg. Megy tovább a debug.
    Mutasd a teljes hozzászólást!
  • Melyik estben? Az elsőben vagy a második módosítással?
    Mutasd a teljes hozzászólást!
  • Szerintem:
    indítsd el a gwt-t debug módban és vedd fel, hogy álljon meg NullPointerException-nél. Automatikusan meg fog állni és megvizsgálod a változóid értékét.
    Mutasd a teljes hozzászólást!
  • Van ilyen osztályom:

    package com.sprunck.sample.oauth2.shared; import java.io.Serializable; public class LoginInfo implements Serializable { private static final long serialVersionUID = 1L; private boolean loggedIn = false; private String loginUrl; private String logoutUrl; private String emailAddress; private String nickname; private String pictureUrl; public boolean isLoggedIn() { return loggedIn; } public void setLoggedIn(final boolean loggedIn) { this.loggedIn = loggedIn; } public String getLoginUrl() { return loginUrl; } public void setLoginUrl(final String loginUrl) { this.loginUrl = loginUrl; } public String getLogoutUrl() { return logoutUrl; } public void setLogoutUrl(final String logoutUrl) { this.logoutUrl = logoutUrl; } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(final String emailAddress) { this.emailAddress = emailAddress; } public String getName() { return nickname; } public void setName(final String nickname) { this.nickname = nickname; } public void setPictureUrl(final String pictureUrl) { this.pictureUrl = pictureUrl; } public String getPictureUrl() { return pictureUrl; } }

    Már nincs hibaüzenet.

    Lehet, hogy a LoginInfo létrehozásakor rontottam el valamit?
    Így csináltam:
    Jobb gomb -> New -> Class -> alapértelmezetten hagytam mindent.
    Esetleg itt kellett volna valamit másképp csinálnom?
    Mutasd a teljes hozzászólást!
  • Már nincs hibaüzenet.


    Nem értem.
    Pontosan, mi is a helyzet?
    Nincs hibaüzenet, mert az én módosításomat használod? Vagy valami mást csináltál, ami még kellett a progihoz, és a módosításom nélkül is jól működik?
    Mutasd a teljes hozzászólást!
  • A legújabb verzióval próbálva itt állt meg:


    Transformer.isRuntimeCode(ProtectionDomain) line: 184

    Kb ezt látom, ha a variablest kinyitom:

    this Transformer (id=78)
    agent AgentImpl (id=80)
    appUrlClassLoaders WeakHashMap<K,V> (id=104)
    entrySet WeakHashMap$EntrySet (id=123)
    keySet null
    loadFactor 0.75
    modCount 0
    queue ReferenceQueue<T> (id=106)
    head null
    lock ReferenceQueue$Lock (id=111)
    queueLength 0
    size 0
    table WeakHashMap$Entry<K,V>[16] (id=108)
    threshold 16
    values null
    agentRuntimeLibs HashSet<E> (id=83)
    map HashMap<K,V> (id=113)
    entrySet HashMap$EntrySet (id=130)
    keySet HashMap$KeySet (id=114)
    this$0 HashMap<K,V> (id=113)
    entrySet HashMap$EntrySet (id=130)
    keySet HashMap$KeySet (id=114)
    this$0 HashMap<K,V> (id=113)
    loadFactor 0.75
    modCount 1
    size 1
    table HashMap$Entry<K,V>[16] (id=116)
    threshold 12
    values null
    loadFactor 0.75
    modCount 1
    size 1
    table HashMap$Entry<K,V>[16] (id=116)
    threshold 12
    values null
    treatRestrictedClassListViolationsAsErrors false
    userCodeSources HashMap<K,V> (id=92)
    entrySet HashMap$EntrySet (id=152)
    keySet null
    loadFactor 0.75
    modCount 4
    size 4
    table HashMap$Entry<K,V>[16] (id=153)
    threshold 12
    values null
    domain null

    com.google.appengine.tools.development.agent.impl.Transformer@35ad1590
    com.google.appengine.tools.development.agent.impl.AgentImpl@20b63513
    {}
    []
    null
    0.75
    0
    java.lang.ref.ReferenceQueue@4a0f8b2e
    null
    java.lang.ref.ReferenceQueue$Lock@427a9efe
    0
    0
    [null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null]
    16
    null
    [file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar]
    {file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar=java.lang.Object@5c57cb}
    [file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar=java.lang.Object@5c57cb]
    [file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar]
    {file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar=java.lang.Object@5c57cb}
    0.75
    1
    1
    [null, null, null, null, null, null, file:/home/mitibor/Letöltések/eclipse/plugins/com.google.appengine.eclipse.sdkbundle_1.6.6/appengine-java-sdk-1.6.6/lib/impl/agent/appengine-agentruntime.jar=java.lang.Object@5c57cb, null, null, null, null, null, null, null, null, null]
    12
    null
    false
    {file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/gwt-servlet.jar=false, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/classes/=false, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/appengine-api-1.0-sdk-1.6.6.jar=true, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/jackson-core-asl-1.9.1.jar=false}
    [file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/gwt-servlet.jar=false, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/classes/=false, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/appengine-api-1.0-sdk-1.6.6.jar=true, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/jackson-core-asl-1.9.1.jar=false]
    null
    0.75
    4
    4
    [null, null, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/gwt-servlet.jar=false, null, null, null, null, null, null, null, null, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/classes/=false, null, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/appengine-api-1.0-sdk-1.6.6.jar=true, null, file:/home/mitibor/workspace/OAuthAppEngineSample/war/WEB-INF/lib/jackson-core-asl-1.9.1.jar=false]
    12
    null
    null


    Ez már rég nem az "én" kódom része. Ebből egy kukkot sem értek.
    Mutasd a teljes hozzászólást!
  • A változtatásod után már nem volt hibaüzenet, viszont a program google-beléptetés része sem működött.

    Mást nem változtattam.
    Mutasd a teljes hozzászólást!
  • Hihetetlen! Hogy mennyire nem tudsz lényegre törő információkat adni.
    Melyik változtatás után? Hányszor kérdezzem meg még? Az első vagy a második? Továbbra sem tudom, hogy a LoginInfo a null vagy a getName() ad vissza null-t.
    Így veszett nehéz.

    ---------------------
    google-beléptetés része sem működött.

    Eddig működött?
    Mutasd a teljes hozzászólást!
  • Az első változtatás után írtam, hogy egy sorral lentebb tolódott, de maradt a hibaüzenet. A második változtatás után már nem volt hibaüzenet. A google-beléptetés része még egyátalán nem működött.

    Bocsi, hogy nem vagyok lényegretörő, de nem tudom, hogy hol a lényeg. Az a baj, hogy a debugban teljesen elveszek, és azon meg csodálkoznék, ha a tutorial kódjában lenne a hiba.
    Mutasd a teljes hozzászólást!
  • Ha értelmeznéd a kódot, már meg is oldottad volna ezt a részét:
    @Override public void onSuccess(final LoginInfo result) { if (result != null && result.getName() != null) { if (!result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); } }
    Mi történne eredetileg? Ha a nickname ki van töltve, akkor fut az if első fele (addGoogleAuthHelper és addLogout), ha nincs, akkor a második (loadLogin).
    Ha ebbe egyáltalán nem mész bele, mert a result null, vagy a nickname null, akkor tényleg nem fog semmi se történni.

    Egyik megoldás, hogy a LoginInfo-ban (pl. konstruktor) mindenképpen inicializálod az értékeket (nickname = "") és akkor nem fordulhat elő, hogy null-t kapsz. A másik megoldás (és akár keverheted is), hogy a feltételt úgy fogalmazod meg, hogy minden esetben értelmes módon válasszon a két ág között.
    Ahogy sejtem, a result soha nem lesz null, de ha mégis, akkor jobb is, ha elpukkan egy npe-vel.
    @Override public void onSuccess(final LoginInfo result) { if (result.getName() != null && !result.getName().isEmpty()) { addGoogleAuthHelper(); loadLogout(result); } else { loadLogin(result); } userEmail.append(result.getEmailAddress()); }
    Mutasd a teljes hozzászólást!
  • Bocsi!
    Lehet, hogy én is elfáradtam már.

    Tehát, nem írtál be a nickname-hez semmit? Úgy akartál bejelentkezni?
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget.

    Nem írtam semmit a nickname-hez, mert nem írta a tutorial, hogy így tegyek, meg úgy gondoltam, hogy pont ez lesz a program lényege, hogy majd megkérdezi, ha nincs.

    A balage73 által írt második kódrészlet beillesztésével már úgy működik, ahogy a leírás szerint kell. Sajnálom hogy ennyi időtök/időm elment vele. Eredetileg úgy terveztem, hogy egy gyors copy/paste, és ha működik, akkor elkezdem kicsit módosítgatni, és közben megérteni minden részletét. Csak nem találtam másik hasonlót...

    Mégegyszer köszönöm a segítséget mindkettőtöknek
    Mutasd a teljes hozzászólást!
  • Írjál a tutorial szerkesztőjének, hogy elrontotta!
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd