Italian Chiacchiericci

Sagenut

Expert
Licensed User
Longtime User
Faccio un ultimo giro di prove e poi cambio tutto altrimenti non mi muovo più da quì.
Se poi più avanti capirò come migliorare allora farò un bel update, che fà anche sembrare che ci tieni e dai supporto. :D
 

Sagenut

Expert
Licensed User
Longtime User
Ho deciso di cambiare approccio e fare come avevo già detto:
- Richiesta Permessi all'avvio dell'app
- Compilazione Lista Contatti all'avvio dell'app mentre ancora non è visibile
- Aggiornamento Lista solo tramite Refresh richiesto dall'utente
Purtroppo vedo che il tentare di implementare il Lazy Loading crea effetti molto peggiori, quasi sicuramente a causa delle mie Sub già presenti che cozzano e fanno fare dei cicli inutili.
Non avendo per ora voglia di smenarci altro tempo preferisco passare ad una modalità più basica e rozza.
Poi come ho detto vedrò di migliorare in futuro, se ne varrà la pena per questa App.
Grazie a tutti per i consigli.
Altrimenti dove finisce tutta la mia Saggezza quando scrivevo a @LucaMs:
Pensa a finire Penny in qualche modo.....a migliorarla ci pensi dopo. ;)
 

LucaMs

Expert
Licensed User
Longtime User
Sapessi cosa sto "per facendo io"...

Non so nemmeno io stesso se l'ho capito bene né se funzioni :D

Per spiegarlo bene, dovrei usare circa 4.000 parole (e magari avere prima le idee più chiare).

Ci provo ugualmente (anche se mi sa tanto che questi miei post prolissi li leggo solo io :p).

Comunicazioni Client (b4a) - Server (b4j) websocket.

Lato Client c'è una UNICA routine, creata da Erel, che riceve i messaggi (stringa JSON) dal server.
Questa routine elabora la JSON, ne ricava il nome della routine del client da lanciare ed una List che contiene i parametri:
Private Sub ws_TextMessage(msg As String)
dall'interno della quale viene chiamata la routine che il server vuole lanciare sul client, ad esempio può chiamare:
MiaRoutine(params As List)
ed il parametro è appunto sempre una List (params).

Ora, l'ideale sarebbe che dalla parte opposta, ovvero sul server, la cosa funzionasse nello stesso modo, ovvero ci fosse un'UNICA routine che ricevesse un JSON dal client e che "smistasse" le chiamate, ovvero ricavasse un nome di una routine del server da lanciare e gli passasse dei parametri.

Beh, non è così; per come è stata realizzato il tutto (da Erel), in realtà il client chiama direttamente una delle tante routine del server (routine che stanno nella classe che contiene il websocket) e come parametro devono ricevere una Map.

Quindi quello che ho tentato di fare (e sembra funzionare) è stato di creare un "metodo" per ottenere questa funzionalità, ovvero rendere omogenea la cosa, cioè anche lato server c'è una sola routine da chiamare che a sua volta lancia quella richiesta dal client, con parametri.

Inoltre, non mi piace che i parametri siano una List, preferisco una Map (in modo da poter ricavarli tramite nome, anziché numero ordinale), quindi ho cambiato anche questa cosa.


Tutto questo... a che pro? Certo, dal mio punto di vista, il tutto così è migliore ma... quanto mi rende? Quanto mi sarà utile? Non sarebbe stato meglio occuparsi di Penny? Domanda retorica :(


[Si è almeno capito ciò che ho scritto? :(]


P.S. dimenticavo: queste modifiche rendono anche possibile cifrare/decifrare le stringhe JSON di comunicazione (in entrambi i versi).
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Potrebbe sempre tornarti utile per Penny.
E di certo potrebbe tornare utile ad altri una base di un server, sulla quale poi eventualmente lavorare per adattarlo alle proprie esigenze.
Io intanto forse ho trovato una pace dei sensi con la mia Lista Contatti.
Ora finalmente posso proseguire oltre.
 

LucaMs

Expert
Licensed User
Longtime User
Mi sono arenato... di nuovo. Non per impedimenti tecnici, per stancheSSa mentale, totale apatia.

Sono mezzo soddisfatto di quanto fatto (vedi post precedente, #3447 :eek:) ma adesso devo aggiungerci un paio di cosette (probabilmente conserverò due coppie - client+server - di progetti diverse).

Quanto fatto, tentando di ricapitolare sinteticamente, è stato di ottenere una certa uniformità nel "modo" di comunicare tra client e server (sempre websocket, eh), ovvero in entrambi i progetti c'è un'unica routine che riceve il messaggio (ed una che lo invia) ed il tipo di dati che le routine inviano a questa è sempre una Map. [Questo potete saltarlo: nel codice base di Erel non è così - da una lato c'è un'unica routine, dall'altro no; da una lato si invia una List, dall'altro una Map, quindi non c'è uniformità, appunto].

Ora resterebbero da fare due cose:

1) implementare il tutto come WSS;
2) i messaggi "fisicamente" inviati sono stringhe JSON e sarebbe il caso di cifrarle (criptarle), benché WSS sia già in parte una sicurezza.

Per il punto 1) feci già degli esperimenti e, dopo varie pere per zie, visto che ci sono problemi con vecchie versioni Android (Erel risolse la faccenda ma è complicata), riuscii a far comunicare le due "macchine" con questo protocollo. Piccolo problema: servirebbe un IP statico lato server ed il mio è dinamico (benché io non spenga mai il router e normalmente non cambi). Comunque, anche questa procedura è "lunga e complessa". Ma s'ha da fa' !

Per il punto 2) la cosa è ancora peggiore. Nel giochetto A9 ho usato qualche libreria per l'RSA; però comunica con pagine PHP, in cui è ovviamente presente la cifratura-decifratura. Per quanto ne so non ci sono librerie per b4a e b4j che consentano di gestire questa cosa, con tanto di chiavi pubbica e privata.
Potrei usare B4XEncrytion e jB4XEncryption ma appunto non ci sono scambi di chiavi, semplicemente una parola chiave da usare per cifrare/decifrare; ma come, dove salvarla/inviarla?

Forse mi conviene fare in modo che i primi dati scambiati tra client e server siano in chiaro (comunque "sotto" WSS), l'utente venga autenticato tramite nome-utente e password e poi usare quest'ultima per la cifratura; che ne ditO?

P.S. potrei anche inviare al client, una volta autenticato l'utente, un codice che serva come chiave per la cifratura, ma tanto se qualcuno avesse scoperto nome-utente e password, riceverebbe comunque questo codice, no? Quindi tanto vale usare la sua password.
 

Sagenut

Expert
Licensed User
Longtime User
Attento che l'IP può cambiare anche se lasci il router sempre acceso.
Almeno a me accade che di tanto in tanto mi mandino tipo un comando di Resync (o come volete chiamarlo) dalla centrale e il router perde la connessione e poi si riconnette.
In quel frangente mi viene anche cambiato l'IP perchè ovviamente non riprende mai lo stesso slot di prima.
Che sia una loro necessità o una cosa voluta per impedire che l'IP non sia lo stesso per troppo tempo non lo sò.
Poi magari è solo una condizione della mia linea decadente.
Dovresti almeno usare un servizio di DDNS secondo me.
Ce ne sono alcuni gratuiti tipo NOIP.
Oppure acquistare un VPS, che senza introiti per mantenerlo diventa pur sempre una spesa anche nella sua forma minore.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Attento che l'IP può cambiare anche se lasci il router sempre acceso.
Almeno a me accade che di tanto in tanto mi mandino tipo un comando di Resync (o come volete chiamarlo) dalla centrale e il router perde la connessione e poi si riconnette.
(benché io non spenga mai il router e normalmente non cambi)

Dovresti almeno usare un servizio di DDNS secondo me.
Infatti lo uso (ad esempio per Penny) ma per creare le chiavi WSS è obbligatorio passare un IP; per questo, momentaneamente, avrò due coppie client+server, una con e una senza WSS. [Ripeto che quanto sto facendo DOVREBBE essere, alla fine, una sorta di template di base, non riguarda direttamente Penny]
 

Sagenut

Expert
Licensed User
Longtime User
Forse mi conviene fare in modo che i primi dati scambiati tra client e server siano in chiaro (comunque "sotto" WSS), l'utente venga autenticato tramite nome-utente e password e poi usare quest'ultima per la cifratura; che ne ditO?

P.S. potrei anche inviare al client, una volta autenticato l'utente, un codice che serva come chiave per la cifratura, ma tanto se qualcuno avesse scoperto nome-utente e password, riceverebbe comunque questo codice, no? Quindi tanto vale usare la sua password.
Appunto.....se viene sniffata la parte in chiaro salta tutto.
Eventualmente fare in modo che vengano scambiati alcuni dati univoci, tipo ID Dispositivo/Nome Utente/Password, e sia su server che su client ci sia un algoritmo personalizzato che calcoli la chiave sulla base di questi dati senza trasmetterla.
Idea balorda?
Se uno è bravo a decompilare scova tutto.
Diverse volte mi sono messo a pensare a questa situazione e...............BOH.
 

LucaMs

Expert
Licensed User
Longtime User
io penso che sebbene ci voglia un minimo di protezione, impelagarsi cercando la soluzione estrema che migliori anche i server della NASA forse è solo una perdita di tempo, una scusa per non andare avanti
Per una volta non è così. Ricordi quando in A9 entrava un tizio e si metteva record irraggiungibili, non realizzabili? A quel punto gli altri non giocherebbero più; mentre adesso... non giocano lo stesso :D
 

LucaMs

Expert
Licensed User
Longtime User
Lo dico da anni, ormai: l'"Uomo" diventerà "eternamente giovane" (a 25 anni gli si farà un "vaccino" e rimarrà per sempre 25ne). Questo entro 2 o 3 secoli al massimo.
In questo momento sto vedendo un film, "In time".

Esattamente a 25 anni le cellule dei protagonisti smetteranno di invecchiare!

(poi c'è dietro tutta una storia senza senso; l'unico senso "logico" è che i ricchi saranno sempre ricchi ed i poveri sempre poveri)
 

LordZenzo

Well-Known Member
Licensed User
Longtime User
Ricordi quando in A9 entrava un tizio e si metteva record irraggiungibili
veramente non lo ha fatto nessuno, per entrare in un db mysql ci vuole comunque la password , oltre a saperne IP e username, e sono dati non facilmente estrapolabili dal apk, che comunque è protetto da android
 

LucaMs

Expert
Licensed User
Longtime User
I permessi che vengono visualizzati sul mio vecchio smartphone (Android 4.0.4) installando un progetto B4A completamente vuoto:

upload_2018-6-15_2-4-26.png


1) che ne pensate?
2) "Lettura dati di registro sensibili", che in italiano può terrorizzare, in inglese è "solo": "Read sensitive log data".

Perché poi dovrebbe richiedere l'accesso alla scheda SD (suppongo che intenda proprio la scheda "esterna")?

Notare che l'IDE, invece, indica che non sono richiesti permessi.
 

Sagenut

Expert
Licensed User
Longtime User
Forse per via del TargetSDK a 26?
 

LucaMs

Expert
Licensed User
Longtime User
Pare che visualizzi quell'avvertimento solo se installo in modalità debug e solo tramite bridge!

Va beh, niente di preoccupante, quindi (già, avrei potuto provare ad installare direttamente l'apk, salvandolo nella Root; scommetto che non avrebbe visualizzato quella dialog).


P.S. Infatti, è così.
 

LucaMs

Expert
Licensed User
Longtime User
Povero "Chiacchiericci", sta "per morendo" :D

Allora aggiungo un post serio ed utilissimo:

la prossimo app che pubblicherò si chiamerà:

"Elemosinatemi" (con tanto di traduzione in svariate lingue).

Speriamo che abbia successo :(

:p
 
Top