Ciao, e benvenuto tra i CodeBrothers! 🦾 Ebbene sì, qui troverai un corso completo di Java in italiano a partire dagli argomenti più basilari fino ai concetti più avanzati (Spring Boot, Jenkins, AWS..) L'obiettivo di questo canale è farti imparare una materia difficile facendoti prima di tutto divertire! Ecco perchè durante le spiegazioni troverai spesso immagini magari bizzarre o piccoli spezzoni di video che mi passano per la testa mentre faccio le riprese 😄 Su CodeBrothers non imparerai solo una tecnologia ma un vero e proprio lavoro! Hai capito proprio bene, infatti prima della fine del corso sarai pronto per sostenere con successo la maggior parte dei colloqui aziendali. E ricordati che i CodeBROthers non siamo solo noi che giriamo i video, lo saranno tutti coloro che avranno il piacere di unirsi alla nostra piccola community di BRO-grammatori quindi anche tu! 🤝 Quindi cosa aspetti? Unisciti a noi! Se non sei ancora convinto non ti rimane che cliccare sui nostri video. 🧐
@@CodeBrothers Diciamo che ho le idee più chiare dove andare ad effettuare le operazioni di gestione con wait, notify e notifyall, per garantire quindi la mutua esclusione dei Thread. Prima facevo confusione, ma ora ho compreso che principalmente, nella gestione della concorrenza di una classe, devo andare ad operare nella classe monitor, in modotale da gestirla. Poi, sempre in merito a dubbi che avevo, io mi sento più confident ad utilizzare le synchronized non dell'intero blocco ma solo di una porzione del codice, quindi anche in questo caso ho avuto una piccola conferma. L'unica mia perplessità riguarda ad esempio l'utilizzo dei semafori al posto delle wait e notify, e cercare di non far andare in deadlock/starvation il programma, ma quantomeno di questa parte mi sono tolto un bel dubbio
@@mattiasindoni4461 siamo veramente felici di sentirtelo dire poiché questa parte è poco conosciuta nonostante sia fondamentale e pian piano sta venendo scoperta ☀️ Giusto a scanso di equivoci, cosa intendi che andrai ad agire sulla classe monitor? (Ogni object possiede wait e notify) Infine magari per darti una dritta i semafori sono per situazioni un po' più generiche e facili da usare, i metodi notify and wait invece per ottenere un controllo a livello molto più basso e sono un po' più complessi 🦀
@@willjean3223 WillJean grazie di cuore perché i commenti come il tuo sono ciò che ci fanno andare avanti! 🙏 Nel tempo abbiamo cercato di migliorare i video il più possibile, facci sapere, se vorrai, che ne pensi degli ultimi. Grazie e buon coding ☀️
@@allanhughes4808 ciao Allan! Abbiamo appena finito di pubblicare una serie completa di 11 episodi dove facciamo vedere ogni singolo passaggio per creare una app completa! Dacci un'occhiata e facci sapere che ne pensi :)
bro, mi spieghi perché quando vado su offline resources -2x inserisco il link (che é corretto, tanté che me lo apre e mi fa vedere la foto di Super Mario) clicco sulla rotellina per ricarivare il gioco e non accade niente per favore. Ti prego dammi una spiegazione logica e una soluzione per avere lo stesso lo sfondo di Super Mario😢. Grazie mille.
Ehilà Giuseppe! Incolla questo nella console: document.getElementById('offline-resources-1x').src='chromedino.com/assets/offline-sprite-2x-mario.png';document.getElementById('offline-resources-2x').src='chromedino.com/assets/offline-sprite-2x-mario.png'; Buon divertimento :)
@@giuseppemelchiorri7212 prova a controllare bene se incolli correttamente tutto o se stai utilizzando una versione di Chrome stabile perché l'ho appena fatto e mi funziona :(
Il link mi si apre mostrando l'immagine di Super Mario, ma quando lo incollo su offline resources -2x non succede niente, mi spieghi perché? Il link é giusto perché me lo apre!
Ciao, seguo con piacere i tuoi video e hai una capacità nel semplificare i concetti davvero assurda. Avrei una domanda da farti, se ho acquisito dimestichezza con Java BASIC, quindi tipizzazione, oop, liste e via dicendo, a cosa devo approcciare per poter arrivare a utilizzare il framework Spring? Il fatto è che il mondo Java è così esteso che non so nemmeno dove mettere le mani, ho provato a vedere un po di JEE, però la versione Enterprise così su due piedi non è che si capisca molto. Ti ringrazio in anticipo. Continua con i tuoi video, che sono fantastici 😉💪🏻
Ciaooo Admaiora!! Il tuo commento ci fa ricordare perchè abbiamo creato il canale, siamo entusiasti di essere riusciti a dare una mano con questa serie un po' più diversa dal solito.. :D Spring è proprio il passo successivo allo studio di Java, infatti anche sul canale arriverà quando finiremo tutte le basi. Intanto come sempre siamo disponibili in privato se hai bisogno di una mano o di un percorso ad hoc ;) Per rispondere alla tua domanda però ti consigliamo prima di formarti per bene su tutta una serie di concetti FONDAMENTALI che fanno da contorno a Spring, altrimenti non ti spiegherai mai tantissime cose quando ci lavorerai e finirai comunque per doverle studiare, quindi tanto vale...farle subito com'è giusto che sia ^_^ Mi spiego con una breve lista di argomenti da studiare un poco che ti permetterà di comprendere Spring e di lavorarci adeguatamente: - servlet container (tomcat) - come funzionano le servlet e i filtri e il servlet context - protocollo http - cos'è JSON e perchè e come si usa - cos'è serializzazione e deserializzazione - networking in generale - interazione base con database - cos'è un ORM - basi di JPA - come funziona l'autenticazione base e basata su cookie - conoscere xml - conoscere maven e il pom.xml - sapere come funzionano i gestori di dipendenze e cosa sono le dipendenze transitive - cos'è il pattern MVC - cos'è la dependency injection - come funzionano i file di properties Facci sapere se è tutto chiaro e come sempre buon coding! :D
io preferisco questa modalità, non quella da zero. si risparmia tempo, viene più breve il tutorial e si capisce lo stesso. Comunque, io avrei implementato il metodo isAlreadyPresent facendo un check non solo sul nome, possiamo avere infatti due titoli uguali ma diverse edizioni e pesi diversi, quindi sovrascrivendo public boolean equals(Object obj) e public int hashCode(), sui campi nome e peso, anche per ricordare come vanno fatte queste @Override. Non voglio assolutamente essere pedante, ma negli esami di ingegneria queste cose le vogliono vedere, anzi, sono sicuro che 9 professori su 10 ti fanno notare questo punto, meglio giocare d'anticipo :D
Ciao ngald! Grazie mille del commento 😄 Pian piano questa cosa l'abbiamo capita e i video attuali sono tanto più corti e sintetizzati, con audio migliore effetti e musiche diverse. Ci piacerebbe molto un tuo parere su qualcuno degli ultimi pubblicati se hai tempo, grazie in ogni caso!
la nuova versione free (che è basata sulla 4) dice: Sì, puoi convertire l'implementazione anonima del Consumer in una lambda senza problemi. Tuttavia, devi fare attenzione al contesto del synchronized, poiché l'uso di this cambierà nel contesto delle lambda. Ecco come fare: public void printConsumer() { consumePizza(o -> { synchronized (printConsumer.this) { System.out.println("Mi sto sincronizzando!"); } }); } In questo caso, usi printConsumer.this per mantenere il riferimento corretto all'oggetto esterno all'interno del blocco synchronized.
ciao Michele, riguardo all'esempio iniziale e finale, ma come è possibile che sposta r1 = y su x = 1, se hai detto che sono in relazione di hb, e quindi devono avvenire secondo il po??
Ciao Alex! Bella domanda e complimenti per aver visto anche questo argomento ^_^ come ti è sembrato? Ci piacerebbe tanto un tuo feedback giunto a questo punto del percorso :D Per rispondere alla tua domanda invece: è vero che son in relazione di HB e sono anche in PO, tuttavia io posso leggere anche una qualunque write NON in relazione di HB. Quindi posso sia leggere l'1 che lo 0. Proprio perchè posso leggere ciò che voglio per memory model, al compilatore è permesso di riordinare perchè tanto all'interno di ogni singolo Thread, quei due statement continuerebbero a dare lo stesso comportamento e continuerebbero a sembrare scritti secondo il PO.
@@CodeBrothers nulla da dire su come avete fatto il video, non si può cercare di spiegarlo meglio. L'argomento va un po' digerito prima. Per questo la mia domanda. Ma, quindi, la relazione di hb non è un vincolo a priori? Cioè, se leggo un dato valore, so che c'è quel vincolo, altrimenti no? Riformulo: come faccio a capire che c'è un vincolo di hb? lo devo sapere come dato, o lo devo inferire dall'esecuzione? me lo deve dire qualcuno? dove? quando? XD
@@alexdelarge1508 eheh, capisco perfettamente il tuo dubbio ed è proprio per questo che l'argomento è così complesso. Il termine "happens before" poi non aiuta a nostro avviso 😃Per capire questo esempio concentrati sul fatto che le due istruzioni di cui stai parlando (x=1 e r1=y) sono sì in HB ma quello che dice la relazione di HB è che il programma deve comportarsi per l'osservatore COME SE le due istruzioni si fossero eseguite esattamente nell'ordine definito dalla relazione di HB. Il "come se" non l'abbiamo messo in CAPS per caso, vogliamo proprio sottolineare il fatto che non è importante che si eseguano veramente in quell'ordine, ma che sembri che sia successo. Queste 2 istruzioni ( x=1 e r1=y) non hanno ALCUNA relazione di HB nei confronti delle altre, quindi non è importante che si comportino in un certo ordine nei confronti di istruzioni presenti in altri thread, l'unica relazione che esiste è solo tra quelle due istruzioni. Quindi se isoli il problema a solo quelle 2 istruzioni che cosa ti cambia come osservatore esterno se dietro le quinte il processore esegue: - r1=y E POI x=1 oppure - x=1 E POI r1=y niente, perchè dal punto di vista di queste due istruzioni, nessuna impatta l'altra. Quindi qualsiasi sia l'ordine di esecuzione reale dietro le quinte tu puoi assumere che si siano sempre eseguite secondo l'ordine di HB (anche se non è vero), per il semplice fatto che non è dimostrabile il contrario. Tu potresti dire che però vedendo i risultati delle interazioni con l'altro thread noti che l'ordine di esecuzione non è quello stabilito dall'HB, però in questo caso questo aspetto non conta, perché con le altre azioni non hai alcuna relazione, quindi è normale che non puoi farci assunzioni. Proprio perché non puoi fare assunzioni rispetto alle esecuzioni delle altre operazioni la relazione di HB specifica che una lettura potrebbe leggere O l'ultima scrittura in HB rispetto a lei OPPURE una scrittura totalmente casuale che non ha relazioni di HB. Quando nel thread 1 (quello a sinistra) leggi il valore di Y potresti leggere lo zero oppure il valore 1, proprio perché il valore 1 non ha relazioni di HB con queste due istruzioni, quindi potrebbe essere stato scritto in memoria oppure no. Quando gli sviluppatori di Java hanno scritto il compilatore e la JVM si sono solo accertati di rispettare le regole descritte nel memory model, anche se delle volte possono sembrare controintuitive 😅 e la parte difficile per loro è stato far rispettare queste regole per ogni architettura hardware che ha le sue peculiarità... quindi su architetture diverse hai motivi diversi per il quale potresti leggere 1 o 0, ma indipendentemente dai motivi la cosa importante è che quello che capita sia coerente con il JMM. E' venuto un papiro ma spero sia più chiaro ora ahaha
@alexdelarge1508 p.s. riguardo al feedback di cui parlavamo prima, lo intendavamo riguardo a tutto il corso fino a questo video (visto che sei uno dei pochi eletti che ha seguito ogni singola lezione 🤣), non specifico su questo video. È abbastanza difficile raccogliere feedback, quindi volevamo cogliere l'occasione per chiederti cosa ti è piaciuto/non ti è piaciuto del corso fino a questo punto e cosa miglioreresti. Quando hai un attimo di tempo ci farebbe piacere se ci mandi una tua opinione via mail a ytcodebrothers@gmail.com Ciao e alla prossima! 👋
@@CodeBrothers grazie intanto del papiro che mi ha finalmente chiarito il concetto. mi mancano da vedere pochi altri video e poi, senz'altro, vi manderò un mio parere
Ciao Luigi! Se intendi nella mia ItemFacade, mi inietto il repository mettendolo nel costruttore e non mi serve quindi fare field injection con @Autowired che tra l'altro è una brutta pratica, ecco perché in questa serie non ne vedrai nemmeno uno 🖖😎
@@CodeBrothers tutto xD non ho studiato i thread, quindi questo flusso di informazioni mi ha stordito. L'ho visto due volte e, la seconda visione, ha chiarito tutto :D
@@alexdelarge1508 Mhh capisco, grazie intanto del feedback! Giusto per capire, avevi visto anche le altre puntate sui thread? Perchè davano un po' di contesto.. Comunque dai se vedendola due volte hai capito poi tutto, mezz'ora per questo argomento non è male xD Questo argomento purtroppo è INFINITO, se non premevo un po' l'acceleratore avremmo finito col rimanerci mesi (cosa che già sta succedendo infatti.. x_x )
Argomento complesso ma spiegato, come sempre, molto bene. A mio avviso bisognava citare l'uso delle bounded wildcards legate ai tipi parametrici delle interfacce Comparable e Comparator, che si vedono molto spesso e magari uno non capisce perché sia meglio scrivere Comparator<? super T> invece di <T> e basta (colgo l'occasione per suggerirvi di usarlo e spiegarlo in qualche esercizio che svolgete). In realtà, dopo questo tutorial, si è in grado di capire le motivazioni, ma magari sarebbe stato utile a più di qualcuno trattare per bene questa specifica situazione, perché sono domande che i prof fanno spesso. Non è una critica, anzi, in 40 minuti avete spiegato cose che richiedono ore per essere studiate. Oltre l'umanamente possibile :D
Grazie come sempre dei commenti utili Alex! Essendo autodidatta in informatica purtroppo non ho idea di cosa chiedano i Prof però se mi dai qualche spunto posso provare a vedere di dedicare un video a tal proposito ^_^ D'altronde il nostro obiettivo è quello di aiutare più possibile con problemi reali quindi ben venga! ps: non farti problemi, le critiche se costruttive sono assolutamente ben accette! pps: complimenti infiniti per esserti visto questo mega video e la costanza soprattutto o_ò credo che da quando abbiamo aperto il canale sei l'unico che si sta vedendo ogni singolo video xD
@@CodeBrothers Come sempre grazie a voi. Quello che mi piacerebbe fosse approfondito (anche senza un video dedicato, ma magari in un video di svolgimento di un esercizio o esame) è l'ereditarietà dei metodi e quindi, come dicevo prima, il perché sia bene usare <? super T> quando si definisce un tipo che deve essere comparato. Ad esempio: Ho la classe "Bottiglia", e la sottoclasse "BottigliaDiVino" che estende "Bottiglia". La classe Bottiglia ha il field "capacity" e voglio che le bottiglie siano ordinate in base alla loro capacità. Supponiamo che Bottiglia realizzi l'interfaccia Comparable<Bottiglia>. Se scrivo un metodo sort del tipo: public static <T extends Comparable<T>> T sort(List<T> bottles), avrei un problema: BottigliaDiVino realizzerà anch'essa Comparable<Bottiglia>, e NON Comparable<BottigliaDiVino>. Quindi, se si vuole usare il metodo sort anche con una lista di tipo BottigliaDiVino, allora il tipo che specifica il parametro dell'interfaccia Comparable deve essere qualsiasi supertipo del tipo dell'elemento dell'array: public static <T extends Comparable<? super T>> T sort(List<T> bottles). Alla fine l'ho spiegato io xD, però voi siete molto più bravi nella spiegazione e nell'aggiungere esempi e casi d'uso e nello snocciolare bene le questioni, per questo vi chiedo, quando e se ne avrete il tempo, di approfondire questo e di mostrarlo in un video :) Grazie!
ciao Michele, a 17:35 il compilatore ti dice che hai due metodi con la stessa firma (vogliono Integer) in Lontra, ma, quando vai nella classe Lontra (17:45), solo V estende Integer. È un errore nel montaggio? Non dovresti avere un metodo che vuole Object e uno che vuole Integer?
Ciao Alex! No nessun taglio o errore nel montaggio tranquillo xD Poichè ho una Lontra<Integer, Integer> la mia K è un Integer e quindi A COMPILE-TIME Java, il compilatore e anche l'IDE quindi si aspettano di ricevere ciò che effettivamente hai scritto come argomento (e quindi Integer). Capisco il tuo dubbio perchè a RUNTIME in realtà avrei un Object e quindi avrei due setter con firme diverse, intendevi questo giusto? 🥸 ps: giusto per completezza anche se scrivo Lontra<Integer, Integer> questa verrà compilata con un metodo che accetterà Object e uno Integer. L'errore che vedi è una cosa a compile-time relativa al concetto di early-binding. Insomma non sa chi chiamare visto che appaiono uguali xD
Ciao Razeft! Farò del mio meglio 😄 Ovviamente non ci potremo dilungare troppo su ogni concetto poiché diciamo che è più una serie "pratica" che "teorica" come lo sono tutti gli altri video ma tu in caso se hai domande non esitare! Intanto domani piccolo spoiler, uscirà già la continuazione su come implementare il Mapper utilizzando Mapstruct ;)
@@CodeBrothers grazie mille, comunque non è un problema sono una persona che apprende molto di più facendo le cose, quindi anche se molto pratica come serie non è un problema
@@razeft ci fa un sacco piacere sentirtelo dire! Perché è la prima serie in cui non spieghiamo ogni dettaglio ma ci concentriamo più sul mostrare, così da dare una traccia a chi con queste cose deve effettivamente lavorarci e non sa proprio da dove partire 💪
Diciamo che la questione è un po' controversa, a me piace metterla in maiuscolo però in tanti, quando si tratta di variabili locali (si chiama variabile anche se il valore non cambia in Java, poi va bene che lo raggiungi con static final ma è un altro discorso..non esiste il tipo "const") sostengono che si metta in camel case con il final.. punti di vista 🖖
@@CodeBrothers io comunque trovo sensato questo stile. Nel libro di Horstmann si legge: "Molti programmatori usano per le costanti (cioè per le variabili final) nomi con tutte le lettere maiuscole, come NICKEL_VALUE, perché così si distinguono facilmente dalle variabili vere e proprie, i cui nomi hanno lettere in maggior parte minuscole. Anche in questo libro useremo questa convenzione, ma è soltanto un buono stile di programmazione, non un requisito del linguaggio Java: il compilatore non protesterà se date a una variabile final un nome con lettere minuscole."
@@alexdelarge1508 Team Horstmann presente! 🙌 Purtroppo non ci sono regole per ste cose anche se a mio avviso dovrebbero, migliorerebbe un sacco la leggibilità
16:40 Giusto perché è la correzione di un esame universitario: che succede se l'utente inserisce solo uno 0? Nel System out rimane una divisione per 0... Il prof ci tirerebbe le orecchie :D
@@CodeBrothers pensavo anch'io che lanciasse un'eccezione, invece il programma si esegue normalmente, solo che mi stampa: "Media dei quadrati: NaN". Se avessimo usato degli int ci sarebbe stata l'eccezione, ma con double si produce il valore speciale "Not a Number" o "Infinity" se il numeratore è valorizzato. Giusto per completezza :) Grazie mille ancora per questi video. Quando una lezione sugli stream che tanto utilizzi? :D
@@alexdelarge1508 ah ma che figata! Così a occhio dal cellulare pensavo quella eccezione 🤣 evidentemente a suo tempo ci avevo pensato e l'avevo provata, comunque in ogni caso guardandolo adesso avrei messo un check nel caso si dividesse per zero così da dare almeno un risultato più normale e "parlante" diciamo :')
@@alexdelarge1508 comunque per rispondere all'altra domanda, vorremmo cominciare tutta una serie sui metodi di stream, giusto il tempo di finire queste ultimissime cose sui Threads, far uscire questa miniserie di Spring ed Angular in contemporanea e poi credo proprio partiremo con quelli 😎
Ciao SamSung!! Siamo felici che questo format sia piaciuto anche perchè non è stato easy, vedremo di far uscire in settimana almeno una piccola continuazione allora :)
Super interessante! Proprio in questi giorni sono entrato in un'azienda e come formazione sto creando un'app da 0 (solo BE) utilizzando esattamente questi concetti. Sto utilizzando anche Docker, Liquibase e Mapstruct, quindi sará interessantissimo vedere nello specifico come queste cose funzionino, anche perché arrivo da soli due corsi di programmazione e tante cose (come Mapstruct) non le ho mai viste e quindi le sto utilizzando un po' al buio. Comunque io ed un mio collega abbiamo delle task da eseguire, utilizzare Git e simuleremo proprio un reale ambiente di lavoro! Questa serie di video arriva proprio con un tempismo perfetto :')
Ciao Nico!! Ma che figata siamo gasati anche noi per te adesso xD Intanto complimenti per la tua nuova posizione, non è affatto facile ritrovarsi già immersi in un mare di concetti arrivando da tanta teoria.. Magari vediamo di far uscire già venerdì la seconda parte in modo tale da poterti venire incontro con Mapstruct almeno ^_^ Facci sapere come procede e se ti trovi con i concetti spiegati, nel caso facci pure domande nei commenti così vedremo di indirizzarti al meglio 😄 In bocca al lupo e buon coding intanto!
Ultimissimo commento giuro! Io odio un po' postman perché è un'app ibrida creata con react quindi grande 100mb .. esistono valide alternative tra le quali dei plugin del browser.. andando su Chrome web store e cercando appunto Portman come secondo risultato della ricerca esce Tab postman.. penso si una validissima alternativa.. poi non è l'unica estensione.. addirittura esiste anche postwoman .. che però è localizzata temo solo in cinese ed io non col cinese ho qualche problemino 😂
Ragazzi gran bella idea! Unico appunto, secondo me ci sono alcuni argomenti di base che se spiegati così velocemente non vengono effettivamente capiti da qualcuno che non ha le basi, ma semplicemente copiate e incollate. Ci vorrebbe forse una serie di video in cui viene affrontato git, database, struttura dei config ecc, e spiegare più nello specifico determinati concetti. Personalmente ho le basi ma comunque la parte di configurazione di un progetto se spiegata così velocemente non mi lascia qualcosa, non mi sento di aver appreso, ma solo ricopiato
Ciao Luigi e ben risentito!! Prima di tutto vogliamo rassicurarti: spiegheremo passo passo anche tutti gli argomenti da te citati ;) Per il resto capisco pienamente, era anche il nostro pensiero: come detto nel video infatti stiamo cercando un po' di prendere le misure e abbiamo bisogno anche di sentire qualcuno nei commenti poiché siamo 2700+ iscritti e tutti hanno preferenze ed esigenze diverse... Accontentare ogni CodeBrother non credo sarà possibile, abbiamo quindi deciso di dedicare questa serie solo ad una fascia ben precisa: tutti coloro che ci chiedevano a gran voce di costruire un'app completa da zero per vedere il procedimento ed essere indirizzati correttamente. Avevamo già fatto un video con Spring ed Angular ma non era costruito da zero passo passo. Questo video è quindi per tutti coloro che riescono già ad essere un minimo autonomi, cercando online, come faresti un po' a lavoro, le cose che non sono ancora totalmente chiare, per poi procedere avendo comunque una guida da seguire :) Per fare ciò che dici, che è coretto, avremmo avuto bisogno di ritardare di quasi un altro anno l'uscita di un video del genere poiché con un video a settimana, spiegare tutte quelle cose prenderebbe almeno 40 video e questo avrebbe creato malcontento per tutta un'altra fascia di CodeBrothers che avevano necessità.
@@CodeBrothers capisco tutto il discorso. Alla fine il mio commento viene dal fatto che sono un fun dei vostri video classici da 30/40 Min con cui ho fatto il salto di qualità in Java. Seguirò comunque questi video con interesse ❤️
@@luigi6639 Grazie Luigi ☀️ in realtà pure noi siamo fan dei video da mezz'ora, secondo noi è il minimo per parlare di un qualunque concetto solo che purtroppo le statistiche ci dicono che tutti guardano quei video appena 5 minuti...quindi ci sembra una faticaccia che per ora non viene notata.. ad esempio il video del Java Memory model o degli optional.. :(
Spero mi perdonerete ma questo video visto che lo cercavo ho mille domande.. allora creando la tabella, perché la chiave primaria non è auto increment? Inoltre.. creando il db postgresql non poi attraverso orm/jpa creare una classe entity? (Ok in effetti state usando orm, potevate inserire anche lombok ed evitare di scrivere un po' di cose)
Puoi farci tutte le domande che desideri, siamo qui per questo Biagio! ^_^ Per l'auto increment ti lascio questo link molto ben fatto: thorben-janssen.com/jpa-generate-primary-keys/ e sono sicuro che troverai la risposta La tabella hai ragione, poteva essere creata tranquillamente attraverso Hibernate però volevamo mostrare anche un po' di scrittura SQL con la ddl opportuna :) Su Lombok c'è una grande discussione da sempre, personalmente preferiamo non utilizzarlo per vari motivi, immagino sia una preferenza però.. Anche per i Mapper ci sono un po' le stesse controversie xD Alla fine dei conti l'importante è che tutto funzioni come ti aspetti e che l'app sia solida e leggibile
L'autenticazione con JWT sarebbe molto interessante, eravamo indecisi se metterla o tenerla per un video proprio a parte.. magari se avremo un po' di tempo cerchiamo di dedicartela includendola magari proprio in questa webapp ;)
Cari i miei fratelli sto video mi servirà tantissimo lo rivedrò più e più volte promesso.. intanto.. ma per disabilitare cors non devo scrivere due righe in Java.. se funziona così ho svoltato😮
Ciao Biagio! Piacere di risentirti, siamo felicissimi che ti torni utile, abbiamo messo un po' di turbo temporaneamente :D Per il discorso CORS non ci piace abilitarlo se ti riferisci al classico modo estendendo da "WebSecurityConfigurerAdapter", ti esponi a dei potenziali rischi per cui non ne vale la pena, meglio avere il FE che proxa direttamente :)
@@CodeBrothers sembra interessante ma funziona col file JSON solo grazie alla dockerizzazione o cosa.. è un passaggio molto interessante che vorrei capire bene, anche perché al posto di angular posso metterci di tutto
Parlando di efficienza, l'algoritmo dei numeri primi cicla sugli stessi numeri (2 ... sqrt(n)) ad ogni valore contenuto nell'array, quindi è un O(n^2), non buono. Era meglio individuare il valore massimo, e rimuovere tutti i multipli di 2 ... sqrt(max), salvando i rimanenti in un array di primi (quindi usando Eratostene): for (int i = 2; i <= Math.sqrt(n); i++) { for (int j = 2; i * j <= n; j++) { values.remove(i * j); } } Ovviamente non possiamo usare remove sugli array, ma si risolve facilmente cambiando collection
Questi sono i commenti che ci piacciono, grande Alex! Hai forse una laurea in ingegneria? 😆 Ps: Non ricordo in quale video ma Eratostene salta fuori a una certa
Piccola nota per chi non conosce i varargs: è possibile dichiarare metodi che ricevono un numero di parametri variabile, dichiarandoli, ad esempio, come: public void metodo(String... words) o public void metodo(int... values) I parametri words e values, in questi casi, sono di fatti degli array di tipo String[] e int[] contenenti tutti i valori effettivamente passati ai metodi.
5:35 concettualmente è più appropriato pensare al transistor come ad una valvola, perché apre o chiude un passaggio di qualcosa che non è lei a erogare, mentre l'amplificatore lavora su ciò che gli viene dato in input, sembra una sottigliezza ma secondo me chiarisce molto il concetto di cosa faccia un transistor
public static String getMiddle(String word) { if (word.length() <= 2) { return word; } return getMiddle(word.substring(1, word.length() - 1)); } e non mi devo preoccupare se la lunghezza è pari o dispari (almeno, non esplicitamente) :D
Bella idea Alex, non sono abituato a vedere soluzioni ricorsive in giro, specialmente in Java (per eventuali problemi di memoria) però in sto caso ci sta! ^_^
12:30 ciao Michele, ma scusa, quindi quello che succede non è che, semplicemente, nella lambda viene prima calcolato il valore di value+zampeDaSommare e questo valore finale viene passato al metodo faiSomma?
Ciao Alex! È proprio questo il fatto, io fino a quel momento ho solo DEFINITO non ho eseguito nulla 😉 infatti faccio proprio vedere che è come se definissi una classe anonima, ma mica ne sto invocando il metodo. Il valore definito nella lambda viene catturato e verrà eseguito soltanto dopo, quando effettivamente chiamerò somma, quindi a livello di frames sullo stack prima ci sarà il main, poi faiSomma e infine somma
Mi sento un po' confuso.. all'inizio del video hai proposto postgresql e nel codice della connection c'è il driver a mysql e la connessione a mysql😮.. si in effetti cambiano solo due righe di codice Avete usato maven?
Ciao @CodeBrothers, devo dire che fate dei bellissimi video e molto interessanti. Sono molto di aiuto. Volevo chiedere se potete fare dei video di come si può sviluppare il modo di ragionare per imparare a programmare, il modo in cui uno può creare algoritmi o come spacchettare in piccoli problemi quelli più grossi insomma, in poche parole come riuscire a sviluppare il modo di pensare, analizzare per riuscire acquisire il pensiero di strategia risolutiva, problem solving o meglio il pensiero computazionale. Grazie mille di tutto spero non sia una scocciatura 😅 e se ci riuscite. 😊
Ciao Veronica, grazie per l'incoraggiamento ❤️ vedremo di continuare così! Prossimamente vedremo di dedicarti un video su come approcciare i problemi allora, ti dico subito che ovviamente buona parte è l'esperienza però comunque ci sono piccoli accorgimenti che si possono adottare per avere la vita più facile 😉
perché le classi Ricezione e Visualizzazione sono statiche? Più in generale, quando creo una nested class, quale/i domanda/e devo pormi per capire se farla static?
Ciao Alex, diciamo per semplicità in questo esempio, non era obbligatorio ecco :) Una inner class la fai statica in generale per organizzare meglio il tuo codice quando dipende da quella outer, solo che non così tanto da doverne fare una istanza. Inoltre puoi risparmiare memoria facendola statica (cosa di cui abbiamo già parlato eheh) inoltre puoi migliorare l'encapsulation dato che non potrà accedere ai suoi instance field (come detto nell'altra puntata). ;)
@@alexdelarge1508 per esempio se hai una classe Banca può avere senso scrivere una inner class CartaDiCredito così che solo banca possa accedere ai suoi metodi come "setCardLimit" e logicamente solo la banca può metterla ✌️😎
Alla parte del cane demone ho detto: "we rallenta cap'e provola" xD Come fa il thread principale a chiudersi se siamo nel for del thread principale? i thread non li conosco, mi sarà chiaro più avanti?
Ahahah esattamente dopo affronteremo tutto il capitolo dei Thread che sta già duranto da MESI ti dico solo questo.. se vuoi puoi darci una sbirciata tanto è totalmente scollegato come argomento ;) Comunque la motivazione è proprio quella detta: Alla JVM non interessa affatto dei Demoni! xD
14:13 ma se lo stack era pieno, come ha fatto a fare tutte quelle altre chiamate? ha flushato lo stack? p.s.: peccato che a 16:15 hai scritto 1000 invece di 10000, forse avremmo potuto vedere lo stack? :'D
Ciao Alex! Come sempre ottime domande, tra l'altro grande che ti stai vedendo tutto quanto seguendo la scaletta, come ti ci stai trovando? Questi non erano argmenti semplici! Per risponderti intanto: sono riuscito a fare tutte le altre chiamate perchè appena sono esploso ho cominciato a rimuovere ogni frame dentro il mio stack cercando qualcuno che potesse gestire l'eccezione, e una volta arrivano al 2500-esimo frame ho trovato finalmente il catch. Infine dato che avevo liberato un bel po' di frame ho potuto continuare finchè non sono esploso di nuovo :) Ahaha è vero ecco perchè! Beh sì forse se scrivevo 10k l'avremmo potuto vedere :')
@@CodeBrothers ah ecco, giustamente, essendo uno stack, mi estrae i frame quando "risale la scaletta". Per risponderti: mi sto trovando benissimo. Ho studiato per l'esame di OOP da un libro (Big Java Early Objects, di Horstmann) e sto usando tutti i vostri video come ripasso, anche se in realtà, più che un ripasso, sto arricchendo moltissimo le mie conoscenze di Java, quindi grazie, sia per i video, sia per l'attenzione che dedicate a noi commentatori :D
@@alexdelarge1508 ti sei trovato bene con quel libro? Pensi che ai nostri video manchi qualcosa per passare gli esami o capire la materia? Ci piacerebbe il tuo parere visto che hai già passato un esamone e siamo alla costante ricerca di come migliorare! Comunque non siete commentatori, una volta iscritti siamo tutti Codebrothers o BRO-grammatori ✌️😎 In caso se ti va abbiamo anche un gruppo Discord!
@@CodeBrothers il libro è spiegato bene ed è di facile lettura e comprensione, specialmente per chi si avvicina per la prima volta a Java. Bisogna avere qualche background di matematica però, ma niente di che. Il vostro corso invece mi sembra più adatto a chi già conosce l'argomento, e vuole approfondire e capire bene i concetti. Non è un corso per newbie, secondo me. Senza la lettura di quel libro avrei faticato a starvi dietro :D Cosa manca ai vostri video? Considerando la piattaforma, che non permette scambio di codice, direi niente. Purtroppo bisogna scrivere e scrivere codice e sporcarsi le mani per avere padronanza, altrimenti i concetti, anche se spiegati bene, si dimenticano, ma su youtube come fate a coinvolgere attivamente chi vi segue? cioè, o si guarda il video, o si apre l'IDE... Voi state riuscendo a spiegare concetti difficili con leggerezza, e il fatto stesso che siete alla costante ricerca di come migliorare, alla fine porterà miglioramenti. Perciò ragazzi, nient'altro da aggiungere, continuate così!
@@alexdelarge1508 grazie Alex! Ci ha fatto un sacco piacere che ti sei preso tempo per darci il tuo punto di vista, cercheremo di continuare così allora 😄 Hai forse visto i video fin da principio? Perché abbiamo approcciato Java fin dall'installazione dell'IDE e pensavamo che chiunque vi si potesse approcciare e ci faceva un poco pensare che invece l'impressione sia un'altra. D'altronde il canale è nato proprio per aiutare chi non potesse permettersi l'università... Ovviamente per seguire tutto serve anche esercitarsi dici bene 🫂
Secondo me va anche detto che non è una good practice lanciare eccezioni unchecked: se da qualche parte c'è il rischio di IndexOutOfBounds, forse dovrei rivedere il codice piuttosto che tirare un'eccezione
@@CodeBrothers dicevo in generale :D se la colpa delle unchecked exceptions è del programmatore, allora forse il programmatore dovrebbe rivedere e migliorare il codice dove c'è il rischio di dividere per zero, includendo dei controlli su quella variabile, e così per gli index e tutto il resto di unchecked
Piccola curiosità sulle eccezioni: L'incidente del razzo Ariane L’Agenzia Spaziale Europea (European Space Agency, ESA), la controparte europea della NASA, sviluppò un modello di missile denominato Ariane, usato più volte con successo per lanciare satelliti e per svolgere esperimenti scientifici nello spazio. Tuttavia, quando una nuova versione. Ariane 5, fu lanciata il 4 giugno 1996 dal sito di lancio dell’ESA a Kourou, nella Guyana Francese, il missile virò dalla sua rotta circa 40 secondi dopo la partenza. Volando a un angolo di più di 20 gradi, anziché verticalmente, si esercitò su di esso una tale forza aerodinamica che i razzi propulsori si staccarono dal missile, innescando il meccanismo automatico di auto-distruzione: il missile si fece esplodere. La causa che innescò questo incidente fu un’eccezione non gestita! Il missile conteneva due dispositivi identici (chiamati sistemi di riferimento inerziali) che elaboravano dati di volo provenienti da dispositivi di misura e li trasformavano in informazioni riguardanti la posizione del missile, usate poi dal computer di bordo per controllare i razzi propulsori. Gli stessi sistemi di riferimento inerziali e lo stesso software per il calcolatore avevano funzionato bene per il predecessore. Ariane 4. Tuttavia, a causa di modifiche al progetto del missile, uno dei sensori misurò una forza di accelerazione maggiore di quella che si riscontrava nell’Ariane 4. Tale valore, espresso come numero in virgola mobile, era memorizzato in un numero intero a 16 bit (come una variabile di tipo short in Java). Diversamente da Java, il linguaggio Ada usato per il software di quei dispositivi genera un’eccezione se un numero in virgola mobile troppo grande viene convertito in un intero, ma, sfortunatamente, i programmatori avevano deciso che tale situazione non sarebbe mai accaduta e non avevano definito un gestore per l’eccezione. Quando avvenne il trabocco numerico, venne lanciata l’eccezione e, poiché non vi era un gestore, il dispositivo si spense. Il computer di bordo rilevò il guasto e interrogò il sensore di riserva, che, però, si era spento per lo stesso identico motivo, una cosa che i progettisti del missile non avevano previsto: avevano immaginato che tali dispositivi potessero guastarsi per motivi meccanici e la probabilità che i due dispositivi avessero lo stesso guasto meccanico era considerata assai remota. A quel punto il razzo era privo di informazioni affidabili sulla propria posizione e andò fuori rotta. Sarebbe forse stato meglio che il software non fosse stato così diligente? Se avesse ignorato l’errore numerico di trabocco, il dispositivo non si sarebbe spento, avrebbe semplicemente elaborato dati errati. Ma in tal caso il sensore avrebbe segnalato errati valori di posizione, cosa che sarebbe stata altrettanto fatale. Al contrario, una implementazione corretta avrebbe dovuto catturare l’errore di trabocco, fornendo una strategia per ricalcolare i dati di volo. Ovviamente, in questo contesto “lasciar perdere” non era una scelta ragionevole. Il vantaggio del meccanismo di gestione delle eccezioni sta nel fatto che rende questi problemi espliciti per i programmatori, una cosa a cui dovete pensare quando state maledicendo il compilatore Java perché si lamenta di eccezioni non catturate. (dal libro: Concetti di informatica e fondamenti di Java)
Ciao Michele, nella parte finale del video spieghi che, per risparmiare memoria, se la mia inner class non ha bisogno degli istance field della classe outer, allora la posso fare statica. Va bene, ma il perché di questa cosa l'hai spiegata in qualche video e il mio cervello era in buffer overflow, o la stai dicendo adesso per la prima volta? Per darmi una spiegazione, presumo sia perché una classe statica non alloca spazio per quegli istance field, è giusto? Mille grazie. Questa lezione è davvero ben fatta.
Ciao Alex! Bella domanda questa, il motivo per cui la inner class, una volta statica richiede meno memoria sta nel fatto che non ha bisogno di tenere una referenza all'oggetto Outer class ;)