Salta al contenuto principale

Turnip.best

·767 parole·4 minuti
Autore
Lorenzo Cecchelli
A little bit about me

Turnip.best – diario di bordo di un (mini-)social dedicato al mercato delle rape di Animal Crossing
#

«Compra la domenica, vendi quando il prezzo schizza… e spera che non marciscano!»
Ogni giocatore di Animal Crossing: New Horizons™ conosce bene l’adrenalina (e la disperazione) del cosiddetto Stalk Market.
Io – studente di Ingegneria Informatica e programmatore part-time – ho deciso di trasformare quella frenesia settimanale in un progetto universitario: così è nato turnip.best, una web-app che unisce tracker di prezzi, statistica spicciola e un pizzico di social network.


1 · Perché nasce turnip.best
#

  1. Problem solving “videoludico”
    Nel gioco i prezzi delle rape cambiano due volte al giorno e variano da isola a isola. Annotarli su un foglietto (o peggio, ricordarli a memoria) è scomodo e poco preciso.

  2. Apprendimento full-stack “hands-on”
    Volevo mettere alla prova tutto lo stack LAMP studiato a lezione: PHP 8, MySQL 8, HTML 5 e un po’ di JavaScript vanilla.

  3. Esperimento social
    Il progetto doveva includere una componente di interazione tra utenti: non solo “il mio database”, ma un mini-social in cui condividere i prezzi e seguire le isole degli amici.


2 · Obiettivi didattici
#

Obiettivo Come l’ho affrontato
Modellare dati complessi Tabelle MySQL per utenti, isole, prezzi e transazioni con chiavi esterne ben definite.
Gestire autenticazione e privacy Login/registrazione tradizionali (bcrypt + prepared statements) e flag «account privato/pubblico».
UI/UX responsive Layout mobile-first, palette ispirata ai verdi pastello di ACNH, icone material design.
Analisi dei dati Saldo settimanale, guadagno/perdita, classifiche globali in tempo reale.
Deploy e monitoraggio VPS con nginx + php-fpm, HTTPS via Let’s Encrypt e Matomo per analytics self-hosted (GDPR-friendly).

3 · Funzionalità chiave
#

3.1 Home / Podio mondiale
#

  • Classifica live con i 3 migliori prezzi dell’intervallo (AM/PM) corrente.
  • Link rapido all’isola dell’utente in classifica per organizzare speed-run di vendite.

3.2 Registrazione intelligente
#

  • Nuova isola: inserisci nome e frutto endemico.
  • Isola preesistente: digita l’ID dell’isola di un amico, diventate subito coinquilini (una console, più giocatori).

3.3 La mia isola
#

  • Inserimento prezzi: una card per ogni fascia oraria.
  • Bilancio settimanale: spesa, guadagno e netto (con distinzione fra vendite “in casa” e su isole altrui).
  • Selettore di settimana (anno · mese · settimana) + pulsante “oggi”.

3.4 Arcipelago
#

  • Motore di ricerca per ID utente/isola.
  • Anteprima delle isole pubbliche e dei tuoi amici.
  • Se l’isola è privata, puoi inviare una richiesta d’amicizia in stile “NookLink”.

3.5 Account
#

  • Dashboard con i tuoi ID (utente e isola) per farti trovare.
  • Switch private/public con un click.
  • Transfer ownership: se l’isola è condivisa puoi nominare un nuovo admin prima di abbandonare il progetto.

4 · Architettura in breve
#

graph LR;
  A[Browser] -->|HTTPS| B(nginx)
  B --> C(PHP-FPM)
  C --> D[(MySQL)]
  C --> E[File Storage]
  C --> F[Matomo Tracker]
Server: Debian 12 su VPS low-cost.

Backend: PHP 8.3 – paradigma MVC leggero, senza framework pesanti.

Database: MySQL 8 con viste per aggregati settimanali.

Front-end: HTML 5 + CSS grid/flex; un pizzico di JS per AJAX “refresh” e modali.

Analytics: Matomo auto-ospitato (no cookie banner, tracking anonimo).


5 · Sfide e soluzioni
#

Sfida Soluzione
Prezzi condivisi su isole multi-utente Separazione logica tra tabella isola (prezzi) e tabella utente (quantità acquistata).
Date del gioco vs date reali Funzione helper che allinea i timestamp al fuso orario della console (UTC-12…UTC+14) e normalizza in DB.
Prevenire spam di richieste d’amicizia Rate-limiting a livello di controller con un semplice token bucket in RAM.
Pulizia dati vecchi Job cron settimanale: archivio in tabelle *_history e cancello record > 90 giorni.

6 · Cosa ho imparato
#

  • Domain-driven design in piccolo: modellare l’economia di ACNH mi ha costretto a identificare “entità” e “aggregate roots” in modo rigoroso.
  • Usabilità over feature-creep: gli utenti vogliono al massimo tre click per registrare un prezzo, tutto il resto viene dopo.
  • DevOps 101: dal certificato SSL ai log di errore PHP, il deploy fa parte del progetto, non è “l’ultima nottata”.

7 · Prospettive future
#

  • API REST pubblica per integrare bot Discord / Telegram.
  • Notifiche push quando un amico supera una soglia prezzo configurabile.
  • Grafici predittivi (algoritmo di Ninji) per stimare l’andamento settimanale.
  • Localizzazione: traduzioni in EN/ES/JP con file .po.

8 · Conclusione
#

Turnip.best è nato come esercizio universitario, ma si è trasformato in un piccolo laboratorio personale dove sperimentare tecnologie, pattern architetturali e buone pratiche di sicurezza – il tutto mascherato da utilità per far soldi virtuali con le rape.
Se anche voi siete stanchi di riempire il telefono di screenshot del prezzo di Nonno Porcello ogni mattina, fateci un giro:
https://turnip.best (account di prova senza credenziali sensibili nel manuale interno).

Happy selling, e che le stelline siano con voi! ✨