Storage and Metadata - Italian translation added
This commit is contained in:
parent
073bdaeb56
commit
35d9bf5a91
@ -89,7 +89,7 @@ I metadati di un oggetto sono una o più coppie chiave-valore custodite in esso.
|
|||||||
Chiave-valore significa che si usa un nome (la chiave) per accedere al dato corrispettivo (il valore).
|
Chiave-valore significa che si usa un nome (la chiave) per accedere al dato corrispettivo (il valore).
|
||||||
Alcune chiavi hanno significati predefiniti, come `description` che è usato per specificare la descrizione
|
Alcune chiavi hanno significati predefiniti, come `description` che è usato per specificare la descrizione
|
||||||
di una pila di oggetti.
|
di una pila di oggetti.
|
||||||
Questo sarà trattato più dettagliatamente nel capitolo Metadati e Storage.
|
Questo sarà trattato più in dettaglio nel capitolo Storaggio e Metadati.
|
||||||
|
|
||||||
## Collocazione inventari
|
## Collocazione inventari
|
||||||
|
|
||||||
|
@ -1,73 +1,65 @@
|
|||||||
---
|
---
|
||||||
title: Storage and Metadata
|
title: Storaggio e metadati
|
||||||
layout: default
|
layout: default
|
||||||
root: ../..
|
root: ../..
|
||||||
idx: 3.3
|
idx: 3.3
|
||||||
description: Mod Storage, NodeMetaRef (get_meta).
|
description: Scopri come funziona lo spazio d'archiviazione delle mod e come usare i metadati per passare informazioni.
|
||||||
redirect_from:
|
redirect_from:
|
||||||
- /en/chapters/node_metadata.html
|
- /it/chapters/node_metadata.html
|
||||||
- /en/map/node_metadata.html
|
- /it/map/node_metadata.html
|
||||||
---
|
---
|
||||||
|
|
||||||
## Introduction <!-- omit in toc -->
|
## Introduction <!-- omit in toc -->
|
||||||
|
|
||||||
In this chapter, you will learn how you can store data.
|
In questo capitolo imparerai i vari modi per immagazzinare dati.
|
||||||
|
|
||||||
- [Metadata](#metadata)
|
- [Metadati](#metadati)
|
||||||
- [What is Metadata?](#what-is-metadata)
|
- [Cos'è un metadato?](#cos-e-un-metadato)
|
||||||
- [Obtaining a Metadata Object](#obtaining-a-metadata-object)
|
- [Ottenere i metadati di un oggetto](#ottenere-i-metadati-di-un-oggetto)
|
||||||
- [Reading and Writing](#reading-and-writing)
|
- [Lettura e scrittura](#lettura-e-scrittura)
|
||||||
- [Special Keys](#special-keys)
|
- [Chiavi speciali](#chiavi-speciali)
|
||||||
- [Storing Tables](#storing-tables)
|
- [Immagazzinare tabelle](#immagazzinare-tabelle)
|
||||||
- [Private Metadata](#private-metadata)
|
- [Metadati privati](#metadati-privati)
|
||||||
- [Lua Tables](#lua-tables)
|
- [Tabelle Lua](#tabelle-lua)
|
||||||
- [Mod Storage](#mod-storage)
|
- [Storaggio mod](#storaggio-mod)
|
||||||
- [Databases](#databases)
|
- [Database](#database)
|
||||||
- [Deciding Which to Use](#deciding-which-to-use)
|
- [Decidere quale usare](#decidere-quale-usare)
|
||||||
- [Your Turn](#your-turn)
|
- [Il tuo turno](#il-tuo-turno)
|
||||||
|
|
||||||
## Metadata
|
## Metadati
|
||||||
|
|
||||||
### What is Metadata?
|
### Cos'è un metadato?
|
||||||
|
|
||||||
In Minetest, Metadata is a key-value store used to attach custom data to something.
|
In Minetest, un metadato è una coppia chiave-valore usata per collegare dei dati a qualcosa.
|
||||||
You can use metadata to store information against a Node, Player, or ItemStack.
|
Puoi usare i metadati per salvare informazioni nei nodi, nei giocatori o negli ItemStack.
|
||||||
|
|
||||||
Each type of metadata uses the exact same API.
|
Ogni tipo di metadato usa la stessa identica API.
|
||||||
Metadata stores values as strings, but there are a number of methods to
|
Ognuno di essi salva i valori come stringhe, ma ci sono comunque dei metodi per convertire e salvare altri tipi di primitivi.
|
||||||
convert and store other primitive types.
|
|
||||||
|
|
||||||
Some keys in metadata may have special meaning.
|
Per evitare conflitti con altre mod, dovresti usare la nomenclatura convenzionale per le chiavi: `nomemod:nomechiave`.
|
||||||
For example, `infotext` in node metadata is used to store the tooltip which shows
|
Alcune chiavi hanno invece un significato speciale, come vedremo più in basso.
|
||||||
when hovering over the node using the crosshair.
|
|
||||||
To avoid conflicts with other mods, you should use the standard namespace
|
|
||||||
convention for keys: `modname:keyname`.
|
|
||||||
The exception is for conventional data such as the owner name which is stored as
|
|
||||||
`owner`.
|
|
||||||
|
|
||||||
Metadata is data about data.
|
Ricorda che i metadati sono dati riguardo altri dati.
|
||||||
The data itself, such as a node's type or an stack's count, is not metadata.
|
Il dato in sé, come il tipo di un nodo o la quantità di un ItemStack, non rientra perciò nella definizione.
|
||||||
|
|
||||||
### Obtaining a Metadata Object
|
### Ottenere i metadati di un oggetto
|
||||||
|
|
||||||
If you know the position of a node, you can retrieve its metadata:
|
Se si conosce la posizione di un nodo, si possono ottenere i suoi metadati:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local meta = minetest.get_meta({ x = 1, y = 2, z = 3 })
|
local meta = minetest.get_meta({ x = 1, y = 2, z = 3 })
|
||||||
```
|
```
|
||||||
|
|
||||||
Player and ItemStack metadata are obtained using `get_meta()`:
|
Quelli dei giocatori e degli ItemStack invece sono ottenuti tramite `get_meta()`:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local pmeta = player:get_meta()
|
local p_meta = player:get_meta()
|
||||||
local imeta = stack:get_meta()
|
local i_meta = pila:get_meta()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Reading and Writing
|
### Lettura e scrittura
|
||||||
|
|
||||||
In most cases, `get_<type>()` and `set_<type>()` methods will be used to read
|
Nella maggior parte dei casi, per leggere e scrivere metadati saranno usati i metodi `get_<type>()` e `set_<type>()`.
|
||||||
and write to meta.
|
|
||||||
Metadata stores strings, so the string methods will directly set and get the value.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
print(meta:get_string("foo")) --> ""
|
print(meta:get_string("foo")) --> ""
|
||||||
@ -75,15 +67,12 @@ meta:set_string("foo", "bar")
|
|||||||
print(meta:get_string("foo")) --> "bar"
|
print(meta:get_string("foo")) --> "bar"
|
||||||
```
|
```
|
||||||
|
|
||||||
All of the typed getters will return a neutral default value if the key doesn't
|
Tutti i getter ritorneranno un valore di default se la chiave non esiste, rispettivamente `""` per le stringhe e `0` per gli interi.
|
||||||
exist, such as `""` or `0`.
|
Si può inoltre usare `get()` per ritornare o una stringa o nil.
|
||||||
You can use `get()` to return a string or nil.
|
|
||||||
|
|
||||||
As Metadata is a reference, any changes will be updated to the source automatically.
|
Come gli inventari, anche i metadati sono riferimenti: ogni cambiamento applicato ad essi, cambierà la fonte originale.
|
||||||
ItemStacks aren't references however, so you'll need to update the itemstack in the
|
|
||||||
inventory.
|
|
||||||
|
|
||||||
The non-typed getters and setters will convert to and from strings:
|
Inoltre, se è possibile convertire un intero in stringa e viceversa, basterà cambiare `get_int`/`get_string` per ottenerne la versione corrispondente:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
print(meta:get_int("count")) --> 0
|
print(meta:get_int("count")) --> 0
|
||||||
@ -92,48 +81,42 @@ print(meta:get_int("count")) --> 3
|
|||||||
print(meta:get_string("count")) --> "3"
|
print(meta:get_string("count")) --> "3"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Special Keys
|
### Chiavi speciali
|
||||||
|
|
||||||
`infotext` is used in Node Metadata to show a tooltip when hovering the crosshair over a node.
|
`infotext` è usato nei nodi per mostrare una porzione di testo al passare il mirino sopra il nodo.
|
||||||
This is useful when showing the ownership or status of a node.
|
Questo è utile, per esempio, per mostrare lo stato o il proprietario di un nodo.
|
||||||
|
|
||||||
`description` is used in ItemStack Metadata to override the description when
|
`description` è usato negli ItemStack per sovrascrivere la descrizione al passare il mouse sopra l'oggetto in un formspec (come l'inventario, li vedremo più avanti).
|
||||||
hovering over the stack in an inventory.
|
È possibile utilizzare `minetest.colorize()` per cambiarne il colore.
|
||||||
You can use colours by encoding them with `minetest.colorize()`.
|
|
||||||
|
|
||||||
`owner` is a common key used to store the username of the player that owns the
|
`owner` è una chiave comune, usata per immagazzinare il nome del giocatore a cui appartiene l'oggetto o il nodo.
|
||||||
item or node.
|
|
||||||
|
|
||||||
### Storing Tables
|
### Immagazzinare tabelle
|
||||||
|
|
||||||
Tables must be converted to strings before they can be stored.
|
Le tabelle devono essere convertite in stringhe prima di essere immagazzinate.
|
||||||
Minetest offers two formats for doing this: Lua and JSON.
|
Minetest offre due formati per fare ciò: Lua e JSON.
|
||||||
|
|
||||||
The Lua method tends to be a lot faster and matches the format Lua
|
Quello in Lua tende a essere molto più veloce e corrisponde al formato usato da Lua per le tabelle, mentre JSON è un formato più standard, con una miglior struttura, e che ben si presta per scambiare informazioni con un altro programma.
|
||||||
uses for tables, while JSON is a more standard format, is better
|
|
||||||
structured, and is well suited when you need to exchange information
|
|
||||||
with another program.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local data = { username = "player1", score = 1234 }
|
local data = { username = "utente1", score = 1234 }
|
||||||
meta:set_string("foo", minetest.serialize(data))
|
meta:set_string("foo", minetest.serialize(data))
|
||||||
|
|
||||||
data = minetest.deserialize(minetest:get_string("foo"))
|
data = minetest.deserialize(minetest:get_string("foo"))
|
||||||
```
|
```
|
||||||
|
|
||||||
### Private Metadata
|
### Metadati privati
|
||||||
|
|
||||||
Entries in Node Metadata can be marked as private, and not sent to the client.
|
Le voci nei metadati di un nodo possono essere segnate come private, senza venire quindi inviate al client (al contrario delle normali).
|
||||||
Entries not marked as private will be sent to the client.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
meta:set_string("secret", "asd34dn")
|
meta:set_string("segreto", "asd34dn")
|
||||||
meta:mark_as_private("secret")
|
meta:mark_as_private("segreto")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Lua Tables
|
### Tabelle Lua
|
||||||
|
|
||||||
You can convert to and from Lua tables using `to_table` and `from_table`:
|
Le tabelle possono essere convertite da/a stringhe nei metadati tramite `to_table` e `from_table`:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local tmp = meta:to_table()
|
local tmp = meta:to_table()
|
||||||
@ -141,107 +124,94 @@ tmp.foo = "bar"
|
|||||||
meta:from_table(tmp)
|
meta:from_table(tmp)
|
||||||
```
|
```
|
||||||
|
|
||||||
## Mod Storage
|
## Storaggio Mod
|
||||||
|
|
||||||
Mod storage uses the exact same API as Metadata, although it's not technically
|
Lo spazio d'archiviazione della mod (*storage*) usa la stessa identica API dei metadati, anche se non sono tecnicamente la stessa cosa.
|
||||||
Metadata.
|
Il primo infatti è per mod, e può essere ottenuto solo durante l'inizializzazione - appunto - della mod.
|
||||||
Mod storage is per-mod, and can only be obtained during load time in order to
|
|
||||||
know which mod is requesting it.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local storage = minetest.get_mod_storage()
|
local memoria = minetest.get_mod_storage()
|
||||||
```
|
```
|
||||||
|
|
||||||
You can now manipulate the storage just like metadata:
|
Nell'esempio è ora possibile manipolare lo spazio d'archiviazione come se fosse un metadato:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
storage:set_string("foo", "bar")
|
memoria:set_string("foo", "bar")
|
||||||
```
|
```
|
||||||
|
|
||||||
## Databases
|
## Database
|
||||||
|
|
||||||
If the mod is likely to be used on a server and will store lots of data,
|
Se la mod ha buone probabilità di essere usata su un server e tenere traccia di un sacco di dati, è buona norma offrire un database come metodo di storaggio.
|
||||||
it's a good idea to offer a database storage method.
|
Dovresti rendere ciò opzionale, separando il come i dati vengono salvati e il dove vengono usati.
|
||||||
You should make this optional by separating how the data is stored and where
|
|
||||||
it is used.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local backend
|
local backend
|
||||||
if use_database then
|
if use_database then
|
||||||
backend =
|
backend =
|
||||||
dofile(minetest.get_modpath("mymod") .. "/backend_sqlite.lua")
|
dofile(minetest.get_modpath("miamod") .. "/backend_sqlite.lua")
|
||||||
else
|
else
|
||||||
backend =
|
backend =
|
||||||
dofile(minetest.get_modpath("mymod") .. "/backend_storage.lua")
|
dofile(minetest.get_modpath("miamod") .. "/backend_storage.lua")
|
||||||
end
|
end
|
||||||
|
|
||||||
backend.get_foo("a")
|
backend.get_foo("a")
|
||||||
backend.set_foo("a", { score = 3 })
|
backend.set_foo("a", { score = 3 })
|
||||||
```
|
```
|
||||||
|
|
||||||
The backend_storage.lua file should include a mod storage implementation:
|
Il file `backend_storage.lua` dell'esempio (puoi nominarlo come vuoi) dovrebbe includere l'implementazione del metodo di storaggio:
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local storage = minetest.get_mod_storage()
|
local memoria = minetest.get_mod_storage()
|
||||||
local backend = {}
|
local backend = {}
|
||||||
|
|
||||||
function backend.set_foo(key, value)
|
function backend.set_foo(key, value)
|
||||||
storage:set_string(key, minetest.serialize(value))
|
memoria:set_string(key, minetest.serialize(value))
|
||||||
end
|
end
|
||||||
|
|
||||||
function backend.get_foo(key, value)
|
function backend.get_foo(key, value)
|
||||||
return minetest.deserialize(storage:get_string(key))
|
return minetest.deserialize(memoria:get_string(key))
|
||||||
end
|
end
|
||||||
|
|
||||||
return backend
|
return backend
|
||||||
```
|
```
|
||||||
|
|
||||||
The backend_sqlite would do a similar thing, but use the Lua *lsqlite3* library
|
Il file `backend_sqlite.lua` dovrebbe fare una cosa simile, ma utilizzando la libreria Lua *lsqlite3* al posto della memoria d'archiviazione interna.
|
||||||
instead of mod storage.
|
|
||||||
|
|
||||||
Using a database such as SQLite requires using an insecure environment.
|
Usare un database come SQLite richiede l'utilizzo di un ambiente non sicuro (*insecure environment*).
|
||||||
An insecure environment is a table that is only available to mods
|
Un ambiente non sicuro è una tabella disponibile solamente alle mod con accesso esplicito dato dall'utente, e contiene una copia meno limitata della API Lua, che potrebbe essere abusata da mod con intenzioni malevole.
|
||||||
explicitly whitelisted by the user, and it contains a less restricted
|
Gli ambienti non sicuri saranno trattati più nel dettaglio nel capitolo sulla [Sicurezza](../quality/security.html).
|
||||||
copy of the Lua API which could be abused if available to malicious mods.
|
|
||||||
Insecure environments will be covered in more detail in the
|
|
||||||
[Security](../quality/security.html) chapter.
|
|
||||||
|
|
||||||
```lua
|
```lua
|
||||||
local ie = minetest.request_insecure_environment()
|
local amb_nonsicuro = minetest.request_insecure_environment()
|
||||||
assert(ie, "Please add mymod to secure.trusted_mods in the settings")
|
assert(amb_nonsicuro, "Per favore aggiungi miamod a secure.trusted_mods nelle impostazioni")
|
||||||
|
|
||||||
local _sql = ie.require("lsqlite3")
|
local _sql = amb_nonsicuro.require("lsqlite3")
|
||||||
-- Prevent other mods from using the global sqlite3 library
|
-- Previene che altre mod usino la libreria globale sqlite3
|
||||||
if sqlite3 then
|
if sqlite3 then
|
||||||
sqlite3 = nil
|
sqlite3 = nil
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
Teaching about SQL or how to use the lsqlite3 library is out of scope for this book.
|
Spiegare il funzionamento di SQL o della libreria lsqlite non rientra nell'obiettivo di questo libro.
|
||||||
|
|
||||||
## Deciding Which to Use
|
## Decidere quale usare
|
||||||
|
|
||||||
The type of method you use depends on what the data is about,
|
Il tipo di metodo che si sceglie di utilizzare dipende dal tipo di dati trattati, come sono formattati e quanto sono grandi.
|
||||||
how it is formatted, and how large it is.
|
In linea di massima, i dati piccoli vanno fino ai 10KB, quelli medi 10MB, e quelli grandi oltre i 10MB.
|
||||||
As a guideline, small data is up to 10K, medium data is up to 10MB, and large
|
|
||||||
data is any size above that.
|
|
||||||
|
|
||||||
Node metadata is a good choice when you need to store node-related data.
|
I metadati dei nodi sono un'ottima scelta quando si vogliono immagazzinare dati relativi al nodo.
|
||||||
Storing medium data is fairly efficient if you make it private.
|
Inserirne di medi (quindi massimo 10MB) è abbastanza efficiente se si rendono privati.
|
||||||
|
|
||||||
Item metadata should not be used to store anything but small amounts of data as it is not
|
Quelli degli oggetti invece dovrebbero essere usati solo per piccole quantità di dati e non è possibile evitare di inviarli al client.
|
||||||
possible to avoid sending it to the client.
|
I dati, poi, saranno anche copiati ogni volta che la pila viene spostata o ne viene fatto accesso tramite Lua.
|
||||||
The data will also be copied every time the stack is moved, or accessed from Lua.
|
|
||||||
|
|
||||||
Mod storage is good for medium data but writing large data may be inefficient.
|
La memoria interna della mod va bene per i dati di medie dimensioni, tuttavia provare a salvarne di grandi potrebbe rivelarsi inefficiente.
|
||||||
It's better to use a database for large data to avoid having to write all the
|
È meglio usare un database per le grandi porzioni di dati, onde evitare di dover sovrascrivere tutti i dati a ogni salvataggio.
|
||||||
data out on every save.
|
|
||||||
|
|
||||||
Databases are only viable for servers due to the
|
I database sono fattibili solo per i server a causa della necessità di lasciar passare la mod nell'ambiente non sicuro.
|
||||||
need to whitelist the mod to access an insecure environment.
|
Si prestano bene per i grandi ammontare di dati.
|
||||||
They're well suited for large data sets.
|
|
||||||
|
|
||||||
## Your Turn
|
## Il tuo turno
|
||||||
|
|
||||||
* Make a node which disappears after it has been punched five times.
|
* Crea un nodo che sparisce dopo essere stato colpito cinque volte.
|
||||||
(Use `on_punch` in the node definition and `minetest.set_node`.)
|
(Usa `on_punch` nella definizione del nodo e `minetest.set_node`)
|
||||||
|
@ -16,11 +16,11 @@ Minetest fornisce due metodi per fare ciò: gli ABM (*Active Block Modifiers*, M
|
|||||||
|
|
||||||
Gli ABM scansionano tutti i Blocchi Mappa alla ricerca dei nodi che rientrano nei canoni:
|
Gli ABM scansionano tutti i Blocchi Mappa alla ricerca dei nodi che rientrano nei canoni:
|
||||||
essi sono quindi ottimali per quei nodi che si trovano con frequenza in giro per il mondo, come l'erba.
|
essi sono quindi ottimali per quei nodi che si trovano con frequenza in giro per il mondo, come l'erba.
|
||||||
Possiedono un alto consumo della CPU, senza invece pressoché impattare sulla memoria e lo storage.
|
Possiedono un alto consumo della CPU, senza invece pressoché impattare sulla memoria e lo spazio d'archiviazione.
|
||||||
|
|
||||||
Per i nodi invece non troppo comuni o che già usano metadati, come le fornaci e i macchinari, dovrebbero venire impiegati i timer.
|
Per i nodi invece non troppo comuni o che già usano metadati, come le fornaci e i macchinari, dovrebbero venire impiegati i timer.
|
||||||
I timer dei nodi tengon traccia dei timer accodati in ogni Blocco Mappa, eseguendoli quando raggiungono lo zero.
|
I timer dei nodi tengon traccia dei timer accodati in ogni Blocco Mappa, eseguendoli quando raggiungono lo zero.
|
||||||
Ciò significa che non hanno bisogno di cercare tra tutti i nodi caricati per trovare un match, bensì, richiedendo un po' più di memoria e storage, vanno alla ricerca dei soli nodi con un timer in corso.
|
Ciò significa che non hanno bisogno di cercare tra tutti i nodi caricati per trovare un match, bensì, richiedendo un po' più di memoria e spazio d'archiviazione, vanno alla ricerca dei soli nodi con un timer in corso.
|
||||||
|
|
||||||
- [Timer dei nodi](#timer-dei-nodi)
|
- [Timer dei nodi](#timer-dei-nodi)
|
||||||
- [ABM: modificatori di blocchi attivi](#abm-modificatori-di-blocchi-attivi)
|
- [ABM: modificatori di blocchi attivi](#abm-modificatori-di-blocchi-attivi)
|
||||||
|
Loading…
Reference in New Issue
Block a user