GithubHelp home page GithubHelp logo

javaoop's Introduction

Hi, I'm Francesco Bignardi! 👋🏻

Junior Back-End Developer 💻

Passionate about informatics since 1999 when I approached the first videogames of my life (Age of Empires II was THE first). 👾

Since then my life took different paths, graduate in high school as electrical engineering technician, graduate at University of Bologna in political, social and international sciences. 🎓

I'm a huge music fan, and over the years I've enjoyed recording electric bass and electric guitar with Pro Tools, Ableton and Garage Band. 🎸

At the end of 2022 I decided that 2023 would have been a year of professional training in informatics, and I leaved a permanent contract in order to do that. 💻

I’ve chosen a 6 months full-time course at Develhope based on Java, MySQL and Spring Boot. With on-demand lessons in english and live lessons with italian tutors, classes with a maximum of 5 students, tons of exercises and 2 projects developed in Agile/Scrum, that was surely the best way to being introducted in the informatics world. 👨‍💻

Graduated the 4th of august, the 25th of september I started working in a software company based in Carpi (MO). I learned so much in this 3 months experience, joining a group of work and helping the software to increase day by day its code coverage while doing JUnit tests. During this experience I worked with Eclipse, Java, MySQL, Spring, Hibernate, Maven, Ant, SquirrelDB, Google GWT, Tortoise Git. 🧠

Now I’m looking for a new company to work for, my priorities are : investiments in professional training, attention for work-life balance and empathic people around me. What I can give is my commitment, passion for informatics and for work, punctuality, accuracy and all my skills acquired in this great 2023. 💼

Currently learning C# and .NET 👨‍💻

My contact details:



Le mie competenze:

html5 css3 javascript bootstrap javascript javascript javascript

javaoop's People

Contributors

doppiogancio avatar francescobignardi avatar

Stargazers

 avatar

Watchers

 avatar  avatar

javaoop's Issues

Challenge revealed

Ora cominciamo sul serio, la sfida sono gli alberi binari di ricerca (ABR), in inglese BTS - Binary tree search.

Immagina una lista di lunghezza N con numeri ordinati (ma funziona anche con le stringhe ordinate in ordine alfabetico, crescente o decrescente che sia). Immagina anche che devi effettuare operazioni di ricerca per verificare che il numero X sia presente o meno, che fai?

Ricerca lineare

La ricerca più semplice da implementare è di certo quella lineare, dove controlli ad uno ad uno tutto i numeri della lista, dal primo all'ultimo e, se e quando lo trovi ti interrompi.

Complessità della ricerca lineare.

Valuta sempre 3 casi: il caso migliore, peggiore e quello medio.
Nel caso della ricerca lineare il caso migliore è 1 (al primo colpo), peggiore (N, la lunghezza della lista), mediamente quindi N/2/
Questo significa che più cresce la lista, più saranno i controlli e quindi più lento. In informatica si dice che la sua complessità e' O(n) (complessità lineare).

Spunto di valutazione
E se cominciassimo dal centro della lista potremmo sfruttare la proprietà dei numeri crescenti per escludere una metà della lista, mi spiego.
Stiamo cercano il numero 150, al centro della lista troviamo il 47, secondo te il nostro 150 (ammesso che ci sia) dove starà nella metà a sinistra o quella destra? Quella destra ovviamente e quindi abbiamo già risparmiato N/2 confronti, e con la restante lista possiamo dividerla a metà più volte fino quando ho terminiamo i confronti o troviamo il numero.

Questa ricerca prende il nome di ricerca binaria, che puoi realizzare con un array o con una struttura ad albero (e quindi albero binario di ricerca).

ABR
A noi interessa ovviamente questa soluzione, e immagina un pò? Useremo la classe Node per realizzare il nostro albero. E cosa succede quando hai un albero? La soluzione migliore e' sempre quella della ricorsione.

Problema
Dato un nodo qualsiasi (e quindi con un valore) implementa nella classe Node la funzione addValue(int).

[continua...]

Tag abstraction

Così come e' successo per i modificatori di stringa, cerca di capire se esiste una astrazione (interfaccia o classe generica) di una serie di elementi che stai gestendo nella tua applicazione.

Ad esempio cosa hanno in comune A, IMG, P, TABLE, etc? Sono tutti TAG

A questo punto cerca di capire cos'e' un TAG e come si comporta, e prova scrivere una bozza

Tag casuali presi dal sito Ansa.it :)

<link rel="stylesheet" href="/sito/cssnew/fancybox.css">
<meta name="title" content="Agenzia ANSA: ultime notizie di cronaca, politica e sport - ANSA" />
<p class="txt-subtitle"><br><strong>Per accedere senza limiti a tutti i contenuti di ANSA.it</strong></p>
<button type="button" class="to-menu menu-handle">Menu</button>

Se ci fai caso ogni tag ha:

  1. Un nome (link, meta, p, button....)
  2. Una lista di attributi (rel, href, name, content, class, type,...) e ogni attributo ha il suo valore(="un valore")

Esempio: tag person

<person firstname="Mario" lastname="Rossi" age=30>...</person>

A questo punto cerca di progettare la tua classe generica che possa rappresentare un qualsiasi TAG, esistente o inventato, e che abbia un numero di attributi/valori anchesso di lungezza variabile e con nomi qualsiasi.

Classe Node

Regola generale, solitamente una classe rappresenterà due cose: un servizio o un'entità.

Il servizio è qualcosa in grado di manipolare dei valori di input ed eventualmente dare un output.

Esempio: servizio,
Una classe FileWriter sarà un servizio che ti permetterà di scrivere un testo in un file.

Esempio: entità,
La classe Studente, conterrà i dati di uno studente.

Nel nostro caso possiamo considerare la classe Node come un'entità. E' buona norma far si che le entità siano immutabili
laddove possibile, cosi che un nodo che ha un valore, non possa essere alterato per errore.

Discorso diverso per i valori di left e right, che di default sono nulli, ma che successivamente potrebbero essere valorizzati.

Conclusione
Il mio suggerimento e' quello di passare solo il valore "value" nel costruttore e rimuovere il metodo setValue cosi siamo sicuri che nessuno potrà alterarne il valore.

public class Node {
    public Node(Integer value) {
        this.value = value;
    }
}

GIT workflow

Altra cosa importante è imparare un flusso di lavoro con git.

Tieni sempre a mente che la version main o master (dipende da come hai configurato la tua repository) è l'ultima versione ufficiale del tuo progetto. In pratica è l'aggiornamento del sistema operativo del tuo computer, l'ultima versione della tua app preferita, etc...

Questo significa che il cliente si aspetta che sia funzionante, e che contenga delle novità. Allo stesso tempo su sviluppatore devi poter lavorare in serenità, introdurre tutti i bug che vuoi senza recare danno ai fruitori. E come si va?

Branch
La soluzione e' di lavorare su una versione tutta tua che si chiama branch. In questo branch ci lavori come fai tutt'ora, l'unica cosa che cambia e' che puoi aprire una "pull request" ossia una richiesta di riversare (mergiare) le tue modifiche nella versione ufficiale.

Il tuo team puo' richiedere delle modifiche, e quando viene approvata di puo' mergiare in master, ed ogni tot si puo' creare una nuova versione che conterrà tutte le pull request mergiate dall'ultima versione ad ora (change log).

Esempio

git checkout master // Cosi se sicuro di essere nella versione principale
git pull // per scaricare la versione piu' recente
git status // per controllare quali file sono stati creati/modificati/cancellati
git checkout -b astrazione-tags // crei una versione che si chiama astrazione-tags

git commit -m "Creato tag vuoto" .
git commit -m "Creato tag contenitore" .

// Tanti altri commit

git push -f // Fai il push di questo branch nel cloud (github)
git checkout master // per tornare al master
git checkout pino-mauro // per andare ad un branch esistente che si chiama "pino-mauro"

DOM: Document Object Model

Una volta terminato di progettare e realizzare i TAG, sarai in grado di instanziare una DOM: di seguito una rappresentazione sia in pseudo codice, diagramma UML e stringa html.

PSEUDO CODICE

document = new Document();
html = new Html();
head = new Head();
body = new Body();

// Aggiungine quanti ne vuoi
[...]

html.addChild(head);
html.addChild(body);
document.addChild(html)

UML
image

HTML
Una volta che avrai la DOM, che nient'altro è una istanza di TAG (che conterrà n livelli di tag figli...) non sarà difficile implementare un nuovo metodo getHTML o toHTML o toString (sta a te scegliere un nome adeguato) che ti restituisca la stringa HTML della DOM con radice il tag sul quale invocherai tale metodo. Esempio print document.toString() ti darà la seguente stringa

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

</body>
</html>

TAT types: empty and container

Cos'è un tag vuoto?
Gli elementi HTML che non hanno tag di chiusura come <br>, <hr> e <img> sono considerati tag vuoti, tag void o tag a chiusura automatica poiché non possono contenere altri elementi o contenuto. I tag contenitore che non contengono nulla al loro interno, ad esempio un div vuoto (<div></div>), vengono anche definiti tag vuoti.

Qual è la differenza tra un contenitore e un tag vuoto?
In HTML, gli elementi contenitore come div o span hanno un tag di apertura (<div>) e un tag di chiusura (</div>) e vengono utilizzati per contenere altri elementi o contenuti. I tag vuoti (chiamati anche tag a chiusura automatica) come <br>, <hr> o <img> non hanno tag di chiusura e non possono contenere altri elementi.

Quanti tag vuoti ci sono nell'HTML?
Secondo la specifica HTML5 ci sono 15 tag vuoti, questi sono detti anche tag a chiusura automatica o void perché non hanno un tag di chiusura corrispondente e non possono contenere altri elementi. Alcuni esempi comuni di tag vuoti includono <br>, <hr>, <img>, <input>, <link> e <meta>.

Implicazioni nel design della tua applicazione
Considera che se hai un'istanza di un tag vuoto, non deve essere possibile aggiungere un tag come contenuto. Al contrario, mi aspetto che per le istanze di tag contenitori mi aspetto che ci sia un metodo per aggiungere N tag. Presta attenzione che quando si parla di tag, si parla di tutti i tipi di tag non solo vuoti o contenitori... questo ti suggerisce qualcosa? :D

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.