Inlägg

Inlägg som Teknocide har skrivit i forumet
Av Teknocide

Dag 1, Scala 3

Del 2 kändes definitivt lurigare i år

Av Teknocide
Skrivet av burton666:

Jag känner mig ganska dum nu men hur gör jag för att avbryta exekvering av ett javascript script från en funktion ?
Jag vill altså att bara "Start" visas i outputen om jag klickar på "No" i confirm-rutan.

Måste jag använda mig av Throw för att avbryta all exekvering direkt från funktionen eller hur gör jag ?
Jag vet att jag skulle kunna returnera false och sedan använda mig av en if-sats för att göra detta men jag antar att det måste finnas något bättre sätt.

const debugConfirm = (message) => { if(!window.confirm(message)) return } console.log("Start") debugConfirm("fubar") console.log("Visa inte det här meddelandet!")

Det räcker med

console.log("Start") if (window.confirm("Ska jag skriva nästa meddelande?")) { console.log("Du valde att detta skulle skrivas") } console.log("Slut")

Edit: Jag antog lite förhastat att ditt kodexempel mer eller mindre var vad du var ute efter. Jag skulle säga att en if-sats är den enklaste lösningen på det mer generella problemet. Det går att göra med exceptions också men du behöver fånga någonstans för att programmet ska kunna fortsätta.

Av Teknocide
Skrivet av Islandesess:

gick ej.
Har en lista i början så den säger att det ej går med List[]

Språk? Du bör visa en kodsnutt åtminstone, det går inte att förstå vad du menar med "Har en lista i början…".

Av Teknocide

@Frejoh466:

LIST är väl precis det du skrivit, dvs. OBJECT.__dict__ ? Alltså __dict__-attributet på returvärdet av JI_USER.get_item('ITEM')

edit:
Du borde kunna använda LIST['id'] för att få ut samma värde som du kan få genom OBJECT.id, men det är oklart vad det är du försöker åstadkomma.

Av Teknocide

För ett konsolverktyg kan du läsa argumenten som användaren kör ditt program med. För enkelhets skull kan vi anta att första argumentet är filnamnet och resterande argument är rader av text som ska skrivas till filen. Det blir något åt det här hållet:

// exkluderar klassdefinition, importer och felhantering för att göra exemplet kortare public static void main(String[] args) { String filename = args[0]; File outputFile = new File(filename); PrintWriter output = new PrintWriter(outputFile); for (int i=1; i < args.length; i++) { output.println(args[i]); } output.close(); }

Av Teknocide
Skrivet av Sweedland:

Lustigt du nämner detta. Jag är inne på precis det där ämnet just nu. Browsern uppdateras inte som jag vill. Har förstått att det är en trix att fixa detta. Jag stupar dock på grundkursen (som jag inte gått) som säkert berättar hur javan exekveras.
Denna 'setInterval' tycks köra på och loopa tills man gör en clear. updateFunction körs i en egen process har jag också lärt mig (den hårda vägen).

edit: Det funkar....nästan. Problemet är nu att inläst fil (som ska presenteras i tabellens ena cell vilken den också gör) cachas så jag måste göra en manuell rensning av browserns cache. Måste kolla vad Java har att erbjuda....

edit2:
Det verkar som om jag måste ha annat namn på den fil som ska läsas och visas upp. Det är för att inte cachen ska behålla den.
Har läst lite om hur man "bypassing the cache". Låter lite knöligt men har provat det mesta..

Det är servern som bestämmer om materialet ska cachas. Du borde t ex kunna sätta headern Cache-control: no-store när filen returneras, men du kan också göra en fuling genom att lägga på current timestamp på querysträngen, dvs från JavaScriptet hämtar du något i stil med https://server.se/fil.txt?q=123152512, där värdet på ?q=-parametern sätts till (new Date()).getTime().

setInterval loopar inte per definition; istället säger den hur ofta en funktion ska köras. Lite som en prenumeration. Också värt att veta är att detta inte är Java, utan JavaScript; två helt olika programmeringsspråk

Av Teknocide
Skrivet av Sweedland:

Behövde höra det där. Alltså att det inte är en optimal väg men den "duger".
Det är inget hobbyhack men ska ändå fungera hyggligt. Ingen avlider dock om den råkar starta om pga nåt hängt sig. Det jag mest är osäker på är om Chromium börjar spöka och säga att "vill du vänta eller avsluta?" då jag ligger i den där loopen.

Det är alltså en Raspberry med touchscreen. På dess skärm visas operatörsgränssnittet vilket drivs av apache/php/C. Orsaken till detta val är flera.

Jag rekommenderar att du använder en schemaläggare istället för en loop (for/while). Detta för att loopar i JavaScript kan låsa gränssnittet och käka datorkraft i onödan.

function updateFunction() { // hämta data, uppdatera om det behövs } window.setInterval(updateFunction, 1000) // där 1000 är antalet millisekunder mellan varje koll

Av Teknocide
Skrivet av Wequ:

Oj ja det gjorde saken lite klarare!

Om man ska applicera det som händer i for-loop tänk, sker alla steg i en loop eller är det flera nästlade loopar?

Gissningsvis bara en.

Av Teknocide
Skrivet av Wequ:

Jag försöker skriva av den för att förstå vad varje metod gör , men när jag kommer till "entry" blir det rödmarkerat och meddelandet "Cannot resolve symbol 'entry'".

Har du lust och förklara vad kodsnutten gör? Vad är entry för något?

Är inte direkt van vid sån där kod, mest använt for loopar etc.

Syntaxen entry -> entry.getValue().date.toString() är en anonym funktion som motsvarar

String getDateAsString(Map.Entry<String, WeatherData> entry) { return entry.getValue().date.toString(); }

Typen för entry kommer sig av .entrySet()-typen, dvs Set<Map.Entry<String, WeatherData>>.
Att det inte fungerar hos dig kan bero på att du kör Java i en version tidigare än 8. Från och med Java 8 finns det stöd för just dessa så kallade lambda-uttryck, även kända som anonyma funktioner.

Här är en kommenterad version

TreeMap<String, List<Double>> output = input.entrySet() .stream() .collect( Collectors.toMap( entry -> entry.getValue().date.toString(), // *1: tar fram ett nytt nyckelvärde entry -> List.of(Double.parseDouble(entry.getValue().temp)), // *2: varje entry omvandlas till en lista av temperaturer (temps, temp) -> Stream.of(temps, temp).flatMap(List::stream).collect(Collectors.toList()), // den här raden slår samman listor av temperaturer. Dvs [1.4] + [-0.3] = [1.4, -0.3] () -> new TreeMap<>() // säger att vi vill spara resultatet i en TreeMap. Att nyckelvärdet blir en String och varje värde är en List<Double> kommer sig av *1 och *2. ) );

Av Teknocide
Skrivet av Wequ:

Jag försöker lista ut hur jag ska få ut ett medelvärde ur min values(objekt) i en treemap och presentera resultatet i en string array.

Weatherdata objektet har dessa egenskaper

public class WeatherData { LocalDate date; String time; String temp; String quality;

Det ser ut såhär i treemapen. Key är Datum + klockslag som string. Value är objektet (datum,klockslag,temp,kvalitet)
(Map<String,WeatherData>)

--------Key------- ----------Value------------- 1946-01-01 07:00:00 : 1946-01-01, 07:00:00, -1.8, G 1946-01-01 13:00:00 : 1946-01-01, 13:00:00, -1.0, G 1946-01-01 18:00:00 : 1946-01-01, 18:00:00, -1.9, G 1946-01-02 07:00:00 : 1946-01-02, 07:00:00, -1.7, G 1946-01-02 13:00:00 : 1946-01-02, 13:00:00, -0.2, G 1946-01-02 18:00:00 : 1946-01-02, 18:00:00, -1.3, G 1946-01-03 07:00:00 : 1946-01-03, 07:00:00, -1.0, G 1946-01-03 13:00:00 : 1946-01-03, 13:00:00, -0.1, G 1946-01-03 18:00:00 : 1946-01-03, 18:00:00, -1.2, G

I string arrayen så ska man endast se medeltemperaturen för varje datum, alltså ska den presenteras såhär:

1946-01-01: -1.56 1946-01-02: -1.06 1946-01-03: -0.76

Det jag försöker göra är att plocka ut alla values till en objekt array(objektList), men om objektet redan finns i arrayen vill jag enbart addera objektets temp till objektet som finns i arrayen. Jag vet att jag inte får ut medelvärde just nu, vill bara se om dom lyckas summeras ihop, får lista ut hur jag gör med medelvärde senare.

for (Map.Entry<String,WeatherData> entry : subMap.entrySet()) { WeatherData value = entry.getValue(); if(!objektList.contains(value.date)){ objektList.add(value); }else{ for(int i = 0;i<objektList.size();i++){ if(objektList.get(i).date.equals(value.date)){ objektList.get(i).temp += value.temp; } } } }

Sedan för jag över det som finns i objekt arrayen till en string arrayen för att få ut rätt utskrift

//Till string lista for(int i = 0; i < objektList.size();i++){ stringList.add(objektList.get(i).date.toString() +": " + objektList.get(i).temp); }

Men det ser ut såhär vid utskrift, alltså är det något jag missar när jag försöker överföra till objekt arrayen.

1946-01-01: -1.8 1946-01-01: -1.0 1946-01-01: -1.9 1946-01-02: -1.7 1946-01-02: -0.2 1946-01-02: -1.3 ...osv

Någon som kan få mig att förstå vad jag missar ? Är det kanske onödigt att överföra till en objekt array? Går det att genomföra beräkningarna redan i treemap på något sätt?

Om jag förstår dig rätt behöver du inte nycklarna från den ursprungliga TreeMap:en, utan kan jobba helt utifrån den LocalDate som sitter på varje värde? Om så är fallet kanske något sånt här kan fungera

TreeMap<String, Double> output = input.entrySet() .stream() .collect(Collectors.toMap( entry -> entry.getValue().date.toString(), entry -> Double.parseDouble(entry.getValue().temp), (tempSum, temp) -> tempSum + temp, () -> new TreeMap<>() ));

Detta ger dig en ny TreeMap<String, Double> där nyckeln är datumet utan klockslag och värdet är summan av alla ursprungsvärden på det datumet.

edit:
Du behöver så klart ha en lista på alla temperaturer för att kunna ta fram ett medelvärde. Här är en uppdaterad variant

TreeMap<String, List<Double>> output = input.entrySet() .stream() .collect(Collectors.toMap( entry -> entry.getValue().date.toString(), entry -> List.of(Double.parseDouble(entry.getValue().temp)), (temps, temp) -> Stream.of(temps, temp).flatMap(List::stream).collect(Collectors.toList()), () -> new TreeMap<>() ));

Av Teknocide
Skrivet av Zyces:

Som jag nämt tidigare så händer det att ett ord kan uttalas på två sätt, OM ordet är taget från ett utländskt ord.
Båda uttalen, [keks] och [çeks], är korrekta. Anledningen till variationen är att ordet har sitt ursprung i engelskans cake, som förstås uttalas med k. Som svenskt ord lyder kex däremot under svenskans uttalsregler, som säger att k normalt uttalas som tj-ljud framför mjuk eller främre vokal (e, i, y, ä, ö). Det uppstår därför en konflikt mellan två regelsystem.

Vet inte vad du menar med Stockholmare, jag är inte därifrån.

Mitt "Stockholmare" är i plural. Det var inte avsett för dig personligen; jag använde din kommentar—och undvek omedvetet "överflödigt" kontext—i ett försök att avgöra den mångåriga debatten över hur kex bör uttalas.

Av Teknocide
Skrivet av Zyces:

Förstår inte hur folk kan tycka detta är konstigt, det är svenska språket grundkurs.
"Vokalljuden kan delas in i hårda /a, o, u, å/ och mjuka vokaler /e, i, y, ä, ö/. Den indelningen har samband med att konsonanterna /g, k, sk/ framför de mjuka vokalerna blir mjuka, det vill säga /j, tj, sj/ -ljud."

Med andra ord heter det CHEX och inte KEX. Check mate, Stockholmare!

Av Teknocide

Jag tycker nya gubben ser ut som en smått hysterisk snuskhummer framför en datorskärm i ett nedsläckt rum...

Av Teknocide
Skrivet av Pake:

Nej man ska aldrig lagra filer i databasen. De kommer ta upp onödigt mycket utrymme i den. Lagra de lokalt.

Lite grovhugget svar. Varför skulle det vara fel att lagra filer i en databas?

Av Teknocide
Skrivet av Ernesto:

@Teknocide: Hela tråden handlar ju om dependency injection, så jag fann det ironiskt att den enda koden som postats var på 3 rader och två av dom använde inte dependency injection.

Det finns ingen motsättning i att använda dependency injection och att skapa instanser av klasser (med new). Som jag skrev ovan, dependency injection är att skicka med beroenden till beroende funktioner/metoder/konstruktorer. Enklare uttryckt: Att skicka argument till funktioner. Vare sig mer eller mindre

Även om man använder ramverk för att få tillgång till finesser likt Guices Injector#getInstance är det inte det enda man kan göra. Exempelvis används fortfarande new String för att skapa en sträng av en byte-array, new ArrayList<String>(), etc. i oändlighet. Att inte blir bunden till en specifik variant är liksom hela poängen.

Av Teknocide
Skrivet av Ernesto:

Lite otydlig kod, jag förstår inte riktigt problemet, annat än att på 3 rader kod gör du 2 st "new" vilket luktar som problem redan där. Nu är ju metoden (och klassen) hårt kopplad mot "FileHandler" och "CSVHandler", vilket kanske inte är ett problem men men.

Du får nog förklara lite tydligare

Varför skulle new på två av tre rader vara ett problem?

Av Teknocide
Skrivet av Sidde:

Det är väldigt vanligt i delsystem i större system skulle jag säga. Oavsett om det är legacy eller inte.
Se på alla projekt som är skrivna i C/C++ i opensource-världen. Allt hela OS, till databasservrar till webservrar till små utilities.
Varför skulle dessa vara skrivna i C eller C++?

Tror inte du ska lyssna så mycket på specifika youtubers dock. Datorindustrin är stor och har man aldrig rört sig i tex större miljöer så kanske man heller inte sett vad saker används till.

Java är dessutom enormt resurshungriga. Vi hade mängder med java-applikationsservrar redan för 10år sedan som hade 256GB RAM och mer till exempel. Det är inte ekonomiskt eller speciellt effektivt att använda java överallt.

256GB RAM? Mellanlagrade ni internet i minne?

Java är hungrigt men inte så hungrigt. Har kört webbservrar med databaskoppling på 64 MB—vilket i dagens mått mätt är rätt resonligt. Nu för tiden går det också att kompilera bytecode AOT med Graal, vilket jag hört ska dra ner minnesanvändningen ytterligare.

Av Teknocide

@heretic16: Jag föreslår att du struntar i IoC-ramverk tills du förstår hur konstruktorargument fungerar, och vad deras poäng är. Om du skriver kod som i ditt första exempel så gör du bara livet svårt för dig själv.

Av Teknocide
Skrivet av heretic16:

Jag har aldrig hållit på med dependency injection, men jag är tvungen att lära mig. Men det verkar vara så komplext och så mycket information så jag vet inte vart jag ska börja.

Dependency injection innebär att du skickar beroenden istället för att låta "den beroende delen" (en klasskonstruktor, en metod; i andra språk funktioner, moduler etc.) skapa eller leta efter dem själv.

Utan dependency injection:

class Korv { private final Bröd bröd; public Korv() { this.bröd = new Knäckebröd(); // beroendet skapas inuti klassen } } // användning: Korv korv = new Korv();

Med dependency injection:

class Korv { private final Bröd bröd; public Korv(Bröd bröd) { this.bröd = bröd; // beroendet skickas in av den som instansierar klassen } } // användning: Bröd bröd = new GlutenfrittBröd(); // GlutenfrittBröd ärver Bröd; Korv korv = new Korv(bröd);

Det är det hela.

Det Dagger, Guice, Spring DI etc. tillför är olika metodiker för att automagiskt göra precis det jag skrev i exemplet ovan.

Av Teknocide
Skrivet av robbankentor:

@heretic16:

Java är inte gratis för företag längre, man måste teckna ett enterprise avtal med oracel för att få köra Java runtime eller vad den heter. Priset ligger på 500:- per användare och år.

Det är ganska nytt och det har gjort att mitt företag har stoppat inköp av allt som kräver Java runtime. Det gäller även system med javaconsoler eller hårdvara med java buildt-in.

Så Java är dödsdömt på PC.

Detta stämmer helt enkelt inte. Oracle har ändrat sin lanseringsmodell och med ändringen följer också uppdaterade terms and services, som bland annat säger att Oracle tar betalt för uppdateringar till gamla versioner. Java (kompilator, standardbiblioteket etc.) är open source under GNU GPLv2 och det är fritt fram att kompilera, ändra, distribuera och använda bäst man vill. Utöver det finns det olika förpaketerade runtimes från bland annat IBM, Azul osv. under olika licensmodeller, ofta med kostnadsfria alternativ.

Det som kostar är att sitta kvar på en gammal, stängd version av Java och samtidigt "kräva" säkerhetsuppdateringar från exempelvis Oracle. Om man helt enkelt kör OpenJDK kostar det inget.

Skickades från m.sweclockers.com