Saturday, June 17, 2017

Un po' di tools di base

La libreria standard di Python è fornitissima di funzioni pronte all'uso, ma per il nostro modesto lavoro di programmatori di software astrologico è bene che ci dotiamo di strumenti fatti apposta per lo scopo.

Per prima cosa apriremo un file tools.py con un editor a nostra scelta, in cui raccoglieremo tutte le funzioni che andremo via via creando in modo da poterle richiamare facilmente.

Per prime definiremo delle funzioni goniometriche di supporto alle operazioni sulle coordinate.

La libreria standard ha già queste funzioni, pero' si applicano ai gradi misurati in radianti (in cui l'angolo piatto vale 2 pigreco, per intenderci), mentre molte delle formule disponibili usano la misura in gradi.

Per prime le funzioni seno, coseno, tangente e arctangente2 (è la funzione inversa della tangente, ma a differenza della funzione arctangente normale effettua alcuni controlli sul segno degli operandi, risolvendo il dubbio sul corretto posizionamento dell'angolo nei quadranti, come si vede nellla tabella seguente):

Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> 
======== RESTART: /home/ubuntu/Scrivania/proveStroBlog/provaatan2.py ========
arctan(x) for x varying from 0° to 360° step 30°

x              atan(sin(x)/cos(x))     atan2(sin(x),cos(x))
 30.000               30.000               30.000
 60.000               60.000               60.000
 90.000               90.000               90.000
120.000              -60.000              120.000
150.000              -30.000              150.000
180.000               -0.000              180.000
210.000               30.000             -150.000
240.000               60.000             -120.000
270.000               90.000              -90.000
300.000              -60.000              -60.000
330.000              -30.000              -30.000
360.000               -0.000               -0.000
>>> 

Ecco le prime funzioni goniometriche in gradi e una funzione per riportare un angolo all'angolo giro fondamentale che toglie il segno meno se presente:

import math

def sin(x):
        return math.sin(math.radians(x))

def cos(x):
 return math.cos(math.radians(x))

def tan(x):
        return sin(x)/cos(x)

def atan(x):
        return math.degrees(math.atan(x))

def atan2(y , x):
 return math.degrees(math.atan2(y, x))

def reduce360(x):
 return x % 360.0

Ora ci servono due funzioni per convertire un angolo dalla notazione sessagesimale alla decimale e viceversa. Decido che il segno che compare davanti alle ore darà il segno a tutta la variable decimale, mentre, al contrario, nella conversione da decimale a sessagesimale solo le ore riceveranno un eventuale segno negativo. La funzione, oltre che alle ore, puo' applicarsi immodificata anche agli angoli, sempre in notazione sessagesimale.

def dms2ddd(hour, minute, second):
    """ from sexagesimal to decimal
        the sign of hour variable is automatically applied to minutes and seconds
    """
    if hour < 0:
        sign = -1
        hour *= sign
    else:
        sign = 1
    return (hour+minute/60.0+second/3600.0)*sign

def ddd2dms(dec_hour):
    """ from decimal to sexagesimal representation of hours and angles.
        the sign of dec_hour variable is applied only to hours variable
        see the dms2ddd function for comparison
    """
    if dec_hour < 0:
        sign = -1
        dec_hour *= sign
    else:
        sign = 1
    total_seconds = int(dec_hour * 3600.0+.5)
    seconds = total_seconds % 60 
    total_minutes = int((total_seconds - seconds)/60.0)
    minutes = total_minutes % 60 
    hours = int((total_minutes - minutes)/60.0)
    return (hours * sign, minutes, seconds)

Ci serve inoltre una funzione che converta una data dal formato giorno, mese, anno, ora minuto e secondo, scomodissimo per il calcolo, in quella comoda notazione che corrisponde alla data juliana.

def cal2jul(year, month, day, hour=0, minute=0, second=0):
    """ converts calendar date to julian date
        this routine and the following are built following Duffet Smith /Zwart instructions
        as given in Peter Duffett-Smith-Zwart Practical Astronomy with your Calculator or Spreadsheet
        Fourth Edition, Cambridge University Press, Fourth Ed. 2011
        For an easier use of the function, hours minutes and seconds are defaulted to 0, so it's
        not necessary to give them as parameters when the hour is 00:00:00 
    """
    month2 = month
    year2 = year
    if month2 <= 2:
        year2 -= 1
        month2 += 12
    else:
        pass
    if (year*10000 + month*100 + day) >= 15821015:
        a = math.trunc(year2/100.0)
        b = 2 - a + math.trunc(a/4.0)
    else:
        a = 0
        b = 0
    if year < 0:
        c = math.trunc((365.25 * year2)-0.75)
    else:
        c = math.trunc(365.25 * year2)
    d = math.trunc(30.6001 *(month2 + 1))
    return b + c + d + day + hour / 24.0 + minute / 1440.0 + second / 86400.0 + 1720994.5

Infine ecco due funzioni che servono per il calcolo del tempo siderale di Greenwich e del tempo siderale locale, necessari ad allineare il tempo locale con un riferimento alle cosiddette "stelle fisse" (che tanto fisse non sono, ma per noi astrologi il riferimento statico è l'eclittica e la sua divisione in segni zodiacali, che, per inciso, non c'entrano niente con le costellazioni).

def ut2gst(year, month, day, hour, minute, second):
    """ Sidereal time is a time-keeping system astronomers use to keep track of the direction to point
        their telescopes to view a given star in the night sky.
        Briefly, sidereal time is a "time scale that is based on the Earth's rate of rotation measured
        relative to the fixed stars." (source Wikipedia)
        This routine converts Universal Time to Sidereal Time for Greenwich (Greenwich Sidereal Time)
    """
    jd = cal2jul(year, month, day)
    S = jd - 2451545.0
    T = S/36525.0
    T0 = (6.697374558 + 2400.051336 * T+ 0.000025862 *T*T) % 24
    UT = dms2ddd(hour, minute, second)*1.002737909
    GST = (UT + T0) % 24
    return GST

e

def gst2lst( gst, long_degree, long_minute, long_second=0):
    """ Corrects GST for a different location on the Earth
    """
    lg = dms2ddd(long_degree, long_minute, long_second)/15.
    lst = (gst + lg) % 24.
    return lst

Nel prossimo post vedremo qual è il significato di queste due ultime funzioni.

Tuesday, June 13, 2017

Trovare le coordinate e la timezone di un luogo

Prima di entrare nel merito delle tecniche di calcolo della domificazione, dobbiamo risolvere un problema: come trovo, in modo programmatico, le coordinate di un luogo geografico? Posso usare un datebase di località, naturalmente, vi ho già mostrato come ricavare una semplice tabella con milioni di località e trasformarla in un database sqlite, qualche post addietro, abbiamo anche costruito un widget apposito. Il problema è che i database sono, in genere, molto pesanti da portarsi dietro, si arriva facilmente a qualche decina di mega e non è detto che siamo sempre in condizioni di installarli nel memoria di un dispositivo, se abbiamo qualche limitazione di risorse.

Considerato che il web è un enorme deposito di informazioni, comprese quelle di natura geografica, possiamo pensare, volendo, a utilizzare un servizio REST come quello che mette a disposizione Google: Google Maps Geocoding API, che è gratuito per usi limitati e richiede l'apertura di un account, una API key, e il pagamento oltre una certa soglia di utilizzo, oppure quello di geonames.org che è il sito che mette a disposizione quell'enorme database che ho usato per costruire il mio widget e sicuramente molti altri.

Oggi voglio invece provare a usare un metodo più ruvido e gratuito, basato su wikipedia e su alcune librerie python. Ve ne parlo succintamente, un trafiletto per ogni libreria.

Wikipedia

Per ogni luogo nel mondo, per quanto piccolo, Wikipedia fornisce una pagina in cui sono riportate le coordinate geografiche del luogo. Spulciando nel sorgente della pagina, non è difficile individuarle ed estrarle usando le tecniche delle espressioni regolari, presenti nella Python Standard Library. Preferisco, fra tutte, l'edizione inglese, cosa di cui dobbiamo tener conto quando cerchiamo un nome di città. In quel grande contenitore di librerie python che è Pypi ho trovato un'API per wikipedia pronta per l'uso, che dovremo quindi installare preliminarmente :

# Se non l'avete già fatto:
sudo pip install python-pip <Invio>
# quindi usate pip per installare wikipedia
pip install wikipedia <Invio>

Per la necessità o meno di usare i diritti di amministratore o per Windows o Mac vi prego di controllare la documentazione relativa all'uso di pip. La libreria python wikipedia è soggetta a licenza MIT.

Requests: HTTP for Humans

Se avete mai usato urllib e urlib2 apprezzerete questo piccolo gioiello di Kenneth Reitz, che consente di accedere al contenuto di una pagina web, anche in forma di xml o json dove previsto, in un soffio.

Per installare questa libreria si procede come prima:

pip install requests

La licenza d'uso è Apache 2.0

timezonefinder

Se Wikipedia ci aiuta moltissimo a trovare le coordinate geografiche, usa una rappresentazione della timezone del luogo basata sullo scarto orario da UTC, che diventa complicata da gestire. Con questa libreria posso facilmente ottenere, in base alle coordinate geografiche, la timezone del luogo espressa come "Europe/Rome" e simili, lasciando ad altre librerie il compito di gestire l'ora estiva

Installazione:

pip install timezonefinder

La libreria è di J. Michelfeit, ed è pubblicata su Pypi con licenza MIT

MyLittleTownFinder

Veniamo dunque al codice con cui gestire tutte le complesse operazioni di ricerca ed estrazione delle coordinate geografiche.

Wikipedia è abbastanza regolare nel catalogare i nomi di città, per cui di fronte a toponimi unici, di solito basta comporre l'url così: https://en.wikipedia.org/wiki/nomedelposto e siamo nella pagina giusta. Non sempre è così semplice, per esempio se un nome di città è riportato più volte, per esempio Paris è la capitale della Francia, ma anche una ridente località del Texas (che ha dato il titolo ad un bellissimo film di Wim Wenders).

In questo e simili casi, dobbiamo escogitare un trucco per individuare la pagina di interesse tra le molte possibili. La prima funzione che vi presento, debitamente commentata, fa proprio questo.

import sys
import re
import requests
import wikipedia as wk
from timezonefinder import TimezoneFinder as tfz


def find_a_place_wikipage():

    # first input the name of a place, in English, if possible 

    town = raw_input("city, town, or village: ")

    # the wikipedia search function gets a list of all the available pages

    urls = wk.search(town)

    # the list is printed to the screen, one element at a time,
    # each element preceded by its ordinal numbers. The user can choose an
    # element or type 99 to exit 

    for x,y in enumerate(urls):
        print x,y
    print "99 to quit"
    n = 9999
    while n not in range(len(urls)):
        n = int (raw_input("select a link : "))
        if (n==99):
            sys.exit()
    # the choosen page is returned to the caller
    return urls[n]

Questa funzione cerca di inviduare la pagina corrispondente alla città che cerchiamo. Nel caso non trovi una voce che ci sembra quella corretta, perchè per esempio cerchiamo Venice ma non quella italiana, magari quella in Florida o in Illinois, possiamo aggiungere queste specificazioni geografiche alla stringa di ricerca, il motore di ricerca punterà con maggiore facilità alla voce giusta.

La seconda funzione è quella che gestisce il recupero dei dati dalla pagina che abbiamo individuato. E' abbastanza semplice e commentata, per cui ve la lascio esaminare senza ulteriori discussioni.

def get_coordinates(location):

    # location is given by the caller
    base_url = 'https://en.wikipedia.org/wiki/'

    # a complete url is formed
    url = base_url + location

    # a page request is sent, if HTTP request is successful
    # then the procedure goes on, else is stopped
    page = requests.get(url)
    if page.status_code == requests.codes.ok:
        # the html text is retrieved
        b = page.text
        pattern = '(wgCoordinates":{"lat":)([+-]?\d*\.?\d*)(,"lon":)([+-]?\d*\.?\d*)'
        m = re.search(pattern, b) 
        # a regular expression is compared to the text
        # if successful, the coordinates are extracted and converted to float
        if m:
            latitudine = float(m.group(2))
            longitudine = float(m.group(4))
            # timezonefinder is used to precisely locate the related timezone
            tf = tfz()
            timezone = tf.timezone_at(lat=latitudine, lng=longitudine)
            # all three results are returned back to the caller as a tuple
            return (latitudine, longitudine, timezone)
        else:
            # unsuccessful operation  
            print"not found, sorry"    
            return None
    else:
        # error in HTTP request 
        print "requests error"
        return None

Per finire qualche riga di codice per eseguire in serie le due funzioni.

if __name__ == '__main__':
    location = find_a_place_wikipage()
    result = get_coordinates(location)
    if result:
        lat, lon, timezone = result
        print "latitude {0} longitude {1} timezone {2} ".format(lat, lon, timezone) 

Bene, facciamo qualche prova.

Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> 
========= RESTART: /home/ubuntu/Scrivania/proveStroBlog/cityurls.py =========
città: Roma
0 Roma
1 Representation oligonucleotide microarray analysis
2 A.S. Roma
3 Roma (mythology)
4 Ruska Roma
5 Roma, Queensland
6 Servitka Roma
7 Atletico Roma F.C.
8 Colonia Roma
9 Town of Roma
99 to quit
select a link : 0
not found, sorry
>>> 
========= RESTART: /home/ubuntu/Scrivania/proveStroBlog/cityurls.py =========
città: Rome
0 Rome
1 Rome, Georgia
2 Founding of Rome
3 History of Rome
4 Rome (TV series)
5 Rome Prize
6 Third Rome
7 Diocese of Rome
8 Sack of Rome
9 Province of Rome
99 to quit
select a link : 0
latitude 41.9 longitude 12.5 timezone Europe/Rome 
>>> 

Come potete vedere, ho inserito il nome di città nella dicitura italiana, ma sulla wikipedia in lingua inglese non trova niente. Una volta inserito il nome inglese, tutto fila liscio.

Un'altra prova:

Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> 
========= RESTART: /home/ubuntu/Scrivania/proveStroBlog/cityurls.py =========
città: moscow
0 Moscow
1 MoSCoW method
2 Moscow, Idaho
3 Moscow Metro
4 FC Moscow
5 Administrative divisions of Moscow
6 Moscow Conservatory
7 Mayor of Moscow
8 Grand Duchy of Moscow
9 Moscow Time
99 to quit
select a link : 0
latitude 55.75 longitude 37.6166666667 timezone Europe/Moscow 
>>> 

Notate che c'è una Moscow anche nell'Idaho, USA. Se selezionassi quel link avrei questo risultato:

Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> 
========= RESTART: /home/ubuntu/Scrivania/proveStroBlog/cityurls.py =========
città: moscow
0 Moscow
1 MoSCoW method
2 Moscow, Idaho
3 Moscow Metro
4 FC Moscow
5 Administrative divisions of Moscow
6 Moscow Conservatory
7 Mayor of Moscow
8 Moscow Time
9 Grand Duchy of Moscow
99 to quit
select a link : 2
latitude 46.73 longitude -117.0 timezone America/Los_Angeles 
>>> 

Facciamo direttamente la ricerca di Paris, Texas per vedere come se la cava.

Python 2.7.13 (default, Jan 19 2017, 14:48:08) 
[GCC 6.3.0 20170118] on linux2
Type "copyright", "credits" or "license()" for more information.
>>> 
========= RESTART: /home/ubuntu/Scrivania/proveStroBlog/cityurls.py =========
città: paris texas
0 Paris, Texas
1 Paris, Texas (film)
2 Paris, Texas (band)
3 Lamar County, Texas
4 Paris Independent School District
5 Paris, Texas (disambiguation)
6 The Paris News
7 Paris (disambiguation)
8 Eiffel Tower (Paris, Texas)
9 First Church of Christ, Scientist (Paris, Texas)
99 to quit
select a link : 0
latitude 33.662508 longitude -95.547692 timezone America/Chicago 
>>> 

Mi sembra che funzioni benino. A questo punto penso che abbiamo un po' di materiale per andare oltre e iniziare a parlare della domificazione. A fra un po'.

Sunday, June 11, 2017

Il qui e ora in astrologia

Ogni volta che osserviamo l'ora nel nostro orologio, per qualunque necessità, astrologia compresa, dobbiamo essere consapevoli che l'ora non viene generata nè misurata dal nostro orologio. Tutto quello che l'orologio sa fare, con metodo meccanico o usando un oscillatore al quarzo, è generare eventi periodici.

Quando parliamo di ora civile facciamo riferimento ad accordi e convenzioni che discendono da fenomeni geografici e astronomici, ma anche da scelte amministrative e politiche.

Se osserviamo un orologio in Italia, l'ora che leggiamo è unica in tutto l'ambito territoriale nazionale italiano, ed è adottata anche da un certo numero di altri Paesi che, da Nord a Sud, dalla Norvegia in Nord Europa alla Namibia in Africa, condividono, all'incirca, la nostra posizione a est rispetto ad un meridiano di riferimento, come diciamo comunemente, hanno il nostro stesso fuso orario. I Peasi con estensione territoriale maggiore, come gli Stati Uniti, la Russia e la Cina, non possono che adottare più fusi orari e quindi ore diverse nei diversi territori che li compongono. Per poter viaggiare da un Paese all'altro, nello stesso fuso orario, dobbiamo inoltre tener conto delle regole associate all'ora estiva, che possono cambiare da Paese a Paese.

L'appartenenza ad un fuso orario piuttosto che all'altro genera strani effetti. Spagna e Norvegia adottano il fuso orario dell'Europa Centrale, con un disallineamento rispetto alla posizione del Sole, in ritardo e rispettivamente in anticipo, che ha ripercussioni sulla percezione della distribuzione della luce del giorno in questi paesi. Con un'escursione da 8° Ovest a 23° Est, anche se l'orologio indica la stessa ora, ci sono due ore di differenza nella percezione, per esempio, del sorgere e tramonto del Sole, anche alla stessa latitudine.

Per usare l'ora in Astrologia è pertanto necessario riportarla alla sua fondamentale natura di tempo locale, allineato con la reale posizione del Sole per un dato luogo. Quindi l'ora dell'alba, del mezzogiorno, del tramonto e della mezzanotte astrologici sono ricalcolati rispetto all'ora convenzionale per riportare la rappresentazione dell'ora alla sua fondamentale realtà geografica e astronomica. Per fare questo, tienamo conto della longitudine e della latitudine geografica. Vediamo in breve come fare, visto che siamo programmatori, partendo dall'ora segnata dal nostro PC.

Ora del computer

La scheda madre del vostro computer è dotata di circuiti elettronici oscillanti, che riproducono con buona precisione lo scorrere del tempo e, di conseguenza, della rappresentazione dell'ora nel computer. Si imposta nel BIOS, il sistema operativo di base del computer, e rimane stabile salvo che non ci sia la sincronizzazione con un server remoto, o server NTP. In tal caso l'orologio del PC, anche a livello di BIOS, viene sincronizzato con il server remoto.

Ora civile

Il vostro PC riconosce l'ora standard del Paese in cui vi trovate, il cosiddetto locale che è fondamentalmente riconducibile alla timezone della vostra località geografica. Se installate una qualsiasi distribuzione Linux, durante l'installazione vi viene chiesta la conferma della timezone individuata automaticamente (di solito per l'Italia compare Europe/Rome ma qualche volta mi è successo di leggere Europe/Vatican City. L'elenco completo delle timezone è contenuto nel PC, compilato da quello che, in onore del suo primo curatore, viene chiamato Olson database. Se ne volete un esempio e avete, come me, una Debian o una Ubuntu, aprite un terminale e provate a digitare tzselect . Se provo a seguire le istruzioni, viene fuori questo dialogo:

ubuntu@ubuntu:~$ tzselect
Please identify a location so that time zone rules can be set correctly.
Please select a continent, ocean, "coord", or "TZ".
 1) Africa
 2) Americas
 3) Antarctica
 4) Asia
 5) Atlantic Ocean
 6) Australia
 7) Europe
 8) Indian Ocean
 9) Pacific Ocean
10) coord - I want to use geographical coordinates.
11) TZ - I want to specify the time zone using the Posix TZ format.
#? 4
Please select a country whose clocks agree with yours.
 1) Afghanistan    18) Israel      35) Palestine
 2) Armenia    19) Japan      36) Philippines
 3) Azerbaijan    20) Jordan      37) Qatar
 4) Bahrain    21) Kazakhstan     38) Russia
 5) Bangladesh    22) Korea (North)     39) Saudi Arabia
 6) Bhutan    23) Korea (South)     40) Singapore
 7) Brunei    24) Kuwait      41) Sri Lanka
 8) Cambodia    25) Kyrgyzstan     42) Syria
 9) China    26) Laos      43) Taiwan
10) Cyprus    27) Lebanon      44) Tajikistan
11) East Timor    28) Macau      45) Thailand
12) Georgia    29) Malaysia      46) Turkmenistan
13) Hong Kong    30) Mongolia      47) United Arab Emirates
14) India    31) Myanmar (Burma)     48) Uzbekistan
15) Indonesia    32) Nepal      49) Vietnam
16) Iran    33) Oman      50) Yemen
17) Iraq    34) Pakistan
#? 9
Please select one of the following time zone regions.
1) Beijing Time
2) Xinjiang Time
#? 1

The following information has been given:

 China
 Beijing Time

Therefore TZ='Asia/Shanghai' will be used.
Local time is now: Sun Jun 11 17:03:24 CST 2017.
Universal Time is now: Sun Jun 11 09:03:24 UTC 2017.
Is the above information OK?
1) Yes
2) No
#? 

Come si vede dal dialogo, io posso benissimo fingere di trovarmi a Beijiing in Cina, il sistema operativo non discute. Quello che mi interessa di più, pero', non è l'ora cinese ma quella che viene riportata come Universal Time, che, guarda caso, oggi che siamo in piena ora estiva, è esattamente due ore prima di quella del mio ufficio. L'Universal Time è quello che ci serve, in prima istanza, per calcolare l'ora dell'oroscopo.

UTC o Universal Coordinated Time

UTC non è un vero acronimo, ma una sintesi fra definizioni in lingua inglese e francese. Rappresenta l'ora di riferimento e viene ottenuto correggendo il TAI (Tempo Atomico Universale), ottenuto dalla misura delle oscillazioni dell'atomo di Cesio 133 in diversi orologi atomici in giro per il mondo, mediante una correzione periodica.

Da metà Ottocento fino al 1 gennaio 1972 si è utilizzato il meridiano di Greenwich (Regno Unito) come l'origine dei meridiani (meridiano 0) e l'ora corrispondente, misurata come tempo solare medio, veniva chiamata Greenwich Medium Time (GMT). In pratica doveva rappresentare il momento della massima elevazione solare sull'orizzonte, che necessitava tuttavia di una correzione fino a 16 minuti (equazione del tempo). L'ora così definita veniva contata a partire dalla mezzanotte (è stata rinominata per accordo comune come UT1 o tempo universale). L'UTC che abbiamo citato prima è molto vicino al valore di UT1 ma necessita di una correzione prevedibile ma non calcolabile esattamente che si chiama DUT1 e viene dichiarata dall'IERS (International Earth Rotation and Reference Systems Service) in un bollettino periodico che si trova anche sul web.

In pratica, indipendentemente dalla complessità delle operazioni di rettifica e riallineamento dell'ora rispetto ai fenomeni terrestri e celesti, in astrologia usiamo, per le finalità di calcolo della domificazione, l'UTC che, come abbiamo visto, si ottiene facilmente dal nostro computer o dalle librerie dei principali linguaggi, compreso Python che è il linguaggio che ho assunto come riferimento.

Ora locale

Arriviamo quindi finalmente a calcolare un'ora del giorno che sia congruente con la nostra longitudine terrestre. L'operazione, semplicissima, consiste nell'ottenere la longitudine del luogo per cui redigiamo la carta natale, convertirla in ore e sommarla all'UTC se siamo a longitudine EST, sottrarla se siamo a OVEST.

Facciamo un esempio:

Ho sbagliato percorso e mi ritrovo a girare per le strade di Mumbay. Il mio orologio portato dall'Italia segna le 8.15, ma si schiatta del caldo e credo, data la posizione del Sole, che siamo più vicini a mezzogiorno di quanto il mio orologio possa pensare. So che Mumbay si trova a 72.825833333333 di longitudine est e voglio calcolare che ora sarebbe se non ci fosse un'ora standard e dovessi basarmi su un'ora calcolata per il luogo.

Presto fatto: in Italia è estate e ci sono due ore di differenza rispetto all'UTC, quindi posso calcolare un UTC=6.15. La longitudine di Mumbay, calcolata in ore, è 72.82 ecc / 15, considerando 15 gradi corrispondenti a un'ora di orologio. Bene, questo significa che devo aggiungere 4.8550 ore (4h 51' 18") all'UTC per avere l'ora locale di Mumbay.

Quindi:

8.15 ora estiva italiana - 2 ore 6.15 UTC + 4 ore 51 m 11.06 ora locale di Mumbay

In realtà Mumbay usa l'UTC+5:30 che mi darebbe un'ora civile di 11:45, estesa a tutto il fuso orario di riferimento.

Se fossi a Kolkata (Calcutta) l'orologio indicherebbe sempre le 11:45, ma l'ora locale sarebbe un po' diversa, considerata la longitudine (88°22' cioè +5 ore 53'), quindi sarebbero le 6.15+5.53 = 12.09. La differenza di circa 15 gradi in longitudine si esprime, come prevedibile, in circa un'ora di differenza nell'ora locale, a parità di ora civile

.

Spero che questa breve digressione sull'ora e il luogo sia stata di qualche utilità. Nel prossimo post parleremo di domificazione, cioè di rappresentazione di una rappresentazione della suddivisione del cerchio zodiacale alternativa allo zodiaco, e fondamentale per la centratura dell'oroscopo rispetto alla reale posizione del Sole sull'orizzonte locale. A presto.

Tuesday, June 6, 2017

E' tempo di ricominciare

Due anni di pausa per un blog sono tanti, e non sono passati per mancanza di interesse, quanto per la necessità di esplorare altri aspetti della programmazione e dei software disponibili per il calcolo astronomico che possono risultare utili anche ad un astrologo dilettante come me. Non sono un astrologo professionista, per cui mi limito a trattare di aspetti tecnici del calcolo, rinviando eventuali discussioni di merito sull'astrologia in sè come arte esplorativa del mondo ad un futuro non ancora precisato.

Per fare un po' il punto, prima di riprendere a trattare i temi del software astrologico, desidero riprendere da dove ero arrivato e, possibilmente, andare oltre.

Negli ultimi anni è esploso il mercato consumer degli smartphone e dei single board computer, di cui le schede Raspberry PI sono l'esempio più interessante, per il gran numero di elementi venduti. Rispetto ai classici computer desktop, questi dispositivi presentano dei vantaggi (gli smartphone e i tablet sono portabili ovunque, le SBC sono dispositivi di bassissimo consumo energetico, tanto da poter rimanere accese 24 ore senza gravare sulla bolletta elettrica) e dei potenziali inconvenienti (il linguaggio Python, che ho usato fino all'ultimo post, è scarsamente implementato sugli smartphone, in cui non gira nativamente e soprattutto non usa le librerie grafiche proprie dei sistemi operativi android e IOS, dovendosi quindi, per un buon risultato finale e una buona usabilità, usare i linguaggi propri di questi sistemi operativi (Java e Objective C), la Raspberry PI è invece basata su processore ARM, quindi la compilazione di codice deve considerare la particolarità della piattaforma). In margine alle mie sperimentazioni in Python su ambiente desktop, avro' ogni tanto occasione di parlare di come riesco a implementare funzioni e programmi anche in questi differenti ambienti operativi.

Ritorno un attimo sul tema delle librerie di alta precisione. Dopo aver tentato di implementare le VSOP2013 in ambiente Python e aver discusso delle difficoltà di usare Python per avere una efficienza elevata quando i termini da sommare sono migliaia, ho definitivamente rinunciato a quest'idea. In realtà ho visto ben poche implementazioni di queste librerie, mentre ho constatato che gran parte degli sviluppi del software vanno in altre direzioni. In particolare al posto dell'approccio analitico classico, basato sulle equazioni del moto dei corpi celesti, con cui ho elaborato alcuni software nei post più vecchi di questo blog, si è progressivamente affermata una metodologia basata sull'uso di effemeridi precompilate, la cui interpolazione con metodi numerici produce soluzioni della posizione dei pianeti e dei satelliti che non sono altrimenti risolvibili con le metodologie tradizionali. Non sono da considerare una novità, in quanto le prime effemeridi, elaborate per supportare le prime missioni spaziali, risalgono alla fine degli anni '60.

In questa pagina di Wikipedia è riassunta la storia delle JPL ephemeris. La versione de436t che è la più recente alla data attuale, copre un tempo che va dal 31 dicembre 1549 ald 25 gennaio 2650 e contiene le posizioni e le velocità del Sole, della Luna, dei pianeti da Mercurio a Plutone o dei loro baricentri. Versioni più estese nel tempo o che considerano più fattori astronomici sono presenti nel sito FTP della NASA all'indirizzo ftp://ssd.jpl.nasa.gov/pub/eph/planets/bsp/ da cui sono liberamente scaricabili. Un inconveniente serio dell'uso di queste effemeridi, rispetto all'approccio analitico classico, è la dimensione, per quelle che possono interessare un astrologo si va da un minimo di 15 mega fino ai 3.4 giga delle de431t. Di cio' dovremo tenere conto nel momento in cui decidiamo di usarle in dispositivi leggeri come smartphone e Single Board.

Oltre ai kernel elaborati dalla Caltech in California per la NASA, esistono altre autorevoli effemeridi prodotte da istituti accademici in Europa, cito quelle del progetto INPOP dell' Institut de Mecanique Celeste et des Calcul des Ephemerides (IMCCE)), che già conosciamo per le VSOP87 e 2013, e le EPM dell' Institute of Applied Astronomy of the Russian Academy of Sciences. A parte lievissime differenze, tutti questi sistemi di integrazione numerica sono sviluppati in modo coerente e presentati in formati compatibili fra loro, rendendo possibile l'utilizzo degli stessi software. Ne discuteremo ampiamente nei prossimi post.

Per riprendere in modo serio la discussione relativamente all'uso di metodologie astronomiche per la pratica astrologica, dobbiamo fermarci a considerare l'elemento tempo, che fin qui abbiamo dato per scontato. Il prossimo post sarà quindi dedicato al tema della misura del tempo in astronomia e quindi in astrologia, utilizzando fonti molto autorevoli. Alla prossima.

How to create a virtual linux machine with qemu under Debian or Ubuntu with near native graphics performance

It's been a long time since my latest post. I know, I'm lazy. But every now and then I like to publish something that other people c...