Hirdetés

2024. április 23., kedd

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)

Hozzászólások

(#12005) Taoharcos


Taoharcos
aktív tag

Sziasztok.
Spring Boot-ban lehet futás közben dinamikusan állítani a port-ot?
Vagy induláskor ha foglalt eggyel nagyobb port számot választani amin induljon?

(#12006) hoopy válasza Taoharcos (#12005) üzenetére


hoopy
újonc

Futásidőben nem tudsz. Viszont induláskor tudsz neki beadni portszámot: itt
Illetve a propertiesben a server.port=0 egy random portot választ.

Kerülőmegoldásokkal biztos megoldható az is, hogy induláskor a TCP portot először ellenőrzöd és ha foglalt növeled és azt adod be neki a main függvényben. (TestSocketUtils-nak talán van egy ilyen from-to port scan metódusa)

Bár prod környezetben érdekes megközelítés nem statikus vagy teljesen random portot használni.

[ Szerkesztve ]

(#12007) btraven


btraven
őstag

Android Studio erre miért nem jelez hibát?
class Nation
private final List<League> leagues = new ArrayList<>();
class League
private List<Integer> teamIds = new ArrayList<>();

Team promotedTeam = statActor.getAscendingTeam();
nation.getLeagues().get(downLeague).getTeamIds().remove(promotedTeam);

(#12008) btraven


btraven
őstag

Ha rengeteg objektumot írok ki serializálva a tárolóra akkor jobb byte field-eket használni az osztályban használni mint int-et?
Elvileg negyede lesz a fájl mérete?

(#12009) Drizzt válasza btraven (#12008) üzenetére


Drizzt
nagyúr

Ha kifejezetten méretre lősz és nem muszáj JDK only megoldást adni, akkor lehet jobban jársz, ha valamilyen cél library-t használsz. Némi összehasonlítás: [link] Főleg a 3.4 performance az érdekes.
Btw: Nagyban függ attól, hogy mi egyéb van még az osztályokban, ha csak egész számok, akkor hány darab, etc. De ha nagyon optimalizálni akarsz méretre, akkor lehet nem is magát a classt kéne szerializálni, mert az nyilván hoz magával mindenféle metadatát, ami tuti sokat fogyaszt.

I am having fun staying poor.

(#12010) btraven


btraven
őstag

Valaki kitalálja miért?
[link] libgdx Color

int x = 1 + 255;
Color color = new Color(x);
print(color); = 0x00000100;

Hát én 0x000001FF -re számítottam.

new Color(0f, 0f, 1f/255f, 1f); - ez jó

(#12011) Drizzt válasza btraven (#12010) üzenetére


Drizzt
nagyúr

Miért számítottál másra?
Decimális 256 az hexadecimális 0x100. Mitől kellett volna 0x1FF-nek lennie?
Ha 0x1FF-et akarsz, miért nem hexadecimálisan adod meg az x int értékét?

I am having fun staying poor.

(#12012) btraven válasza Drizzt (#12011) üzenetére


btraven
őstag

Köszönöm, ezt jól elnéztem. :R
int értékem van, és az alpha-t szerettem volna FF-re állítani mindegyikhez.
Akkor marad az r,g,b,a konstruktor.

(#12013) dudikpal


dudikpal
aktív tag

Ezzel kérem le a html contentet:
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0");
con.setReadTimeout(5000);
con.setConnectTimeout(5000);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
StringBuffer content = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
    content.append(inputLine + "\n");
}
in.close();
con.disconnect();
Eddig működött is (más oldalaknál továbbra is jó), de most 403-at dob pl erre:
https://www.cars-data.com/en/lincoln-continental-specs/59792/tech
Viszont postmanből sima get-tel jön a content, még http request-ből is (.http), de így kódból meg nem. Gondoltam rá lett dobva 1 nem vagyok robot captcha vagy vmi, de akkor request fileból meg postmanből sem kéne jönnie, nem?

(#12014) Arpee78


Arpee78
senior tag

Üdv, szerintetek az alábbi feladatot meg lehet oldani jobban, elegánsabban is?

A metódus kap egy egész számokból álló listát, meg kell számolni benn a növekvő sorozatokat. Pl (1, 2, 3, 1, 2, 3, 1) ebben van kettő.

Az én megoldásom:
public int numberOfIncSeries(List<Integer> numbers) {

int count = 0;
boolean inc = false;

for (int i = 1; i < numbers.size(); i++) {
if (numbers.get(i - 1) <= numbers.get(i)) {
inc = true;
} else {
if (inc) {
inc = false;
count++;
}
}
}
count = inc ? count + 1 : count;
return count;
}

(#12015) Drizzt válasza Arpee78 (#12014) üzenetére


Drizzt
nagyúr

Sokkal szebb szerintem nincsen sajnos. Én picit gyakoroltam TDD-t rajta, nagyjából ez jött ki belőle:
[link]
ListSequenceFinder.findSeq a metódus, ListSequenceFinderTest tartalmazza a 18 Test case-et. Sajnos a formázást valamiért elcseszte csúnyán.

I am having fun staying poor.

(#12016) Ablakos


Ablakos
őstag

Van egy osztály (App) ami implementál két interfészt. Mindkét interfésznek van egy ugyanolyan nevű default metódusa.(default void doStuff(){})
Az osztályban hogyan tudom hívni a kívánt default metódust?

(new App().doStuff(); természetesen fordítási hibát ad)

[ Szerkesztve ]

(#12017) Sirpi válasza Ablakos (#12016) üzenetére


Sirpi
senior tag

Ha jól emlékszem:
PreferredInterface.super.doStuff()

Kötelező definiálni is az osztályban a doStuff metódust ilyenkor, es akkor menni fog, amit irtál.

[ Szerkesztve ]

Hazudnék, ha cáfolnám annak tagadását, hogy ez az ital nem nélkülözi a koffeinmentesség megnemlétének hiányát. Na most akkor van benne koffein, vagy nincs?!

(#12018) Ablakos válasza Sirpi (#12017) üzenetére


Ablakos
őstag

Igen, tényleg az eclipse már editorban figyelmeztet, hogy override nélkül nem lesz jó.
Így már megy. super :B
Köszi

(#12019) Ablakos


Ablakos
őstag

Egy tömb referencia változó kiíratása konzolra hasonló [I@85ede7b eredményt ad. Valamire (mire) használható ez a hieroglifa?

[ Szerkesztve ]

(#12020) Arpee78 válasza Ablakos (#12019) üzenetére


Arpee78
senior tag

Nem vagyok még teljesen a téma szakértője, valaki biztos szebb választ is tud majd adni, de

Azt hiszem amit kiír az maga a memóriacím ahol a tömböd található, lévén a referencia típusú változók egy referenciát(hivatkozást) tárolnak el.

Az Arrays.toString(tombodValtozoNeve)) amivel megkapod emészthetőbben a tömb tartalmát, vagyis az Arrays osztály toString metódusával.

Ha nem így lenne javítsatok ki.

(#12021) Sirpi válasza Arpee78 (#12020) üzenetére


Sirpi
senior tag

A tömböknek (szándékosan) nincs felülvágva a toString() metódusa, ez amit látsz, kb. a tömb hashCode-ja (az Object osztály implementációja fut le).
Az Arrays.toString tényleg megoldja a problémát, de ha nem teszel bele effortot, akkor valóban nem írja ki emberi módon a tartalmat. Így pl. ajánlás, ha password fieldet kell a backenden metódusok között átpasszolni, akkor char[] legyen a típus és ne String, nehogy véletlenül bekerüljön a jelszó a logba.

Hazudnék, ha cáfolnám annak tagadását, hogy ez az ital nem nélkülözi a koffeinmentesség megnemlétének hiányát. Na most akkor van benne koffein, vagy nincs?!

(#12022) Ablakos


Ablakos
őstag

Nagyon nem java, de megpróbálom...
Idézet az OCP-ből
Develop code that declares, implements and/or extends
interfaces and use the @Override annotation (sic*).

Mit akar jelenteni ez a sic a mondat végén?

(#12023) Drizzt válasza Ablakos (#12022) üzenetére


Drizzt
nagyúr

Azt tippelnem, hogy arra utal, hogy az annotacio neve bizonyos esetekben megteveszto. Hiszen egy interface metodus implementalasa nem override fogalmilag.

I am having fun staying poor.

(#12024) Ablakos válasza Drizzt (#12023) üzenetére


Ablakos
őstag

Köszi értem. És a sic egy rövidítés vagy valami
angolizmus? :B

(#12025) Drizzt válasza Ablakos (#12024) üzenetére


Drizzt
nagyúr

Nem, ez latin.
[link]
Nyomtatott magyar sajtoban regebben nagyon sokat alkalmaztak.

I am having fun staying poor.

(#12026) Ablakos


Ablakos
őstag

téma: kivételkezelés
Nem értem, hogy miért csak az utolsó except. jelenik meg a konzolon. Hova lesz a resource manager close és a try IOException üzenet?

import java.io.Closeable;
import java.io.IOException;

public class Animals {
class Lamb implements Closeable {

@Override
public void close() throws IOException {
throw new RuntimeException("a");
}
}
public static void main(String[] args) {
new Animals().run();
}
public void run() {
try (Lamb l = new Lamb()) {
throw new IOException();
} catch (Exception e) {
throw new RuntimeException("c");
}
}
}

(#12028) sztanozs válasza Ablakos (#12026) üzenetére


sztanozs
veterán

Remelem nem gond az angol:

Catch Block
You can add a catch block to a try-with-resources block just like you can to a standard try block. If an exception is thrown from within the try block of a try-with-resources block, the catch block will catch it, just like it would when used with a standard try construct.

Before the catch block is entered, the try-with-resources construct will attempt to close the resources opened inside the try block. In case an exception is thrown when attempting to close one of the resources, these exceptions will be available from the exception's getSuppressed() method inside the catch block. Here is an example of a Java try-with-resources block with a catch block attached:

try(AutoClosableResource resourceOne = new AutoClosableResource("One", true)) {
resourceOne.doOp(true);
} catch(Exception e) {
Throwable[] suppressed = e.getSuppressed();
throw e;
}

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#12029) Szmeby válasza Ablakos (#12026) üzenetére


Szmeby
tag

Hogyhogy hova lesz?
Ott van a } catch (Exception e) { e változójában, amit a catch blokkban ignorálsz.
Ha ignorálsz egy exceptiont, akkor ignorálva lesz. :)

(#12031) Ablakos válasza Rat.Sand (#12030) üzenetére


Ablakos
őstag

Automatic Resource Management

A try utáni zárójelben felsorolt erőforrásokat automatikusan be tudja zárni a JVM. (catch, finally ág nélkül is müködik szintaktikailag)
Elvárás, hogy az itt felsorolt objektumoknak az Closeable() vagy az AutoCloseable interfészt kell implementálni.

[ Szerkesztve ]

(#12032) sztanozs válasza Rat.Sand (#12030) üzenetére


sztanozs
veterán

ez a .net
using (...) {}
vagy python
with (...):
megfeleloje. Arra valo, hogy a lezarhato resource-ok (pl file handle) mindenfelekepp le legyenek zarva a hasznalat utan.

[ Szerkesztve ]

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#12034) sztanozs válasza Rat.Sand (#12033) üzenetére


sztanozs
veterán

Szivesen :)

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#12035) Ablakos válasza Szmeby (#12029) üzenetére


Ablakos
őstag

Végig szöszöltem az OCP idevonatkozó részét, és most fedeztem fel, hogy átléptem a
"If the catch or finally block throws an exception, no suppressions
happen" elég fontos szabályt. Ezen értetlenkedtem. :B

[ Szerkesztve ]

(#12036) lanszelot


lanszelot
addikt

Hello,
Segítséget szeretnék kérni.
Csak hobbiból készítettem egy oldalt magamnak ezzel az API -val [link]
Szeretném ha magyarul írna ki mindent, de a google fordító api már nem működik.
Nem találom, hogy milyen mondatokat tartalamzhat, így switch-el nem tudom lecserélni se.
Mar néztem ott a fordítást , de nem a weboldal felöli mondatok vannak az exelben, hanem a kikérő kulcsszavak /aminek nem látom értelmét lefordítani/
Hogyan tudnám megoldani, hogy magyarul írja ki a mondatokat?

/pl description: "Partly cloudy throughout the day with rain."
vagy
"Partly cloudy throughout the day with a chance of rain throughout the day."/
Nem naponta váltja, ma már ez nemtudom hanyadik különböző leírás.
De több mindent kell fordítani, nem csak a leírást.

[ Szerkesztve ]

(#12037) hoopy válasza lanszelot (#12036) üzenetére


hoopy
újonc

Magyar nyelvi kóddal lekérés nem megfelelő? Abban magyarul vannak a description mezők.

[link]

lang (optional) – Sets the language of the translatable parts of the output such as the conditions field. Available languages include: ar (Arabic), bg (Bulgiarian), cs (Czech), da (Danish), de (German), el (Greek Modern), en (English), es (Spanish) ), fa (Farsi), fi (Finnish), fr (French), he Hebrew), hu, (Hungarian), it (Italian), ja (Japanese), ko (Korean), nl (Dutch), pl (Polish), pt (Portuguese), ru (Russian),, sr (Serbian), sv (Swedish), tr (Turkish), uk (Ukranian), vi (Vietnamese) and zh (Chinese). In addition passing in ‘id’ will result in the raw descriptor IDs.

pl:
description":"Részben felhős egész nap."

(#12038) lanszelot válasza hoopy (#12037) üzenetére


lanszelot
addikt

Először is köszönöm a választ.

Ezt néztem, de ez a fordítás.
Én nem találtam, hol lehetne hu -ra váltani.

(#12040) lanszelot válasza Rat.Sand (#12039) üzenetére


lanszelot
addikt

Nagyon szépen köszönöm a segítséget :R

Ez a bajom, hogy nem tartalmaz lang paramétert.
És rosszul adtam hozzá, úgy ahogy ott volt lang(hu). :B
De már látom, hogy lang=hu a megfelelő

(#12041) hoopy válasza lanszelot (#12040) üzenetére


hoopy
újonc

Erre gondoltam, de akkor így megtaláltad két lépésben.

(#12042) lanszelot


lanszelot
addikt

Most vettem észre hogy az java és nem java script. Nem láttam szemüveg nélkül. Bocsánat :B

[ Szerkesztve ]

(#12043) Aethelstone válasza Taoharcos (#12005) üzenetére


Aethelstone
addikt

Teljesen antipattern. Engedd el.

MI 10T Pro 8/256 , Arsenal FC - Go Gunnarz...

(#12044) Ablakos


Ablakos
őstag

Mi a különbség két referencia között new ArrayList vagy anélkül?
Human jenny = new Human(18, "Jenny");
Human jeff = new Human(17, "Jeff");
Human jill = new Human(21, "Jill");
List<Human> people = new ArrayList<>(Arrays.asList(jenny, jeff, jill));

(#12045) gygabor88 válasza Ablakos (#12044) üzenetére


gygabor88
tag

A new ArrayList nélkül olyan listát kapnál, aminek nem módosítható a mérete.

(#12046) Ablakos válasza gygabor88 (#12045) üzenetére


Ablakos
őstag

Köszi.

(#12047) Ablakos


Ablakos
őstag

Sehogy nem bírom a map első generikus típust stringre kényszeríteni. Mindenképpen az Object-et erőlteti. Object típussal működik, de nem értem a pontos megoldást.

Stream<String> input = Files.lines(Paths.get("words.txt"));

Map<String, List<String>> a = // csak Objectként fordul le String helyett
        input.map(line -> line.split(" "))
                    .flatMap(array -> Arrays.stream(array))
                    .collect(Collectors.groupingBy(d -> d.charAt(0)));

/* .forEach((c, dl) -> {
System.out.print("first character: " + c + " =>");
dl.forEach(d -> System.out.print(d+ ", "));
//System.out.println();
});
*/

[ Szerkesztve ]

(#12048) Ablakos válasza Ablakos (#12047) üzenetére


Ablakos
őstag

Elnézést, tárgytalan.
Csak egy üres stringet kell hozzá toldani a charAt+hez. Ezt nagyon elnéztem. :B

(#12049) Taoharcos


Taoharcos
aktív tag

Sziasztok!
Karakter kódolási problémával kapcsolatban kérdeznék.
Java 17 és Spring 3.2 verziókat használok.
Egy Spring Boot-os alkalmazás fejlesztése Windows alatt történik. Egy .csv file-t készít amit le lehet tölteni. Windows helyesen jelenek meg a magyar karakterek. Viszont ha feltelepítem egy hardenelt Ubuntura, akkor a magyar karakterek helytelenül jelennek meg. Elvileg minden már csak UTF8-at használ, de nincs elképzelésem sem, hogy mi lehet a probléma.

(#12050) Taoharcos válasza Taoharcos (#12049) üzenetére


Taoharcos
aktív tag

Elnézést, pontatlan voltam, a Windows ISO-8859-2-t használ.
Szóval az lenne a kérdésem, hogy lehetne Java 17 alatt ISO-8859-2-es karakter készletet használni?

[ Szerkesztve ]

(#12051) Szmeby válasza Taoharcos (#12050) üzenetére


Szmeby
tag

Attól függ, milyen eszközzel olvasod fel a fájlt.

Akárhogy is, a fájlban a szöveg byte-ok halmaza, azt valamilyen karakterkészletre kell alakítani felolvasáskor. Akár bytearrayt, akár inputsreamet, akár valamilyen fancy toolt használsz, ami ezekre épül, mindegyikben kell legyen (az értelmesekben legalábbis) olyan opció, ahol megadhatod a charsetet is. Vegyük például a Files::lines metódust ő is vár egy charsetet, megadhatja az, akinek erre van igénye.

A nio StandardCharsets osztályában megtalálod a gyakran használt charseteket, bár mondjuk a latin2 szerintem nincs köztük, de a nio ismeri azt is. Legrosszabb esetben stringként megadod a Charset::forName factory metódusnak és máris van egy charseted, amit használhatsz az olvasásnál. Csak jól írd be a nevét.

Egyébként, ha lehetőséged van rá, inkább pl. UTF8-ban generáld ki azt a csv-t, az sokkal univerzálisabb.

(#12052) bucc


bucc
csendes tag

sziasztok
PTI-s hallgató vagyok és nagyon nem megy a java, külön óra céljából keresnék prog ban jártas fórumtársat.

(#12053) lanszelot


lanszelot
addikt

Hello,
[link]
Ha letekerem a zöld box-ban lévő szöveget, hogyan tudok a tetejére vissza ugrani, ha egy sima szövegre klikkelek.
Nem "a" tag, és nem gomb.

(#12054) lanszelot válasza lanszelot (#12053) üzenetére


lanszelot
addikt

Bocsánat, véletlen írtam ide, nem volt rajtam a szemüveg :B
Már nem tudtam törölni

(#12055) Tothg86


Tothg86
tag

Sziasztok

Tudtok esetleg egy jó tutorialt Hibernate-hez? Amiket eddig találtam, egyikből sem jutottam közelebb a témához.

Köszönöm!

(#12056) floatr válasza Tothg86 (#12055) üzenetére


floatr
veterán

Biztosan vannak jobb források, de sok év után is általában a Baeldung-on kötök ki, ha valamire nem emlékszem. Itt van egy Spring Data JPA guide lista, sima hibernate-et kezdésnek nem annyira ajánlanám. Érdemes a cikkek alján lévő githubos példákat is végignézni.

(#12057) Tothg86 válasza floatr (#12056) üzenetére


Tothg86
tag

Köszi!
Egy konkrét kérdésem is lenne.
Van egy munkahelyi tábla, amiben nincsen auto increment ID, nincs semmilyen primary key sem. Szembesültem azzal (ha jól értem), hogy a hibernate megköveteli az egyértelmű azonosítást. Mivel nincs a táblában ID, ezért egy darab azonosítót nem tudok hozzárendelni. Olvastam, hogy van lehetőség összetett kulcs hozzárendélésére az EmbeddedID annotation-nel.
Jól értem? Egy netes példában az volt, hogy egy külön osztályt hozok létre a kulcsnak, és itt jelölöm, hogy @Embeddable. De ez már beleszámít a mappingbe?

(#12058) floatr válasza Tothg86 (#12057) üzenetére


floatr
veterán

Ebben a cikkben leírnak két lehetőséget, de én is használok több munkahelyi projekten összetett kulcsot. Az EmbeddedId-t javaslom, de pár dolgot nem árt észben tartani.
Az ID-t így te adod meg, nem a hibernate generálja. Emiatt egy új rekord mentésénél (save/saveOrUpdate) a hibernate egy selectet fog kiadni, hogy leellenőrizze, van-e már azzal a kulccsal adat a DB-ben. Ezt ki lehet kerülni mondjuk egy EntityManager.persist(...) hívással egy custom repo implementációban, ha te tudod garantálni a PK egyediségét. Ha sok adatot importálsz, problémát tud okozni.
Az ilyen táblák általában kapcsoló/kapcsolatleíró táblák, és az összetett kulcs elemei külső kulcsok (FK), amik más táblákra mutatnak. Ilyenkor a hibernate csak trükközve tudja leírni a relációt másodlagos mappeléssel, vagy a kulcsban mappelt relációval, bár nem mindig van szükség arra, hogy össze tudj kapcsolni kódban is két objektumot.

[ Szerkesztve ]

(#12059) Tothg86 válasza floatr (#12058) üzenetére


Tothg86
tag

Köszönöm szépen!
Az az egy nem világos most, hogy egyelőre egy tök szimpla lekérdezéshez, a példában szereplő két mezőt (account number és account type) ugyanúgy kell mappelnem az account osztályban, hogy melyik oszlopban van az adatbázisban? Én úgy szoktam, hogy nem bizom a hibernatere, hanem mindig megadom melyik adatbázis oszlophoz mappelje.

(#12060) floatr válasza Tothg86 (#12059) üzenetére


floatr
veterán

Valahogy így:

@Embeddable
public class AccountId {
    private String accountNumber;
    private String accountType;
    ...
}

@Entity
public class Account {
    @EmbeddedId
    @AttributeOverrides({
        @AttributeOverride(name="accountNumber", column=@Column(name="account_number")),
        @AttributeOverride(name="accountType", column=@Column(name="account_type"))
    })
    private AccountId id;
    ...
}

az @AttributeOverrides szekciót azért tettem bele, mert ezzel pontosan el tudod nevezni a DB mezőket. A hibernatenek van olyan NamingStrategy-je (jpa/component-path), hogy hajlamos elécsapni a generált neveknek prefixként azt, hogy "id_"

[ Szerkesztve ]

(#12061) Tothg86 válasza floatr (#12060) üzenetére


Tothg86
tag

Sikerült, nagyon köszönöm! :R

(#12062) btraven


btraven
őstag

java.awt.Color.ORANGE
public static final Color ORANGE
The color orange. In the default sRGB space.

MS Paint-ban milyen pixel-t kell ehhez csinálnom, hogy egyezzen?
ARGB 255,255,200,0 pixel egyezik
de miért? ezt sehol nem találom specifikálva?
vagy ki kell debuggolni minden egyes színt?

vagy más környezetben más az értéke?
bizonyos környezetben a narancs gyümölccsel egyenlő a default zöldséges standján a piacon? :)

(#12063) gygabor88 válasza btraven (#12062) üzenetére


gygabor88
tag

Megnézed a jdk forrásában, hogyan van definiálva és látszani fog, hogy (r, g, b, a) = (255, 200, 0, 255) értékeket használnak.

(#12064) btraven válasza gygabor88 (#12063) üzenetére


btraven
őstag

Köszi :R
Már túlzásba viszem az internetes keresgélést. Ahelyett hogy a speckót olvasnám.

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.