Inlägg

Inlägg som Teknocide har skrivit i forumet
Av Teknocide
Skrivet av zaibuf:

Ni har samma ikon, blev förvirrad till vem jag svarade..
Den söker efter de efterfrågade filerna på din lokala hårddisk. Men ja, localhost är din dator.

Ska man vara tekniskt korrekt (den bästa formen av korrekt) "söker" datorn inte efter några "filer" alls. Den gör ett request till en adress. "localhost" är ett särskilt hostnamn som, när det slås upp, (vanligtvis) refererar tillbaka till ett mini-nätverk (127.0.0.1, eller ::1 i IPv6) som körs lokalt på samma dator.

Av Teknocide
Skrivet av Snillet71:

I mitt API där jag skickar data till servern hämtar jag även ett id som returneras i ett promise.
Hur kan jag sedan använda mig av detta id i react.js?
Jag får fram värdet i min console.log(data) men jag vill att idAdv får detta värde

fetch('http://localhost/reusesport/src/api/newadvertisment.php', { method: 'POST', body: JSON.stringify(data) }) .then(resp => resp.text()) .then(data => console.log(data)) .then(data => { this.setState({idAdv: data}); }) console.log(this.state.idAdv);

Den sista console.logen ger ingenting.

fetch ger dig en Promise. En Promise representerar en process som pågår i bakgrunden och kommer bli klar "senare". Tänk dig att du beställer mat genom Foodora: du vet att maten inte kommer stå på bordet så fort du placerat din beställning. Men din console.log förutsätter att maten redan står där (mer konkret, att din fetch redan har hänt och att this.setState(…) till följd av detta redan har körts.)

Promise låter dig arbeta med detta framtida värde — Promise heter promise för att det representerar ett löfte om ett framtida värde — genom .then, precis som du gör. Problem #2 i ditt exempel är raden med .then(data => console.log(data)), där du tappar värdet genom att skicka det till console.log: console.log returnerar nämligen inget värde, så på efterföljande rad kommer isAdv att sättas till undefined.

Av Teknocide
Skrivet av GreyWilk:

I deluttrycket [0]{1} ger [0] en matchgrupp med "tecknena" 0. {1} är en range-annotering som säger att föregående token ska repeteras en gång. Ett lättare sätt att skriva samma sak är 0

Av Teknocide
Skrivet av Dinoman:

Tack så mycket. Kristallklart.

Så detta skulle alltså innebära att man kan ha ett producerande system med (master data) som med hjälp av Kafka kan hålla information tillgänglig 24/7 utan att för den delen vara ett system som ligger uppe och är tillgänglig för massor av anrop 24/7?

Om du med "master data" menar meddelanden som systemet har producerat så skulle de finnas tillgängliga på Kafka under en eller flera topics, trots att systemet som producerade meddelandena inte är uppe och snurrar. Notera att Kafka inte är en databas eller ett "fönster" för att kika på data som finns i "master system".

Kanske är enklare med ett konkret exempel. Säg att du har en webbshop där du tar emot beställningar som ska faktureras och paketeras. Fakturan ska skickas ut med mejl och sedan ska en paketeringsinstruktion gå vidare till lagret.

System A: Tar emot beställning System B: Visar ordrar som ska paketeras och vart de ska skickas System C: Skickar mejl med faktura System A skriver ett meddelande: order-id: 42 beställare: kalle@torpet.se varor: hammare + spik adress: Torpvalla 12 34567 Sverige till topic "mottagna_beställningar" System B läser från "mottagna_beställningar" och visar datan på en skärm. När en lagerarbetare skickat iväg en order klickar hen på en knapp och ett meddelande: order-id: 42 status: levererad <beställare + varor osv.> skickas till topic "hanterade_ordrar" System C läser från "hanterade_ordrar" och skickar iväg ett mejl. Om mejlet går iväg skrivs ett meddelande: order-id: 42 till topic "utskickade_fakturor" System A kan läsa "hanterade_ordrar" och "utskickade_fakturor" för att se hur långt i förloppet en beställning har kommit.

Om systemet hade byggts med direktanrop behöver System A kontakta System B och lägga till en paketeringsförfrågan. Om System B är nere för underhåll måste System A avfärda hela beställningen ("Beställningen misslyckades, vi har tekniska problem"). Om System C av någon anledning inte är tillgängligt kan System B inte skicka ett direktmeddelande när allt är färdigpaketerat och man kan sålunda inte skicka beställningen på frakt, eller så får man skicka ut det ändå och hantera fakturautskicket manuellt.

Om System A gör direktanrop till System B och System C parallellt skulle det kunna uppstå en situation där en faktura skickats utan att lagret fått någon information om att beställningen ska paketeras. (ifall System B är nere och System C uppe)

Av Teknocide
Skrivet av Dinoman:

Tack för den förklaringen, mycket enkelt och bra.

Varför ska man då köra något som kafka istället för att t.ex. direktintegrera via API?

Direktanrop:

  • är riktade: Ett anrop går till en enskild mottagare. För att distribuera ett meddelande måste N anrop göras till N mottagare;

  • är synkrona: I anropskedjan A->B->C—där A, B och C är fristående program—väntar B på att C ska svara, och A väntar på att B(->C) ska svara. Långa anropskedjor ökar felkänsligheten då den yttersta anroparen blir påverkad av svar från efterföljande tjänster;

Meddelandesystem:

  • är oriktade: Det som skrivs till en topic kan läsas av andra program med tillgång till meddelandesystemet. Producenten kontrollerar inte konsumenten;

  • är asynkrona: A skriver till topic ATopic; B lyssnar på ATopic, behandlar datan och skriver till BTopic; C lyssnar på BTopic och skriver till CTopic; A läser från CTopic;

Ett meddelandesystem passar bra för kommunikation mellan program där man inte kan eller vill skapa täta beroenden mellan tjänster. Då enskilda program konsumerar meddelanden i sin egen takt minimeras risken att man råkar DDOS:a sig själv. Man kan ta ner en tjänst utan att meddelanden går förlorade: när den startar igen kan det ha trillat in nya meddelanden som den kan behandla. osv.

Nackdelen är att det inte alltid passar med asynkron kommunikation: Besökare på en webbplats vill troligtvis ha ett direkt svar—t ex en webbsida eller en bild på något gulligt djur—och inte ett meddelande i stil med "Servern behandlar ditt ärende. Gå till /dittsvar och ladda om tills det du efterfrågade är färdigställt"

Av Teknocide
Skrivet av Dinoman:

Mors.

Är det någon av er skarpa sinnen på forumet som kan förklara hur Apache Kafka fungerar på ett enkelt sätt? Mina kunskaper kring detta är i det närmaste obefintligt.

Tack på förhand.

Kafka är ett system som används för att program ska kunna dela med sig av information utan att för den sakens skull veta vilka andra program som skulle vilja ta del av informationen. En enhet information kallas "meddelande" och kategoriseras under ett ämne (i Kafkavärlden kallat "topic").

Ett program som delar information kallas "producer" och skriver som sagt till en topic, från vilken andra program ("consumers") sedan kan läsa informationen. Consumers håller själva koll på hur långt de har läst en topic, och raderar aldrig meddelanden till skillnad från klassiska kösystem. Detta innebär att nya consumers senare kan koppla upp sig mot samma topic och börja läsa meddelanden från start.

Av Teknocide

Ska verkligen metoden som tar emot en int returnera en int? Då formeln multiplicerar med 1.8 (9 / 5) är det troligt att du får decimaler även vid konvertering av celsius i heltal. Att kasta bort dessa decimaler bara för att du anropat med ett heltal låter konstigt. (Uppgiften är iofs rätt konstig i helhet, då vi konstaterat att du inte ens behöver ha en metod som tar emot int iom implicit konvertering av int till double)

Av Teknocide
Skrivet av Pamudas:

Precis som @snajk skriver ovan, använd frågetecknet för att enkelt hoppa över nullvärden.

Array.Sort(person, (x, y) => x.Namn?.CompareTo(y.Namn));

Eller om det är själva personen som kan vara null:

Array.Sort(person, (x, y) => x?.Namn.CompareTo(y.Namn));

Ser ut som det kommer krascha när y är null. Jag instämmer med tidigare talare: Varför ens behålla en massa nulls i en samling som ska sorteras?

Och #2: Även `x.Name?` kommer väl ge fel eftersom IComparer måste returnera en int men kommer returnera null där..

Av Teknocide
Skrivet av Bryal:

Polymorfism är något helt ortogonalt. Polymorfism, också kallat "generics" av vissa, är ett sätt att skriva en generell implementation av en funktion/metod/klass, och återanvända den för mer specialiserade instanser av typen. Ett exempel är Java klassen "ArrayList" som är polymorfisk över elementtypen. …

Nitpick: Arv (inheritance) och överlagring är det som brukar avses när man snackar om polymorfi i OOP. Generics/parametric polymorphism är ett bredare koncept som även återfinns i rent funktionella programmeringsspråk som Haskell

Av Teknocide
Skrivet av anon203363:

@Leedow:

Jag prövade att ändra om koden till följande, så som du föreslog;

public class APIKeyMessageHandlerMiddleware { private readonly ApplicationDbContext _db; public async Task<ActionResult<CompanyData>> ApiKeyToCheck(string GetCompanyApiKey) { CompanyData companyApiKey = await _db.Companydatas.SingleOrDefaultAsync(x => x.ApiKey == GetCompanyApiKey); return companyApiKey; } private RequestDelegate next; public APIKeyMessageHandlerMiddleware(RequestDelegate next) { this.next = next; } public async Task Invoke(HttpContext context) { bool validKey = false; var checkApiKeyExists = context.Request.Headers.ContainsKey("APIKey"); if (checkApiKeyExists) { var cd = ApiKeyToCheck(context.Request.Headers["APIKey"]); if (cd != null) { validKey = true; } .....

Vad som sker är att jag kan fortfarande hämta all data genom APIn i Postman, även utan att ange en API-nyckel.
Men när APIn dyker upp i browsern (när man kör debuggern) så får jag permission denied, och även om jag lägger till API-nyckeln i adressfältet får jag inte hämta någon data.

variabeln cd kommer alltid vara en Task<ActionResult<CompanyData>> där, även om nyckeln inte finns. Med andra ord aldrig null, vilket gör att du sätter validKey = true

Av Teknocide
Skrivet av improwise:

Sett till vad tråden handlar om (eller iaf borde) kan man väl konstatera att varken IDE eller val av Java/C# lär vara det avgörande här, samtliga alternativ är bra nog i sammanhanget.

Sant, jag snöar iväg ibland. Programmet ser helt ok ut. Det enda att anmärka på är väl att ASP.NET är rätt trist.

Av Teknocide
Skrivet av zaibuf:

C# står för över 50% av webbmarknaden. Sen är .NET core tillgängligt till alla platformar samt open source.
Som ny är det lättare att komma igång med C#, Javas olika IDEs har inget mot Visual Studio.

Skickades från m.sweclockers.com

Har svårt att tro att C# äger över 50 % av "webbmarknaden". Gissar på att merdelen fortfarande är PHP och javascript (exklusive node.js). Visual Studio funkar om man kör windows, annars är det Visual Studio Code som gäller, vilket inte riktigt är på samma nivå än även om det är bra. IntelliJ slår dock bägge. Detta från någon som suttit i både Visual Studio (med resharper) och IntelliJ.

Är lite sugen på att leka med .NET Core, helst då med F# eller något liknande. Det finns roligare språk än C#.

Av Teknocide

Plus för att ni säger "webbplats"
Minus för att det är Loopia som sponsrar. Sämsta hotellet genom tiderna..

Av Teknocide
Skrivet av burton666:

Jag håller på med ett lite program som ska läsa och skriva en massa olika data till en databas. Hur gör jag enklast för att skapa ett snyggt GUI så enkelt som möjligt. Det ska bara vara lite input-fält, drop-down lists, knappar och något sätt att visa senast inmatade data på halva skärmen typ som ett exel-ark

Jag tänkte först använda jframes men allt jag gör ser ut som skit. Jag tänkte sedan att man kunde använda typ spark och skapa en enkel html-sida där man matar in och listar all data som man sedan kan snygga till med lite css. Men finns det något snabbare smidigare sätt att åstakomma samma sak?

Snyggast blir det nog med JavaFX, som går att bygga ihop med JavaFX Scene Builder

Av Teknocide
Skrivet av heretic16:

Tack! Jag har hittat en bra film som visar enkelt hur två java program kan tala med varandra.
Då var ETT problem avklarat.

Ingen som vet ett bra sätt för att kommunicera med GNU octave via Java? Jag vill alltså använda mig utav GNU octave's funktioner. Normalt kan man endast ropa från Octave -> Java, inte tvärt om.

Jag har många beräkningar i Octave. Glöm Julia...segt.

Edit:
Tror ni Sockets är rätt i detta fall, trots det är Octave också?
http://wiki.octave.org/Sockets_package

Varför vill du köra ett annat programmeringsspråk (GNU Octave) för att läsa ut temperaturvärdena?

Av Teknocide
Skrivet av Zcenicx:

Rättelse...
There is no emotion, there is peace.
There is no ignorance, there is knowledge.
There is no passion, there is serenity.
There is no chaos, there is harmony.
...gäller bara utveckling i backend.

Frontend är, och det vet alla som någonsin arbetat med det, fyllt av känslor, ignorans, passioner och renodlat kaos.

Tycker allt backend innehåller rätt mycket känslor och kaos det med. En kundintegration? Vi lägger in den i lönemodulen; den innehåller redan nästan allt annat.

Av Teknocide
Skrivet av jclr:

Problemet är att så fort man börjar blanda in sidoeffekter på några ställen så tappar man tyvärr många av fördelarna. Jag programmerar inte i java men testade att göra den här uppgiften med bara referentiellt transparenta funktioner för att se ungefär hur det skulle se ut.

Alla funktioner i programlogiken är generiska i F. tex <F> F<Integer> rentInput(Monad<F> M, Console<F> C) som frågar efter hyran ger tillbaka F<Integer> där F kan vara vilken typkonstruktör som helst så länge man kan definera en Monad<F> och Console<F>. Monad<F>/Console<F> är vilka egenskaper funktionen behöver tillgång till. Monad<F> för programflöde och Console<F> för in/utmatning. Funktionerna (sqmInput/rentInput/program) i programlogiken är bara en beskrivning av vad man vill göra. För att verkligen få de att göra någon behöver man en Monad/Console för en viss F.

Monad/Console för IO sparar en kedja av funktionsanrop som först körs när man anropar .unsafeRunSync() i slutet av programmet och då läser/skriver via println/readLine.
Monad/Console för State tar instället en TestData(List<String> in, List<String out). in innehåller inmatning man vill simulera/testa och out kommer innehålla utmatningen från programmet.

Så visst går det att programmera funktionellt i java men speciellt smidigt är det inte.

class Unit { public final static Unit Unit = new Unit(); private Unit() {} } interface Hkt<F, A> {} interface Hkt2<F, A, B> extends Hkt<Hkt<F, A>, B> {} interface Monad<F> { <A> Hkt<F, A> pure(A a); <A, B> Hkt<F, B> flatMap(Hkt<F, A> fa, Function<A, Hkt<F, B>> f); default <A, B> Hkt<F, B> flatMap_(Hkt<F, A> fa, Hkt<F, B> fb) { return flatMap(fa, dummy -> fb); } default <A, B> Hkt<F, B> map(Hkt<F, A> fa, Function<A, B> f) { return flatMap(fa, f.andThen(this::pure)); } } abstract class IO<A> implements Hkt<IO.m, A> { static final class m {} static <A> IO<A> narrowK(Hkt<IO.m, A> Fa) { return (IO<A>) Fa; } public static final IOMonad monad = new IOMonad() {}; public static final IOConsole console = new IOConsole() {}; abstract A unsafeRunSync(); } interface IOMonad extends Monad<IO.m> { @Override default <A> IO<A> pure(A a) { return new IO<>() { @Override A unsafeRunSync() { return a; } }; } @Override default <A, B> IO<B> flatMap(Hkt<IO.m, A> fa, Function<A, Hkt<IO.m, B>> f) { return new IO<>() { @Override B unsafeRunSync() { return ((IO<B>) f.apply(((IO<A>) fa).unsafeRunSync())).unsafeRunSync(); } }; } } interface Console<F> { Hkt<F, Unit> putStrLn(String s); Hkt<F, String> getStrLn(); } interface IOConsole extends Console<IO.m> { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); default IO<Unit> putStrLn(String s) { return new IO<>() { @Override Unit unsafeRunSync() { System.out.println(s); return Unit; } }; } default IO<String> getStrLn() { return new IO<>() { @Override String unsafeRunSync() { try { return in.readLine(); } catch (IOException e) { throw new RuntimeException(); } } }; } } class Tuple<A, B> { public final A _1; public final B _2; Tuple(A a, B b) { _1 = a; _2 = b; } } class State<S, A> implements Hkt2<State.m, S, A> { public static final class m {} static <S, A> State<S, A> narrowK(Hkt<Hkt<State.m, S>, A> Fa) { return (State<S, A>) Fa; } public static final StateMonad monad = new StateMonad() {}; public static final StateConsole console = new StateConsole() {}; public final Function<S, Tuple<S, A>> run; State(Function<S, Tuple<S, A>> run) { this.run = run; } public static <S, A> State<S, A> pure(A a) { return new State<>(s -> new Tuple<>(s, a)); } public static <S> State<S, Unit> set(S s) { return new State<>(dummy -> new Tuple<>(s, Unit)); } public static <S> State<S, S> get() { return new State<>(s -> new Tuple<>(s, s)); } public static <S> State<S, Unit> modify(Function<S, S> f) { return new State<>(s -> new Tuple<>(f.apply(s), Unit)); } public <B> State<S, B> flatMap(Function<A, State<S, B>> f) { return new State<>(s -> { var tmp = run.apply(s); return f.apply(tmp._2).run.apply(tmp._1); }); } public <B> State<S, B> map(Function<A, B> f) { return flatMap(a -> pure(f.apply(a))); } } class TestData { public final List<String> in; public final List<String> out; TestData(List<String> in, List<String> out) { this.in = in; this.out = out; } } interface StateConsole extends Console<Hkt<State.m, TestData>> { @Override default State<TestData, Unit> putStrLn(String s) { return State.modify(td -> { var tdOut = new ArrayList<>(td.out); tdOut.add(s); return new TestData(td.in, List.copyOf(tdOut)); }); } @Override default State<TestData, String> getStrLn() { return new State<>(td -> { var tdIn = new ArrayList<>(td.in); var head = tdIn.remove(0); var tdOut = new ArrayList<>(td.out); tdOut.add("(User input: " + head + ")"); return new Tuple<>(new TestData(List.copyOf(tdIn), List.copyOf(tdOut)), head); }); } } interface StateMonad<S> extends Monad<Hkt<State.m, S>> { @Override default <A> State<S, A> pure(A a) { return State.pure(a); } @Override default <A, B> State<S, B> flatMap(Hkt<Hkt<State.m, S>, A> fa, Function<A, Hkt<Hkt<State.m, S>, B>> f) { return ((State<S, A>) fa).flatMap(a -> (State<S, B>) f.apply(a)); } } public class Main { private static Optional<Integer> parseInt(String s) { try { return Optional.of(Integer.parseInt(s)); } catch (NumberFormatException e) { return Optional.empty(); } } private static <A, B> B fold(Optional<A> oa, Supplier<B> empty, Function<A, B> present) { if(oa.isPresent()) return present.apply(oa.get()); else return empty.get(); } private static <F> Hkt<F, Integer> rentInput(Monad<F> M, Console<F> C) { return M.flatMap_(C.putStrLn("Ange din månadshyra:"), M.flatMap(C.getStrLn(), rentStr -> fold(parseInt(rentStr), () -> M.flatMap_(C.putStrLn("Du måste ange månadshyran som ett heltal"), rentInput(M, C)), rent -> rent < 0 ? M.flatMap_(C.putStrLn("Hyran kan inte vara negativ"), rentInput(M, C)) : M.pure(rent)))); } private static <F> Hkt<F, Integer> sqmInput(Monad<F> M, Console<F> C) { return M.flatMap_(C.putStrLn("Ange lägenhetens storlek i kvadratmeter:"), M.flatMap(C.getStrLn(), sqmStr -> fold(parseInt(sqmStr), () -> M.flatMap_(C.putStrLn("Du måste ange lägenhetens storlek som ett heltal"), sqmInput(M, C)), sqm -> sqm <= 0 ? M.flatMap_(C.putStrLn("Lägenhetens storlek måste vara över 0 kvm"), sqmInput(M, C)) : M.pure(sqm)))); } private static String rentPerSqm(int rent, int sqm) { var formatter = new DecimalFormat("0.##"); return formatter.format((double) rent / sqm); } private static <F> Hkt<F, Unit> program(Monad<F> M, Console<F> C) { return M.flatMap_(C.putStrLn("Ange ditt namn:"), M.flatMap(M.map(C.getStrLn(), String::toUpperCase), name -> M.flatMap(rentInput(M, C), rent -> M.flatMap(sqmInput(M, C), sqm -> C.putStrLn(name + " du betalar " + rentPerSqm(rent, sqm) + "kr per kvadratmeter i månaden."))))); } public static void main(String[] args) { IO<Unit> program1 = IO.narrowK(program(IO.monad, IO.console)); program1.unsafeRunSync(); State<TestData, Unit> program2 = State.narrowK(program(State.monad, State.console)); program2.run.apply(new TestData(List.of("John Doe", "2500kr", "-100", "4500", "0m2", "0", "55"), List.of()))._1.out.forEach(System.out::println); } }

Du råkar inte koda Scala till vardags?

Av Teknocide

@Terrell: Integer betyder bokstavligen "heltal" så att de inte kan innehålla decimaler är rätt givet

Av Teknocide
Skrivet av heretic16:

Satan då?
Jag löste problemet. Jag hade helt glömt bort att datatyper förstörs inte. Nu har jag löst problemet. Tack!

Jag undrade mer vad problemet med att skapa nya listor var. Det är trots allt flera listor du vill skapa i "list-listan"

Av Teknocide
Skrivet av heretic16:

Okej. Så jag måste initsalisera en ny item för varje gång? Då blir datatypes ej förstörd?

Attans!!!

Skickades från m.sweclockers.com

Vaddå "Attans"?
Datatyper förstörs inte; datatypen är ArrayList<String> oavsett om du tömmer objektet eller inte. Och rent praktiskt instansierar du inte "item", du instansierar en ArrayList<String>.