Esperto Informatico? Sei di buon cuore? Rispondi alle mie domande.

Pubblicità

UtenteVolenteroso

Nuovo Utente
Messaggi
6
Reazioni
3
Punteggio
2
Ciao, tu che mi leggi... spero che la programmazione e l'informatica sia il tuo pane quotidiano e una passione che ci accomuna. Scrivo qui, probabilmente sbagliando sezione (e mi scuso eventualmente con i moderatori) per fare domande sul funzionamento di determinati meccanismi che oramai sono anni che voglio approfondire ma solo ora mi decido a chiedere aiuto.
Non mi dilungo ulteriormente e vengo subito al punto con una prima domanda che spero possa avere una risposta dettagliata da una persona molto paziente e che mi sappia perdonare per l'ignoranza che dimostrerò.

Premessa: Sono avvezzo alla programmazione: c,c++,python,java... ecc.

Quali sono i passi affinchè un Software o un'App possa scambiare informazioni con un qualcosa di esterno? Provo a spiegarmi ancora meglio con un esempio: Prendiamo il caso di un Applicazione che riporta notizie sotto forma di brevi articoli. L'applicazione ha una pagina principale che è possibile aggiornare e ogni tanto esce qualche notizia nuova. Ecco, con chi sta dialogando quell'applicazione per ricevere quel determinato oggetto "Nuovo Articolo" con un suo titolo, un'immagine e un testo? Quel qualcosa con cui comunica posso definirla, forse sbagliando, un server? Se di questo si tratta... cosa c'è dietro questa parola? Posso io replicarne uno? Se si come? Come lo metto in contatto con un'altra macchina esterna che si trova in un altra parte dell'italia magari?

Sono tante domande, molto stupide forse, per cui mi scuso ancora una volta. Grazie a chiunque vorrà condividere queste sue "Basi" con me.
 
Ciao, tu che mi leggi... spero che la programmazione e l'informatica sia il tuo pane quotidiano e una passione che ci accomuna. Scrivo qui, probabilmente sbagliando sezione (e mi scuso eventualmente con i moderatori) per fare domande sul funzionamento di determinati meccanismi che oramai sono anni che voglio approfondire ma solo ora mi decido a chiedere aiuto.
Non mi dilungo ulteriormente e vengo subito al punto con una prima domanda che spero possa avere una risposta dettagliata da una persona molto paziente e che mi sappia perdonare per l'ignoranza che dimostrerò.

Premessa: Sono avvezzo alla programmazione: c,c++,python,java... ecc.

Quali sono i passi affinchè un Software o un'App possa scambiare informazioni con un qualcosa di esterno? Provo a spiegarmi ancora meglio con un esempio: Prendiamo il caso di un Applicazione che riporta notizie sotto forma di brevi articoli. L'applicazione ha una pagina principale che è possibile aggiornare e ogni tanto esce qualche notizia nuova. Ecco, con chi sta dialogando quell'applicazione per ricevere quel determinato oggetto "Nuovo Articolo" con un suo titolo, un'immagine e un testo? Quel qualcosa con cui comunica posso definirla, forse sbagliando, un server? Se di questo si tratta... cosa c'è dietro questa parola? Posso io replicarne uno? Se si come? Come lo metto in contatto con un'altra macchina esterna che si trova in un altra parte dell'italia magari?

Sono tante domande, molto stupide forse, per cui mi scuso ancora una volta. Grazie a chiunque vorrà condividere queste sue "Basi" con me.
Su come lo scambio di dati tra programmi web avvenga sinceramente non so rispondere, probabilmente con qualche API(una specie di interfaccia) messa a disposizione dal sito web dalla quale si acquisiscono le informazioni, dietro quel sito web sicuramente c'è un server che permette di gestire le richieste di connessione e non solo, un server è letteralmente un "servitore" un'intera macchina dedicata solamente a smistare le rischieste di connessioni e a servire il client(che esegue richieste al server), si viene così a creare una specie di schema che di basa in maniera molto semplificata in due operazioni: richiesta da parte del client di un servizio, svolgimento del servizio da parte del server e restituzione al client del risultato.
Puoi replicare uno? Dipende da ciò che ti aspetti un server e costoso è complicato da mantenere, d'altro canto esistono host online che a un buon prezzo ti permettono l'acquisto mensile di un server condiviso o dedicato, fatto sta che non hai la medesima libertà di quella di un server "casalingo".
 
In parte ti ha già risposto Matteo.
Il modo in cui funziona dipende, potrebbe essere essere una richiesta in REST. In sostanza sono comunicazioni che avvengono scambiandosi del JSON (è un po' il sostituto di XML).

Il JSON contiene le info necessarie. Come può essere un URL a un'immagine, del testo e altro. Nell'esempio dei riquadri degli articoli una struttura come questa può comporre i riquadri.
Può rimuovere o modificarli anche. Di solito c'è anche una paginazione. Per dire, ci sono 10 elementi per pagina, quando vai a pagina 2 gli elementi saranno sempre 10 ma non saranno più quelli con ID da 0 a 9 ma da 10 a 19.
Ovviamente il contenuto (che viene inviato scambiando il JSON ad esempio) sarà in un database.

Di solito codice client e server comunicano così, lato "programmazione".

Ovviamente si può anche non usare REST e fare richieste per un determinato URL, e sarà poi il server ad elaborare la richiesta e restituire il contenuto dopo averlo elaborato.

In entrambi i casi comunque la distinzione fondamentale è tra lato client e server.
Nel caso ad esempio di un linguaggio come PHP (linguaggio interpretato), quando fai la richiesta il codice viene elaborato da un interprete lato server e poi inviato al client. Assieme al risultato del codice eseguito lato server, viene restituito anche il codice client HTML, CSS, JS etc.

Tornando al discorso della replicazione di tutto ciò. Ai fini di sviluppo è normale ricrearsi tutto in locale. Dipende molto dalle tecnologie che usi. In Java non sarà proprio come in PHP ecco.
Diciamo che i concetti sono più o meno i medesimo. Dovrai installare un server e un database, e un interprete eventualmente.

Btw, per vedere come comunica un sito come quello che dicevi puoi aprire gli strumenti di sviluppo del browser (F12 su Firefox) e andate nella scheda Rete. Li vedrai le richieste fatte.
 
Grazie mille davvero per la vostra disponibilità. Dopo aver letto le vostre risposte, una domanda mi viene spontanea. Perchè si è finiti a parlare di pagine web? Il mio esempio era di un applicazione (java,android, forse non ho specificato bene) che nella sezione principale ha un tot di notizie sotto forma di brevi articoli. Quello che mi state dicendo è che l'applicazione si appoggia ad un sito web dove preleva notizie? Magari tramite API? Quest'ultimo invece (che posso definire client) dialoga con un server magari, per dirne una, scambiandosi dei JSON?
 
Parlando di APP per smartphone cambia un pò, ma la solfa è più o meno quella. Nell'APP non "includi" nulla. Farai sempre richieste ad un server, ad una particolare "action", passando eventualmente alcuni "filtri" di ricerca; la richiesta la fai ad esempio usando una REST API.
Ad esempio fai una ricerca per "catalogo serie tv di genere action". Questi filtri verranno passati al server in un qualche modo e poi verranno elaborati usando un database; il risultato verrà restituito all'APP.

"Dentro" ad una app non c'è un database di articoli, per capirci; o meglio, ci può essere qualcosa di locale e parziale ma non ci saranno sicuramente gli articoli scritti piuttosto che il catalogo delle serie tv etc etc.

Ho fatto una ricerca rapida sul momento, guarda questo sito https://www.episodate.com/api
Se clicki sul primo URL (che ha alcuni parametri in GET) ti viene restituito questo:

tv series.webp

Come noti è un JSON. Si tratta di un array di N elementi dove ciascuno è una serie tv e ciascuna ha le sue info. Con una cosa simile sei in grado di creare - ad esempio - una tua app che mostri i risultati provenienti da questa API.

Se fai caso al secondo URL, c'è un secondo parametro, che ti serve per filtrare il nome della serie TV. La richiesta la fai in GET (in questi due casi specifici almeno).
 
Ok, ora ho sicuramente qualche dubbio in meno. Ti pongo ora un'altra domanda. Supponiamo che io voglia realizzare un'app per smartphone e che voglia essere il meno dipendente possibile da API di terze parti. Quali sono i passi per fare tutto da me?
Servirebbe, da quanto ho capito, che io realizzassi e mantenessi un server (che però è costoso e poco raccomandabile per il momento?) oppure, più semplicemente, mi potrei affidare a servizi di host che per un determinato costo al mese mi offrono il "noleggio" di un server condiviso o dedicato. Una volta noleggiato questo Server, lo si dovrebbe configurare in modo tale che possa ricevere chiamate GET/POST dalla mia applicazione realizzata in java per android... E mi restituisca magari dei JSON con le più svariate informazioni.

A questo Server inoltre è collegato un DATABASE esterno oppure montato sul server stesso?
 
Innanzitutto dipende da che app vuoi creare. Questo fa sicuramente la differenza sul tipo di contenuto e sullo scambio dati.
Considera l'app di Gmail o quella di Amazon per acquistare: sono solo delle interfacce comode per lo smartphone, ma entrambe le cose puoi farle andando sul portale web o la casella mail.
L'APP spesse volte è solo questo.

Fare tutto da te... dipende cosa intendi. Se tu avessi un software sul web, scritto da te, avresti già un server e un database. Puoi usare OVH ad esempio, ma ne trovi parecchi. La configurazione spetta a te.
Idealmente se vuoi sviluppare il backend in Java dovrai usare Spring, che è il framework più diffuso. La cosa che ti consiglierei è proprio avere il backend separato dall'APP, quindi la tua applicazione Java sarà su smartphone ma avrai tutti i servizi che richiami sul server, in Java o in quello che preferisci.
Così dalla app richiami i servizi come fossero API esterne normalissime, e non hai nulla di incluso nell'APP.

Il database è normalmente sulla macchina. Dipende che vuoi usare... forse la più semplice è la classica stack LAMP, dove hai un linguaggio di backend (PHP) + Apache (o nginx) + MySQL. Se usi Java è un pò diverso; non sviluppo però backend in Java, quindi evito di dirti esattamente cosa usare, al di fuori di Spring.
Puoi appoggiarti anche ai servizi Amazon se vuoi, ma i costi sono diversi, di solito paghi a consumo.

Comunque GET/POST sono solo due azioni (dei metodi); il protocollo è HTTP. Nelle API di norma ne trovi altri, come PUT e DELETE. Quindi non hai nulla da installare. Sono proprio parte delle specifiche HTTP.

Anche l'aspetto relativo alla sicureazza poi sarà importante, sia nella configurazione della macchina, che nel resto. Ad esempio dovrai decidere se per usare l'API serve essere autenticati oppure no. L'API linkata sopra è pubblica, quella di Facebook (per prenderne una a caso) richiede una API Key.
 
Grazie mille davvero per la tua pazienza. Vorrei porre ancora un esempio:

Mettiamo caso volessi realizzare un applicazione android, anzi, immaginala con me tanto è molto semplice: Un applicazione con un bottone e un testo che altro non è che un contatore (quindi viene visualizzato dall'utente sullo schermo del suo cellulare un grande bottone e un numero). Quando si preme il bottone, il numero aumenta di 1. Fino a qui tutto semplice e banale, no?
Ora, mettiamo caso che la stessa identica applicazione si trovasse su 10 telefoni diversi.
Ogni volta che un utente, di uno di questi 10, clicca il suo pulsante... Tutti gli altri utenti vedono aumentare il proprio contatore in tempo reale o quasi. Per semplificare, mettiamo che ogni volta che si clicca il bottone, non sarà possibile ricliccarlo per 10 minuti circa.

In questo esempio, tutti i device risultano "Collegati" in quanto condividono un'informazione visibile e modificabile da tutti loro. Com'è possibile realizzare qualcosa del genere?
 
Il contatore sarà una risorsa condivisa, quindi immagino un dato in un database o un file o qualcosa di analogo.
Ipoteticamente, una volta che l'utente clicka sul bottone il numero viene incrementato e viene inviato al server in remoto e memorizzato. L'ideale sarebbe stabilire la connessione usando un qualche tipo di protocollo, in tal modo vai ad aggiornare il contatore su ogni singolo telefono al seguito di un'azione.

Non saprei dirti però quale protocollo va utilizzato. Il concetto è un pò quello che utilizzai anche anni fa per una chat in Java (chat per desktop però): in questo caso usavo i socket e stabilivo una connessione TCP. La connessione avveniva però con un'applicazione server sempre scritta in Java, che manteneva l'elenco di tutti i client connessi. Ogni volta che veniva inviato un messaggio nella chat globale, questo veniva propagato a tutti i client connessi.

Tu dovresti allo stesso modo aggiornare in realtime tutti i telefoni. Il problema comunque è un pò meno banale di quanto sembri, perchè devi anche accertarti che il numero che vai ad incrementare sia quello corretto; per coerenza, supponi di avere il numero del contatore salvato a DB.
Hai 3 telefoni, tutti con il numero 0. Due di loro premono in contemporanea, che cosa fai? Secondo me la cosa corretta è richiamare un URL (una action, un endpoint insomma) che si occupi dell'incremento leggendo il dato dal db (magari facendo un LOCK), poi incrementarlo e salvarlo. Il dato salvato e incrementato deve essere inoltrato a tutti i telefoni. In questo caso tutti ricevono il numero 1 e successivamente il numero 2, oppure direttamente il numero 2 (dipende come gestisci il LOCK e la coda...).

Per il realtime dovresti cercare un pò nel mondo java + Android, non so cosa esista.

Sono idee buttate lì mentre lavoro, non è detto siano buone soluzioni... ?
 
Il contatore sarà una risorsa condivisa, quindi immagino un dato in un database o un file o qualcosa di analogo.
Ipoteticamente, una volta che l'utente clicka sul bottone il numero viene incrementato e viene inviato al server in remoto e memorizzato.
Ok, sempre nel caso volessi realizzarlo nel mio piccolo... Questo server come me lo procuro? Mi hai detto che avrei potuto utilizzare OVH, che ho visto essere un servizio che ti da a disposizione un server a partire da 95 euro al mese. C'è un modo per evitare di spendere così tanto? Ad esempio, farmi da solo un server con un vecchio computer che non uso, è fattibile?
Sono idee buttate lì mentre lavoro, non è detto siano buone soluzioni... ?
Nono, assolutamente. Già è tanto che ti prendi la briga di rispondermi!
 
Se vuoi tenere tutto in locale si, non ci sono problemi. Se vuoi connetterti da internet, è rischioso, inoltre avresti bisogno di un ip non dinamico.
Io ti ho citato OVH, che ha pure macchine che costano poco (guarda le VPS), c'è pure Hetzner (volendo anche tophost), Aruba o se vuoi qualcosa di free giusto per "pacioccare"... c'è anche Altervista.
Non ti serve un dedicato comunque.

Su configurazioni e cose varie non entro nel merito, non me ne occupo io, e sinceramente non ci ho mai smanettato (mi connetto solo con SSH quando serve).

Dovresti prima decidere che strada vuoi scegliere, che tecnologie usare, e magari provare tutto in locale. Puoi fare tutto in localhost per sviluppare, e ti installi tutto in locale.
 
Quello che stai chiedendo è oltremodo complesso, in pratica la tua domanda si riassume con “cosa sia il Inter process communication”, ossia come due programmi separati possano comunicare tra loro e scambiarsi dati.

Non esiste una risposta unica, esiste tutta una serie di tecnologie che permette di fare ciò, a seconda della situazione. Esistono metodi diversi a seconda della piattaforma, a seconda se i due programmi girino sullo stesso computer, o due computer diversi connessi con una porta seriale, o due computer nella stessa rete locale, o due computer lontani connessi via internet.
Inutile dire che esistono vagonate di libri su ognuna di queste diverse tecnologie.

la cosa più importante da capire è che quando due programmi si parlano tra di loro, indipendentemente da come lo facciano, devono essere in grado di capirsi, ossia di parlare lo stesso linguaggio, in termini tecnici usare lo stesso protocollo di comunicazione. Anche in questo caso, la risposta non è unica in quanto non esiste un unico protocollo.

l’esempio da te fatto è una classica configurazione denominata client/server, ossia multiple applicazioni (le app installate su smartphone) non comunicano tra loro, bensì “parlano” con un programma principale (server) che accetta ordini (in questo caso “incrementa il contatore”) e fornisce informazioni (il valore di tale contatore). Essendo in rete, il programma principale dovrà girare su un computer connesso in rete, con un ben preciso indirizzo, a cui i clienti si possano connettere. Tale programma è scritto usando una tecnologia chiamata “web server”, usando il classico protocollo di comunicazione che usa la rete (http), rendendo noto come comandi e istruzioni debbano essere formattate. Ma, ripeto, è solo un esempio.
 
Se vuoi realizzare un'applicazione mobile con back end dedicato e dispatch dei dati in tempo reale sui dispositivi vai di flutter e firebase che è già tutto belle che pronto all'uso (storage dei dati "remoto" e dispatch in tempo reale ai dispositivi) e soprattutto gratuito (almeno su mole di dati contenuta). Ci sono un sacco di tutorial su youtube al riguardo, in inglese perlomeno.

Altrimenti dovresti creare l'applicazione mobile, creare il back end (supponiamo java spring+sql+jpa+socket), affittare, configurare il server e fare il deploy del back end. Assolutamente fattibile eh, ma per qualcuno con 0 nozioni su come funzionano singolarmente queste componenti mettere il tutto insieme richiederebbe uno sforzo non indifferente, soprattutto come tempistiche. Parliamo di mesi e mesi secondo me se fai da autodidatta, partendo da 0, e non è neanche detto che riesca a portare a termine il progetto.

Con flutter e firebase, se riesci a darti il giro, in poche settimane una semplice applicazione pulsante/incremento valore riesci a farla tranquillamente in autonomia.
 
Pubblicità
Pubblicità
Indietro
Top