Robitex's Blog

Ideas in the web

Archivi Mensili: dicembre 2012

Il passaggio della stazione spaziale


L’attesa

Da un po’ di tempo scrutavo il cielo al momento giusto ma era sempre nuvoloso. Avevo il dubbio che l’orario non fosse riferito all’ora locale oppure che la traiettoria prevista fosse in realtà un’altra oppure ancora che fosse difficile da vedere ad occhio nudo.
Ma finché il cielo fosse rimasto nuvoloso di certo non potevo verificare se effettivamente alla quota di circa 350 km ben al di sopra della coltre di nubi, fosse transitata la ISS, la stazione spaziale internazionale, alla velocità di 28000 km/h.

Finalmente, la moderna stella cometa

Invece, con incredibile precisione, stasera all’imbrunire il cielo terso mi ha permesso finalmente di osservare il passaggio della stazione spaziale internazionale per alcuni minuti, dalla direzione Nord Nord Ovest a quella di Nord Est. Fantastico.
Un punto luminoso, più luminoso di una stella, che viaggia tranquillo su una traiettoria apparentemente rettilinea…

L’equipaggio della stazione che nell’esatto momento in cui io li guardavo da terra, affacciandosi al finestrino avrebbero visto il panorama della foto seguente, è composto da tre persone: il comandante Kevin Ford ed i due ingegneri di volo Oleg Novitskiy e Evgeny Tarelkin.

iss web cam

The ISS web cam

Come ho fatto?

Semplice, mi sono collegato al portale della Nasa ed alla pagina spot the station ho inserito località di residenza ed indirizzo di posta elettronica al quale ricevere i messaggi con l’ora del passaggio e le coordinate di avvistamento della ISS.

Buon 2013 a tutti

Non rimane che scaricare il calendario in tema (ancora del 2012) e godersi lo spettacolo augurandovi di trascorrere uno splendido nuovo anno.
Buon anno a tutti.
R.

Fine del mondo!


Oggi finisce il mondo.

Per quelli che ci credono, per quelli che invece non ci credono e per quelli che poi quando capiterà effettivamente non ci crederanno perché il 21/12/2012 non successe nulla…

Buona fine del mondo,

e buon inizio…

Iterare su SQLite con Lua


Sommario

Riferendoci alla libreria LJSqlite3 verrà spiegato come iterare facilmente la collezione di dati di un database relazionale attraverso una query. Verranno inoltre messe in evidenza le proprietà dell’iteratore ai fini della pulizia e dell’intuitività del codice Lua.

Effective code

È sempre molto utile scrivere codice che sia espressivo e compatto, qualità che potremo riassumere in un unico termine idiomatico: effective.
Gli iteratori di Lua, che abbiamo già visto in questo post, sono costrutti sintattici che semplificano il nostro codice facendo corrispondere un concetto/entità con un elemento del linguaggio.
Lo sviluppatore costruisce così strutture concettualmente vicine a ciò che asserisce al problema da risolvere.

L’ambiente di lavoro

Utilizzeremo il database SQLite3 per creare, inserire ed interrogare i dati, e la libreria LJSqlite3 per LuaJIT un compilatore Lua, per creare il codice applicativo.
Sul vostro sistema dovranno essere installati sia SQLite3, che LuaJIT, e le librerie Xsys e LJSQLite3 scaricabili dai rispettivi siti e disponibili per quasi tutti i sistemi operativi.

Inoltre lavoreremo con un (semplice) database in modalità in-memory cioé interamente mantenuto nella memoria centrale, così che tutto il codice di esempio possa trovare posto in un unico file.

L’iteratore Lua

Il nostro obiettivo è scrivere un iteratore ‘stateless‘ in Lua che ad ogni ciclo ci metta a disposizione record per record, il risultato di una query.
Chiamando l’iteratore ‘iselect()‘ potremo prevedere per esso due argomenti: la connessione al database e la query da eseguire. Per concretizzare l’idea, lasciando i dettagli ad un secondo momento, il codice per stampare l’intero contenuto della tabella di esempio ‘val‘ con i suoi attributi ‘id‘ e ‘num‘ potrebbe essere il seguente:

for i, tr in iselect(conn, "SELECT * FROM val;") do
    print( 'Row '..i..': ', tr.id, tr.num)
end

L’iteratore ad ogni ciclo del ‘generic for’ ritorna il progressivo del record e la ‘tupla’ (una tabella Lua ovviamente) con i valori dei campi indicizzati con chiavi corrispondenti ai nomi degli attributi della tabella del database.

Passiamo ora al codice completo dell’esempio con l’implementazione dell’iteratore definito precedentemente. Non spiegherò il listato nei dettagli tecnici rimandando il lettore alle documentazioni dei singoli componenti peraltro scritte piuttosto bene. Eseguire il codice con il comando $ luajit nomefile.lua.

-- iterator function
local function nextrec(t, i)
    i = i + 1
    if i <= t.__number_of_records then
        local tr = {}
        local nc = #t[0]
        for col=1, nc do
            local field = t[0][col]
            tr[field] = t[col][i]
        end
        return i, tr
    end
end

-- stateless iterator
local function iselect(connection, query)
    local t, nr = connection:exec(query, 'hi')
    t.__number_of_records = nr
    return nextrec, t, 0
end

-- SQL code

local sql = require "ljsqlite3"
-- Open a temporary in-memory database.
local conn = sql.open("")

-- Execute SQL commands separated by the ';'
conn:exec[[
CREATE TABLE val (id TEXT, num REAL);

INSERT INTO val VALUES('myid1', 260);
INSERT INTO val VALUES('myid2', 200);
INSERT INTO val VALUES('myid3', 200);
INSERT INTO val (id) VALUES('myid4');
INSERT INTO val (num) VALUES(200);
INSERT INTO val VALUES('myid6', 260);
INSERT INTO val VALUES('myid7', 201);
INSERT INTO val VALUES('myid8', 300);
INSERT INTO val VALUES('myid9', 240);
]]

-- user code
for i, tr in iselect(conn, "SELECT * FROM val;") do
    print( 'Row '..i..': ', tr.id, tr.num)
end
conn:close()

Conclusioni

Oltre a confermare l’intuitività e la semplicità degli iteratori in Lua, abbiamo dimostrato come SQLite3 e le librerie LuaJIT per accedervi, siano in grado di fornire una soluzione performante e potente per la creazione di applicativi non di rete.

Un saluto.

%d blogger hanno fatto clic su Mi Piace per questo: